在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命令行来实现注册,否则这个使用这个接口时会提示“库文件没有注册”。

鉴于以上两点,本来一个很简单的界面程序,在实现了以上两个之后将变得莫名的复杂,最终我放弃了这个思路。

想用向导是要付出代价的

这事情还没完,待续……

你可能感兴趣的:(在WTL中通过IDL实现IDispatch)