在WTL中通過IDL實現IDispatch

一直用WTL開發界面,但從來沒有過在WTL中添加IDL並實現IDispatch,剛好遇到了這個問題,困惑了一個下午,終於想明白了。

我的需求是:
1.一個exe,實現一個對話框,其中嵌入一個WebBrowser,用於訪問網頁;
2.在網頁中調用WebBrowser中的接口方法,比如說在網頁中點擊了“關閉”按鈕,外框就需要能響應到,並最終關閉對話框。

實現起來也很簡單,關鍵點是實現一個IDispatch接口,然後用SetExternalDispatch把接口設置到控件中,這樣就可以直接在網頁上通過js調用
SetExternalDispatch.xxx來調用到剛剛設置進來的IDispatch接口的xxx方法。

由於我是在wtl工程中,沒有IDL,自然也沒有嚮導,所以我自己實現了一個IDispatch的接口方法。
這樣實現是沒問題了,但有個很麻煩的是每次添加一個方法,我需要在"GetIDsOfNames"和“Invoke”中分別修改,重複勞動量太大,
於是我想要是能添加一個IDL竟然然後再用嚮導來添加方法,這樣多麼的愜意:)

可惜,事情並沒有我想的那麼簡單。

1.WTL嚮導生成的_Modele是一個CAppModule,這和ATL工程生成的CAtlExeModule是不一樣的。
由於兩個類都可以看到源碼,所以做得事情都很清楚:
1-1.CAppModule中實現了WTL的消息循環封裝
1-2.CAtlExeModule實現了COM接口註冊和一個默認的消息循環
這兩個Module可能可以混用,但單從各自中都有一個消息循環這一點來看,這兩個Module應該是不建議同時使用。我之前也有在Atl的工程中使用WTL,但並沒有保留WTL的Module,而是自接使用了ATL的Module,這個問題要試試才知道。

2.要使用IDL和ATL的嚮導來添加接口,必須依賴於TypeLib,而這個是是需要調用CAtlExeModule的/regserver命令行來實現註冊,否則這個使用這個接口時會提示“庫文件沒有註冊”。

鑑於以上兩點,本來一個很簡單的界面程序,在實現了以上兩個之後將變得莫名的複雜,最終我放棄了這個思路。

想用嚮導是要付出代價的

這事情還沒完,待續……

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