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

解决方案 »

  1.   

    错误的原因是:prjA和DLLB调用的DLLC不一样.谁有没有办法让它们调用的DLLC都一样呢?
      

  2.   

    如果是运行时CreateObject同new 方法一样,不会不触发“事件”
    如果是设计的时候,引用一下,然后用new方法,也会有"激发"(还是听惯了触发)反应
      

  3.   

    我设计的是:
    CreateObject的对象DLLB里不再包含事件,全部转移到DLLC中,DLLB引用DLLC,而且由DLLB来触发事件.
    可惜,DLLC无法把这个事件传给引用它的进程PrjA.exe
      

  4.   

    此种情况建议使用类型库(tlb),将公用接口放到类型库中,所有模块共同引用这个类型库,这个是MSDN文章中说的.参见:
    http://blog.csdn.net/sonic_andy/archive/2009/09/04/4520931.aspx
      

  5.   

    不好意思,忘了是事件了...
    不过没关系,实际上可以通过接口来实现相同的功能.
    也就是预先定义一个接口,让客户端实现,服务端直接调用这个接口中的方法即可
    这个接口可以放在tlb中
      

  6.   

    纯 CreateObject 创建的对象想实现非 vtable 绑定的事件方式,简直不可能,
    这就是为什么createobject无法实现事件的原因.关于事件的实现方法,vb是以自己构造调用点实现的,总的来说,就象一个事件表,而这个事件表是vb自动编译进去的... 而且是非公共方法..................不过貌似这个东西好像和MFC的事件发生器类是一样的
      

  7.   

    这是我以前的办法:http://www.m5home.com/blog/article.asp?id=207但是后来被人提了一下......发现......这是脱了裤子放P你直接在EXE里dim withevents XX as YYYYYYY就行了然后在初始化时set XX = createobject("prjYYYYY.YYYYYYY")就行了....而且这样还能判断这个组件是否正常注册了.....
      

  8.   


    问题是不能引用prjYYYYY啊,所以不能定义 dim withevents XX as YYYYYYY
      

  9.   

    为什么不能引用.引用了,即使组件不存在,其接口还是被VB编译进去了只要你还未对对象进行使用,就不会出错.我之前也是以为引用了,如果组件不存在一定会出错,所以才去折腾TLB的方案.....
      

  10.   

    现在prjYYYYY.YYYYYYY只是继承IPrj接口的N个类中的一个,一个插件而已,还是未知的,怎么能事先就引用呢
      

  11.   

    首先,一般的COM对象的事件可以通过IConnectionPoint等接口查询,但是这么做有些繁琐。其次,楼主的想法是好的,但其实写一个中间dll,与你事先定义好接口是殊途同归的。因为,无论是写中间dll转发,或是通过引用TLB、已成型的com组件等触发事件,其原理都是要通过一个已知的接口来实现事件的触发流程。
      

  12.   


    在DLLC(事件转发机)里定义一个相同的事件A,DLLB(事件激发者)绑定DLLC,执行完DLLB中的事件A就会执行DLLC中的事件A。但此时DLLC似乎成了事件接收者,跟调用DLLC中的函数是一样的。怎样把这个事件转给应用程序去呢?
      

  13.   


    噢 可以直接绑定到prjA.exe中的DLLC实例!绑定DLLC,DLLC接收到事件以后可以直接转给PrjA.exe!
      

  14.   

    符合COM接口规范就应该可以了比如开发OFFICE的插件