前幾天一直在忙乎著研究和閱讀XUL和FF的Extension相關資料,今天突然發現,我要做得事情似乎不是用Extension來實現的。因為原來的應用是一個ActiveX,網頁會將一些參數通過ActiveX控件傳遞進來,而ActiveX接到這些參數以后,會和服務器進行一些數據交互,最后調起本地的執行程序。似乎我走了一些彎路,方向不對。我要做得事情應該是編寫一個Plugin,而非Extension。
及時修正了下一步的研究計劃,那么就讓我們先來編譯和測試Mozilla提供的一個小例子吧。原文連接在這里:
https://developer.mozilla.org/En/Compiling_The_npruntime_Sample_Plugin_in_Visual_Studio。文章中是以VS2003舉例,我這里以VC6來進行測試,并且將步驟中需要注意的地方特別說明了一下。
1、先到這里下載相關源碼:http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/。不知道為什么Mozilla只提供了頁面形式,沒有打個包,害得我得一個個文件下載和保存,郁悶。
2、在VC6中新建一個Win32 Dynamic-Link Library工程,取名“nprt”。注意:建議工程以小寫np開頭,并且長度不超過8個字符,這樣以后就會省事很多。
3、下一步,選擇“An empty DLL project”,然后“Finish”。
4、將剛才下載的源碼添加到工程中來。test.html不用添加,nprt.def建議也添加進來。
5、現在還不能編譯,否則會出很多錯誤。打開Project Settings,轉到C/C++標簽頁,在Category中選擇Preprocessor,在Preprocessor Definitions中最后面添加:,XP_WIN32,MOZILLA_STRICT_API,XPCOM_GLUE,XP_WIN,_X86_。注:如果你使用VS 2005,需要添加全部的定義:WIN32;_WINDOWS;NPRT_EXPORTS;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE;XP_WIN;_X86_
6、在Additional include directories下面添加XULRunner SDK的include路徑,可以是絕對路徑,也可以是相對路徑,看你當初怎么解壓的了。例如:..\..\xulrunner-sdk\include
7、在Category中選擇Precompiled Headers,選擇Not using precompiled headers,OK,關閉Project Settings對話框。打開npp_gate.cpp,將下面的代碼注釋掉:
jref NPP_GetJavaClass (void)
{
return NULL;
}
8、編譯!……我靠,有錯:Fatal error C1083: Cannot open include file: 'npapi.h': No such file or directory。我可是嚴格按照教程上面寫的去做得啊。
9、在xulrunner-sdk目錄下搜索了一下npapi.h,原來在xulrunner-sdk\sdk\include下面,這好辦,多加一條包含路徑不就歐了?仿照第6步,添加該目錄;
10、編譯!OK,過了。
11、到輸出目錄下將nprt.dll復制到FF安裝目錄的plugins目錄下,例如:C:\Program Files\Mozilla Firefox\plugins\
12、如果此時FF開著也沒關系,不用關(這點很不錯)。在地址欄鍵入about:plugins,看看是不是有一個npruntime scriptable example plugin,如果有,那就表示歐了,FF認出了我們的插件;
13、在FF中打開test.html,嗯?怎么還提示安裝缺失插件?用EditPlus打開test.html,噢,原來有這么一句:<embed type="application/x-java-mozilla-npruntime-scriptable-plugin" style="display: block; width: 50%; height: 100px;">。因為我們剛才沒有添加名字為x-java-mozilla-npruntime-scriptable-plugin的插件,所以當然認不出來啦。
14、隨便點一下頁面上的按鈕,看看簡單的交互行為。
OK,第一個例子還算順利,比想象中的要順利。下面就該研究一下代碼了,看看FF的插件和ActiveX的區別到底有多大。
附一些參考資料:
http://xinsync.xju.edu.cn/index.php/archives/2124
http://mqjing.blogspot.com/2008/09/plugin-firefox-plugin.html