按:这个技巧对于工程的强壮性有帮助,而且也比较方便.可能很多朋友都会了,不过应该还不是所有人都玩过/有时间玩,所以就发发了.有些对象有事件,如果使用声明为Object的方式,是无法得到事件的.想使用其事件就得引用此DLL.如果既想动态调用DLL中的对象,又想使用对象的事件,可以试一下本文的方法(完整代码见后).总体思路比较简单,如下:一,利用EditTlb工具(Matthew Curland大师作品,后面有下载)打开目标DLL,直接另存为TLB.
   然后再用EditTlb打开这个TLB,改一下GUID,类接口的名称,保存备用.二,EXE工程里引用这个TLB,利用其中与DLL中对象一模一样的接口,写好事件相
   关代码.三,使用CreateObject创建对象.
   如果DLL正确地注册了,那么就会成功,否则会失败.其中EditTlb工具是重点,让本来需要用ODL语言生成TLB的过程成为过去....在这种应用中,完全没必要折腾ODL语言,所以有工具还是用工具吧....关于PowerVB的工具,我打了个包,包括EditTlb在内.还有本文的示例代码:    点击下载此文件PS:之前在原BLOG里也写了一篇,地址:http://www.m5home.com/blog2/blogview.asp?logID=329&cateID=2现在这篇写得详细一些,感觉应该比原来那篇好懂点吧~~ 

解决方案 »

  1.   

    谢谢老马,之前用过*.tlb写过,但是不知其所以然,谢谢
      

  2.   

    老马,我不是钻牛角尖,你没明白我的意思。用你的方法:1、创建TLB,在TLB中声明一个跟目标对象接口相同的接口。(注意这里必须用ClsID,而非ProgID)
    2、引用TLB,动态创建对象并接受事件。private withevents mobj as YourTlb.interface动态创建对象并用TLB中的接口来访问:
    set mobj = CreateObject("YourDll.ClassName")可以接受事件
    private sub mobj_test()
        msgbox "Test"
    end sub纯VB的方法:1、引用目标DLL。
    2、动态创建对象并处理事件。private withevents mobj as YourDll.ClassName动态创建对象
    set mobj = CreateObject("YourDll.ClassName")处理事件
    private sub mobj_test()
        msgbox "Test"
    end sub你觉得这两种方式从根本上有区别吗?
      

  3.   

    我觉得要从根本上解决问题,需要从COM底层入手,自己去处理事件连接点,对COM不够了解,这个可能难度太大。
    单纯从VB这个层面来处理,最好是有类似于VBControlExtender的东西,遗憾的是VBControlExtender只支持控件。妥协的办法就是用接口。即事件接受者跟事件源通过一自定义接口来实现。
      

  4.   

    也是啊....用起来倒是没什么不同.不过用TLB声明时可以不需要原组件在机器存在,仅是开发时的这一点不同而已...但是既然已经能有原组件来生成TLB了,为啥不能引用呢,汗~~记得当初好象有个啥需求需要用到这功能的,记不起来了- -!不过这次脸丢大了@_@大家BS我吧.........