BaNg@taobao

          Just Do It!

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            20 Posts :: -1 Stories :: 202 Comments :: 0 Trackbacks
          續(xù) http://www.aygfsteel.com/lifesting/archive/2009/06/17/267958.html

          下載此例子 

          4 第一個(gè)底層extension

          DW采用SpiderMonkey作為Javascript解析器,這是一個(gè)C解析器,這意味著如果要在javascript中使用一些系統(tǒng)相關(guān)的東西,比如獲得當(dāng)前系統(tǒng)信息如CPU頻率,內(nèi)存大小等,必須使用借助C/C++來(lái)開(kāi)發(fā)SpiderMonkey的擴(kuò)展。

          DW針對(duì)SpiderMonkey做了一個(gè)封裝,我們沒(méi)法知道怎么封裝的,只能使用它提供給我們的API來(lái)編寫(xiě)底層Extension,本節(jié)將以獲得一個(gè)當(dāng)前系統(tǒng)內(nèi)存大小字串為例講述這個(gè)開(kāi)發(fā)過(guò)程。它將為javascript注入一個(gè)localSystem 對(duì)象(為簡(jiǎn)單,該對(duì)象只提供一個(gè)方法 getMemorySize)

          本節(jié)假設(shè)你機(jī)器上安裝有VC開(kāi)發(fā)工具,且熟悉C/C++一些基本概念。我目前使用的是vs 2008,其它版本類(lèi)似。

          step 1: 創(chuàng)建一個(gè)名為localSystem的dll工程,new project->visual c++->win32->win32 console application,在applicaton setting上將application type設(shè)置為dll,并鉤上"exports symbols",如下圖



          一般對(duì)于擴(kuò)展來(lái)說(shuō),擴(kuò)展里面的dll只包含方法代理,具體的實(shí)現(xiàn)需要借助其它dll/lib來(lái)完成,這很好理解,因?yàn)閿U(kuò)展dll與dreamweaver綁定在一起,如果我們把獲得內(nèi)存大小的方法實(shí)現(xiàn)放在擴(kuò)展dll里,那么就其它比如MFC/CPP等應(yīng)用就不能復(fù)用。所以,為把這個(gè)例子演示的更像一個(gè)產(chǎn)品,會(huì)在這個(gè)solution里面再創(chuàng)建一個(gè)dll,這是一個(gè)純粹的win32 dll。

          step 2: 如同step 1在localSystem solution下新建一個(gè)名為sysinfo的dll工程。完成之后,solution將會(huì)有兩個(gè)dll 工程,其中l(wèi)ocalSystem為DW使用,它依賴(lài)于sysinfo工程。針對(duì)這種依賴(lài)關(guān)系,需要設(shè)置三個(gè)地方。
          a)打開(kāi)localSystem project屬性設(shè)置頁(yè)面,common properties->add new references,將sysinfo設(shè)置為localSystem的reference項(xiàng)目
          b)打開(kāi)localSystem project屬性設(shè)置頁(yè)面,configuration properties->c/c++->general->additional include directories,將sysinfo目錄加上
          c)打開(kāi)localSystem project屬性設(shè)置頁(yè)面,configuration properties->linker,在general->additonl library directories加上sysinfo的輸出路徑,并且在input->additional dependencies上加上sysinfo.lib

          step 3: 完善sysinfo工程。打開(kāi)sysinfo工程下的sysinfo.h文件,替換如下:

          #ifdef SYSINFO_EXPORTS
          #define SYSINFO_API __declspec(dllexport)
          #else
          #define SYSINFO_API __declspec(dllimport)
          #endif

          #ifdef __cplusplus
          extern "C" {
          #endif
          SYSINFO_API 
          void sysMemSize(char*int);
          #ifdef __cplusplus
          }
          #endif

          可以看到,這兒定義了一個(gè)sysMemSize方法,用來(lái)返回當(dāng)前內(nèi)存大小字串。

          因?yàn)镈W擴(kuò)展只支持C代碼,不支持C++,所以需要使用extern "C,同時(shí)為了避免范錯(cuò)誤,需要把localSystem project設(shè)置為C代碼輸出,如下圖:



          獲得內(nèi)存大小的方法很簡(jiǎn)單,打開(kāi)sysinfo.cpp,替換如下:

           1 #include "stdafx.h"
           2 #include "sysinfo.h"
           3 
           4 #include <string.h>
           5 #include <stdio.h>
           6 
           7 SYSINFO_API void sysMemSize(char *str, int sz)
           8 {
           9 
          10     MEMORYSTATUS ms;
          11     GlobalMemoryStatus(&ms);
          12 
          13     char vl[5][5= {"B""KB""MB""GB""TB" };
          14 
          15     double tm = ms.dwTotalPhys + 655360;
          16 
          17     int n = 0;
          18 
          19     while (tm > 1000){
          20         tm /= 1024;
          21         n++;
          22     }
          23 
          24     sprintf_s(str,sz,"%.2f %s",tm,vl[n]);
          25 }

          step-4:完善localSystem project。DW不靠頭文件來(lái)使用擴(kuò)展方法,它在link期間就將方法的相對(duì)地址記住了,即函數(shù)名->內(nèi)存地址映射,所以localSystem project不需要頭文件,可以將localSystem.h刪除。那localSystem怎么與DW產(chǎn)生關(guān)系呢?肯定有頭文件才行,不然沒(méi)法做開(kāi)發(fā)了。打開(kāi)DW安裝目錄\sample_files\Extending,將extending_dw.zip解開(kāi),把其中以mm開(kāi)頭的三個(gè)頭文件拷貝到localSystem project中。打開(kāi)localSystem.cpp,替換成為如下代碼:

          #include "stdafx.h"

          #include 
          "mm_jsapi.h"
          #include 
          <string.h>
          #include 
          "sysinfo.h"

          #define MEM_LEN 50

          JSBool jsMemorySize(JSContext 
          *cx, JSObject *obj, unsigned int argc, jsval *argv, jsval *rval)
          {

              
          char mem_str[MEM_LEN];
              memset(mem_str,
          '\0',MEM_LEN);
              sysMemSize(mem_str,MEM_LEN);
              JS_StringToValue(cx,mem_str,strlen(mem_str),rval);
              
          return JS_TRUE;
          }

          MM_STATE

          void
          MM_Init()
          {
              JS_DefineFunction(
          "getMemorySize", jsMemorySize, 0);
          }

          MM_STATE主要是解決Link DW的問(wèn)題。可以看到,這兒定義了一個(gè)getMemorySize函數(shù),包含0個(gè)參數(shù)。

          step 5: 安裝。build localSystem solution,將會(huì)在debug目錄下面有兩個(gè)dll,將localSystem.dll拷貝到DW安裝目錄\configuration\JSExtensions下面;將sysinfo.dll拷貝到系統(tǒng)目錄下(system/system32)或者DW安裝根目錄(根目錄下的dll好多就是跟sysinfo.dll干同樣的事情,比如xerces-c_2_7.dll xml處理,zlib解壓縮等)。一般情況我們將business dll放在DW根目錄,將extension dll放在jsextensions目錄。

          step 6: 使用,打開(kāi)PART-1所寫(xiě)的hw.js,將sayHi函數(shù)修改一下:

          function sayHi()
          {
              var mem_size 
          = localSystem.getMemorySize();
              window.alert(
          "Memory size:" + mem_size);
          }

          重新啟動(dòng)DW,點(diǎn)擊test->hello->ok 會(huì)看到如下效果:



          有了這個(gè)有力武器,你在DW中好像可以無(wú)所不能:)。

          5 DW文檔操作

          講了這么多,基本沒(méi)有交互,大多數(shù)情況下,對(duì)DW文檔(也就是我們編的html/jsp等)操作才是DW Extension重點(diǎn)關(guān)注的內(nèi)容。

          PART-3 待續(xù)





          posted on 2009-06-18 17:02 Always BaNg. 閱讀(1389) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): Java

          Feedback

          # re: Hello, dreamweaver! (PART 2) 2009-06-18 18:51 簡(jiǎn)單的牛牛
          期待~~~~期待~~~~正想研究一下呢~~~  回復(fù)  更多評(píng)論
            

          # re: Hello, dreamweaver! (PART 2) 2009-06-19 12:48 liudecai_zan@126.com
          佩服
            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 玉山县| 铜鼓县| 贵德县| 西平县| 新蔡县| 中西区| 班玛县| 十堰市| 靖边县| 贡觉县| 黄浦区| 盐边县| 新晃| 福建省| 即墨市| 定日县| 北票市| 淳安县| 桑植县| 四会市| 拜泉县| 盘山县| 北票市| 鸡东县| 五台县| 大石桥市| 鞍山市| 东城区| 汶川县| 五大连池市| 从化市| 鸡西市| 两当县| 浪卡子县| 汶川县| 大宁县| 禹州市| 包头市| 廉江市| 云南省| 锡林郭勒盟|