標籤:
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
- ; file in cab
- [Add.Code]
- test.dll=test.dll
- atl.dll=atl.dll
- ; needed DLL
- [atl.dll]
- file-win32-x86=thiscab
- FileVersion=2,00,0,7024
- DestDir=11
- RegisterServer=yes
- [test.dll]
- file-win32-x86=thiscab
- clsid={4CBBC676-507F-11D0-B98B-000000001234}
- FileVersion=1,0,0,1
- RegisterServer=yes
- ; end of INF file
把這個包和相關的控制項及其它檔案等放到一個目錄下,在命令列下使用makecab命令進行打包,之前需要準備一個.ddf檔案說明需要哪些檔案打包
[c-sharp] view plaincopy
- .OPTION EXPLICIT ;Generate errors
- .Set CabinetNameTemplate=Uploader.cab
- .Set DiskDirectoryTemplate=CDROM ;All cabinets go in a single directory
- .Set CompressionType=MSZIP ;All files are compressed in cabinet files
- .Set UniqueFiles="OFF"
- .Set Cabinet=on
- .Set DiskDirectory1=Uploader.cab
- ; file list
- Uploader.dll
- Uploader.inf
之後調用makecab /F xxx.ddf,即可獲得一個用於發布的cab檔案。
使用方法為設定codebae="<cab file url>[#version=1.0.0.1]"
結論
由於ATL的架構,極大地方便了控制項的編程,但需要熟悉基本的COM理論,並注意架構中添加代碼的步驟,否則很容易出現莫名的錯誤。
使用VC2008中ATL開發瀏覽器控制項