<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    BaNg@taobao

    Just Do It!

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      20 Posts :: -1 Stories :: 202 Comments :: 0 Trackbacks
    續(xù) http://www.tkk7.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++來開發(fā)SpiderMonkey的擴(kuò)展。

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

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

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



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

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

    step 3: 完善sysinfo工程。打開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方法,用來返回當(dāng)前內(nèi)存大小字串。

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



    獲得內(nè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不靠頭文件來使用擴(kuò)展方法,它在link期間就將方法的相對地址記住了,即函數(shù)名->內(nèi)存地址映射,所以localSystem project不需要頭文件,可以將localSystem.h刪除。那localSystem怎么與DW產(chǎn)生關(guān)系呢?肯定有頭文件才行,不然沒法做開發(fā)了。打開DW安裝目錄\sample_files\Extending,將extending_dw.zip解開,把其中以mm開頭的三個(gè)頭文件拷貝到localSystem project中。打開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的問題??梢钥吹?,這兒定義了一個(gè)getMemorySize函數(shù),包含0個(gè)參數(shù)。

    step 5: 安裝。build localSystem solution,將會在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: 使用,打開PART-1所寫的hw.js,將sayHi函數(shù)修改一下:

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

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



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

    5 DW文檔操作

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

    PART-3 待續(xù)





    posted on 2009-06-18 17:02 Always BaNg. 閱讀(1373) 評論(2)  編輯  收藏 所屬分類: Java

    Feedback

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

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

    主站蜘蛛池模板: 手机在线毛片免费播放| 亚洲综合伊人久久大杳蕉| 成人精品综合免费视频| 亚洲αv久久久噜噜噜噜噜| 国产91免费在线观看| 香蕉97碰碰视频免费| 久久久婷婷五月亚洲97号色| 日韩a级毛片免费视频| 美女视频黄的免费视频网页| 亚洲一区二区三区成人网站| 亚洲熟女一区二区三区| 天堂在线免费观看中文版| 久久久久久免费一区二区三区 | 久久亚洲精品无码播放| h视频在线免费看| 9久久免费国产精品特黄| 国产v亚洲v天堂a无| 亚洲AV无码成人专区片在线观看 | 亚洲国产精品视频| 国产一卡2卡3卡4卡无卡免费视频| 在线播放国产不卡免费视频| 亚洲制服丝袜第一页| 亚洲国产精品无码一线岛国| 国产一区二区三区免费在线观看| 久久久久国产精品免费网站| 欧洲精品码一区二区三区免费看| 亚洲人成电影在线观看网| 亚洲大成色www永久网站| 免费一级一片一毛片| 97无码免费人妻超级碰碰碰碰 | 亚洲精品和日本精品| 免费的一级片网站| 日本三级2019在线观看免费| 日韩精品无码免费专区午夜不卡| 色婷婷精品免费视频| 亚洲日韩精品无码AV海量| 亚洲成在人线电影天堂色| 亚洲AV无码精品色午夜果冻不卡 | 一级中文字幕免费乱码专区 | 特级一级毛片免费看| 亚洲人成小说网站色|