使用VC2008中ATL開發瀏覽器控制項

來源:互聯網
上載者:User

標籤:

http://blog.csdn.net/cnjet/article/details/6218355

 

使用VC2008中ATL開發瀏覽器控制項

 

2011.03.02

[email protected]

 

 

介紹

本文將介紹使用VC2008中的ATL開發一個用於網路部署的cab控制項包的過程。

 

 

建立ATL項目

開啟VS2008,建立一個ATL項目,如:

 

考慮到簡介性,選擇了"Allow merging of proxy/stub code"

 

添加ATL控制項

(建議先編譯一下真箇project,保證編譯成功並順利註冊了控制項)

之後添加一個ATL的控制項,注意正確的物件類型。

右鍵選擇項目“Add”->"Add Class"

 

一定要注意選擇“ATL控制項”,否則事件支援等可能會相對麻煩些,需要自己手動寫些介面代碼。選擇Add後填寫必要的控制項名稱等,進入選項介面:

這裡需要注意:如果控制項會返回給js/vbs指令碼一些訊息事件的話,必須選擇“Connection points”添加連接點支援。否則需要自己手動在idl中添加連接點介面定義等資訊;另外注意"Control type:"的選擇,如果是運行時不可見控制項或者簡單的功能控制項等,如果需要返回給js/vbs一些訊息事件的話,必須實現IProvideClassInfo2和IProvideClassInfo,此時最好選擇Standard control並在後面選擇實現,否則的話可以使用Minimal control。

"Next>"出現需要實現的介面對話方塊,可以根據需要選擇,如果返回指令碼事件的,至少要實現IProvideClassInfo2介面,如下:

至此,一個ATL控制項就建立完成了。建議編譯下項目,保證連結成功並正確註冊控制項。

添加控制項屬性和方法

在“Class view”中添加控制項支援的屬性和方法。

例如:

具體可以根據需要操作,這裡不詳述細節。建議編譯下保證正確性。

 

添加指令碼響應事件

添加事件函數的方法類似於為控制項添加函數,不過針對的介面為XXXLib下的_IXXXEvent,如下:

如果出現HTML網頁中事件響應不成功,必須保證上面提到一些設定正確,可以手動檢查下必要的介面是否實現。

這之後就可以在實作類別CXXXX上添加connection point來方便控制項內向外發送事件了。具體如:

注意:需要一定不要錯誤選擇"Implement Interface"並實現事件介面;

之後控制項實作類別中就可以調用Fire_XXX來發送事件調用了。

 

至此,控制項就正確實現了,可以使用項目自動產生的.htm檔案測試控制項的各個介面是否正常工作。

 

另外:所有的Fire_xxx函數只能在視窗線程中執行,控制項視窗未初始化時似乎調用無效,例如FinalConstruct和FinalRelease等函數中。

 

控制項的自註冊和安全標記

如果要實現控制項可以自註冊必須在資源檔中添加

 

        BLOCK "040904e4"

        BEGIN

             ...

 

             VALUE "OLESelfRegister", "/0"

             ...

       END

 

如果要標記控制項的安全性,需要再控制項實現檔案中添加父類

class ATL_NO_VTABLE CXXXXXX :

    ...

    public IObjectSafetyImpl<CFileUploader,           INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,

    ...

 

在BEGIN_COM_MAP(CXXXXX)部分插入實現:

BEGIN_COM_MAP(CXXXXX)

   ...

   COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)

   ...

END_COM_MAP()

 

封裝為cab包及網路部署

由於一般情況下控制項會包含其它相關資源項,如附加依賴的dll或設定檔、資源檔等。所以更多的控制項以cab包形式發布。

cab包需要一個.inf說明包的資訊,一個樣本如下:

 

[c-sharp] view plaincopy 
  1. ; file in cab  
  2. [Add.Code]  
  3. test.dll=test.dll  
  4. atl.dll=atl.dll  
  5. ; needed DLL  
  6. [atl.dll]  
  7. file-win32-x86=thiscab  
  8. FileVersion=2,00,0,7024  
  9. DestDir=11  
  10. RegisterServer=yes  
  11. [test.dll]  
  12. file-win32-x86=thiscab  
  13. clsid={4CBBC676-507F-11D0-B98B-000000001234}   
  14. FileVersion=1,0,0,1   
  15. RegisterServer=yes  
  16. ; end of INF file  

 

 

把這個包和相關的控制項及其它檔案等放到一個目錄下,在命令列下使用makecab命令進行打包,之前需要準備一個.ddf檔案說明需要哪些檔案打包

 

 

[c-sharp] view plaincopy 
  1. .OPTION EXPLICIT  ;Generate errors  
  2. .Set CabinetNameTemplate=Uploader.cab  
  3. .Set DiskDirectoryTemplate=CDROM   ;All cabinets go in a single directory  
  4. .Set CompressionType=MSZIP   ;All files are compressed in cabinet files  
  5. .Set UniqueFiles="OFF"  
  6. .Set Cabinet=on  
  7. .Set DiskDirectory1=Uploader.cab  
  8. ; file list  
  9. Uploader.dll  
  10. Uploader.inf  

 

 

之後調用makecab /F xxx.ddf,即可獲得一個用於發布的cab檔案。

使用方法為設定codebae="<cab file url>[#version=1.0.0.1]"

 

結論

由於ATL的架構,極大地方便了控制項的編程,但需要熟悉基本的COM理論,並注意架構中添加代碼的步驟,否則很容易出現莫名的錯誤。

使用VC2008中ATL開發瀏覽器控制項

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.