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对象的事件.
一般情况是这样的:
一个进程 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.
就说这么多,我表达能力不行,看懂的来拍砖吧,希望能讨论出一个更好的模型.
如果是设计的时候,引用一下,然后用new方法,也会有"激发"(还是听惯了触发)反应
CreateObject的对象DLLB里不再包含事件,全部转移到DLLC中,DLLB引用DLLC,而且由DLLB来触发事件.
可惜,DLLC无法把这个事件传给引用它的进程PrjA.exe
http://blog.csdn.net/sonic_andy/archive/2009/09/04/4520931.aspx
不过没关系,实际上可以通过接口来实现相同的功能.
也就是预先定义一个接口,让客户端实现,服务端直接调用这个接口中的方法即可
这个接口可以放在tlb中
这就是为什么createobject无法实现事件的原因.关于事件的实现方法,vb是以自己构造调用点实现的,总的来说,就象一个事件表,而这个事件表是vb自动编译进去的... 而且是非公共方法..................不过貌似这个东西好像和MFC的事件发生器类是一样的
问题是不能引用prjYYYYY啊,所以不能定义 dim withevents XX as YYYYYYY
在DLLC(事件转发机)里定义一个相同的事件A,DLLB(事件激发者)绑定DLLC,执行完DLLB中的事件A就会执行DLLC中的事件A。但此时DLLC似乎成了事件接收者,跟调用DLLC中的函数是一样的。怎样把这个事件转给应用程序去呢?
噢 可以直接绑定到prjA.exe中的DLLC实例!绑定DLLC,DLLC接收到事件以后可以直接转给PrjA.exe!