vb6 createobject

场景:突然想到的:VB6 CreateObject间接激发事件,该如何处理

突然想到的:VB6 CreateObject间接激发事件
VB中CreateObject的对象无法激发事件,相信很多人都为此头疼过.查过很多资料,都没想到好的办法.
今天想到一个好办法可以间接激发CreateObject对象的事件.
一般情况是这样的:
一个进程 prjA.exe,用CreateObject方式调用 DllB.dll,但是无法激发DLLb.dll中的事件(至少我还没找到直接的方法),我的办法是,再增加一个DLLC,类型为DLL或ActiveX EXE,用它来转发DLLb.dll中的事件.
前提条件是 PrjA.exe,DLLb.dll和DllC都是自己编写的.只需PrjA.exe和DllB.dll都引用DLLC,在DLLB中调用DLLC中相对应的事件激发函数,并将参数传递给DLLC,在DLLC中进行一些处理,接着由DLLC激发事件,转发给PrjA.exe.

适用情况:尤其适用于插件式系统.比如说DLLb.dll是自己程序的扩展插件模块,即DLLb.dll是实现程序中IA接口的一个插件,在这样的插件式的系统中,只能用CreateObject来调用插件,若要激发DLLB.DLL中的事件此时只需加入DLLC来转发给主程序即可.

优点:不用说,DLLB.DLL中的事件终于可以发出来了.其次,把DLLC作为一个ActiveX EXE,即相当于一个进程之外的事件发动机,这样的系统工作更有层次,而且在主进程外,效率会更高.

缺点:多了一个用于转发的DLLC.


就说这么多,我表达能力不行,看懂的来拍砖吧,希望能讨论出一个更好的模型.

------解决方案--------------------
不怕有错误,有思路就好
------解决方案--------------------
纯 CreateObject 创建的对象想实现非 vtable 绑定的事件方式,简直不可能,
这就是为什么createobject无法实现事件的原因.

关于事件的实现方法,vb是以自己构造调用点实现的,总的来说,就象一个事件表,而这个事件表是vb自动编译进去的... 而且是非公共方法..................不过貌似这个东西好像和MFC的事件发生器类是一样的



------解决方案--------------------
探讨
纯 CreateObject 创建的对象想实现非 vtable 绑定的事件方式,简直不可能,
这就是为什么createobject无法实现事件的原因.

关于事件的实现方法,vb是以自己构造调用点实现的,总的来说,就象一个事件表,而这个事件表是vb自动编译进去的... 而且是非公共方法..................不过貌似这个东西好像和MFC的事件发生器类是一样的




------解决方案--------------------
这是我以前的办法:

http://www.m5home.com/blog/article.asp?id=207

但是后来被人提了一下......发现......这是脱了裤子放P

你直接在EXE里dim withevents XX as YYYYYYY就行了

然后在初始化时set XX = createobject("prjYYYYY.YYYYYYY")就行了....

而且这样还能判断这个组件是否正常注册了.....
------解决方案--------------------
为什么不能引用.

引用了,即使组件不存在,其接口还是被VB编译进去了

只要你还未对对象进行使用,就不会出错.

我之前也是以为引用了,如果组件不存在一定会出错,所以才去折腾TLB的方案.....
------解决方案--------------------
首先,一般的COM对象的事件可以通过IConnectionPoint等接口查询,但是这么做有些繁琐。

其次,楼主的想法是好的,但其实写一个中间dll,与你事先定义好接口是殊途同归的。

因为,无论是写中间dll转发,或是通过引用TLB、已成型的com组件等触发事件,其原理都是要通过一个已知的接口来实现事件的触发流程。