開發環境:VS2010
開發工程:C++ATL項目
開發目的:創建ActiveX實現js調用
步驟:
1. 創建一個ATL工程
應用程序類型選擇動態鏈接庫(DLL),勾選支持COM+1.0,勾選支持部件註冊器
2. 選擇類視圖,添加接口與類
如果沒有找到類視圖,可以在工具欄中添加上視圖
選擇工程,右鍵添加類。選擇ATL簡單對象。
輸入對象信息。
此處的ProgID需要注意,填寫之後可在js中通過new ActiveXObject(“你的progID”)創建對象。
勾選支持中的3個選項,我選擇的線程模型爲單線程,可根據實際需求修改。完成後會發現已經生成了Add.h和Add.c文件。裏面有一些紅色波浪線提示錯誤無需管。
3. 依然是類視圖中,找到對應的接口添加方法,比如我創建的簡單對象名稱爲Add,這裏我們就在IAdd節點上右鍵添加方法。
添加方法時,需要注意的是out和retval必須爲指針類型,否則不讓勾選,此處添加三個參數,其中result作爲返回值(勾選了retval的參數)。
會發現你如果勾選了一個retval後,就不會再讓你添加參數了,表示只能有一個返回值。僅僅勾選out的參數,js沒有效果,C#等可以使用這種函數的out參數。
4. 找到Add.c文件,在添加完成的函數中實現具體方法。
5. 編譯生成成功後,在工程目錄(Debug或者release)下找到AddCom.dll.
使用regsvr32 AddCom.dll命令註冊。提示註冊成功後,編寫一個html代碼測試。
6. 兩種方式創建對象。
1) 通過object標籤創建對象
- <object classid="clsid:4738A542-7AEB-4CE4-86A7-71081B8CE8DA"id="myAddObj"
- name="myAddObj " ></object>
類似於這種標籤創建的對象,可以通過js直接訪問到myAddObj對象。Classid可以在AddCom.idl文件中查找到,library中的coclass Add對應的id。
- library AddComLib
- {
- importlib("stdole2.tlb");
- [
- uuid(64EC1270-5626-4FDF-888F-41859FB35E15)
- ]
- coclassCompReg
- {
- [default]interface IComponentRegistrar;
- };
- [
- uuid(FE912C18-0CFB-4DCA-99FA-6E4BC4B07594)
- ]
- dispinterface_IAddEvents
- {
- properties:
- methods:
- };
- [
- uuid(4738A542-7AEB-4CE4-86A7-71081B8CE8DA)
- ]
- coclass Add
- {
- [default]interface IAdd;
- [default,source] dispinterface_IAddEvents;
- };
- };
2) 通過new ActiveXObject創建對象
- var myAddObj = new ActiveXObject("myAddObj.1");
myAddObj也就是在創建簡單對象時填寫的ProgID,這個可以在Add.rgs資源文件中查找到。
7. 創建完對象就可以直接調用相應的函數了,如剛纔實現的一個result = add(arg1,arg2)方法。
- var result = myAddObj.add(1,2);
- alert(result);