C++基於ATL工程編寫ActiveX控件

開發環境: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標籤創建對象

  1. <object  classid="clsid:4738A542-7AEB-4CE4-86A7-71081B8CE8DA"id="myAddObj"  
  2.   
  3.                            name="myAddObj " ></object>  


類似於這種標籤創建的對象,可以通過js直接訪問到myAddObj對象。Classid可以在AddCom.idl文件中查找到,library中的coclass Add對應的id。

  1. library AddComLib  
  2.   
  3. {  
  4.   
  5.     importlib("stdole2.tlb");  
  6.   
  7.     [  
  8.   
  9.         uuid(64EC1270-5626-4FDF-888F-41859FB35E15)       
  10.   
  11.     ]  
  12.   
  13.     coclassCompReg  
  14.   
  15.     {  
  16.   
  17.         [default]interface IComponentRegistrar;  
  18.   
  19.     };  
  20.   
  21.     [  
  22.   
  23.         uuid(FE912C18-0CFB-4DCA-99FA-6E4BC4B07594)       
  24.   
  25.     ]  
  26.   
  27.     dispinterface_IAddEvents  
  28.   
  29.     {  
  30.   
  31.         properties:  
  32.   
  33.         methods:  
  34.   
  35.     };  
  36.   
  37.     [  
  38.   
  39.         uuid(4738A542-7AEB-4CE4-86A7-71081B8CE8DA)       
  40.   
  41.     ]  
  42.   
  43.     coclass Add  
  44.   
  45.     {  
  46.   
  47.         [default]interface IAdd;  
  48.   
  49.         [default,source] dispinterface_IAddEvents;  
  50.   
  51.     };  
  52.   
  53. };  


 

2)  通過new ActiveXObject創建對象

[javascript] view plaincopyprint?
  1. var myAddObj = new ActiveXObject("myAddObj.1");  


myAddObj也就是在創建簡單對象時填寫的ProgID,這個可以在Add.rgs資源文件中查找到。

7.      創建完對象就可以直接調用相應的函數了,如剛纔實現的一個result = add(arg1,arg2)方法。

[javascript] view plaincopyprint?
  1. var result = myAddObj.add(1,2);  
  2.   
  3. alert(result);  

8.對ActiveX控件標記安全   

9.將ActiveX打包簽名CAB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章