一直用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命令行來實現註冊,否則這個使用這個接口時會提示“庫文件沒有註冊”。
鑑於以上兩點,本來一個很簡單的界面程序,在實現了以上兩個之後將變得莫名的複雜,最終我放棄了這個思路。
想用嚮導是要付出代價的
這事情還沒完,待續……