我想在VB6中使用后期绑定调用Word,但是我还想使用Word返回的事件:DocumentBeforePrint,不知道该怎么弄?
前期绑定,用Withevents关键字就可以了,可是后期绑定声明为Object就不让用Withevents关键字了,该怎么办呢?

解决方案 »

  1.   

    先withevents定义一个变量o,然后把那个object用set赋值给o
      

  2.   

    那不一样还要先期绑定o吗?
    我的问题是:我编了一个dll,可是要兼容word2000,就必须要在word2000环境下编译,否则,dll就可能挂了。而采用后期绑定,就word2000以上通吃了,毫无问题。所以想来个后期绑定,但是有几个Word事件还想用,怎么办呢?各路大虾费心了,500分奖励!
      

  3.   

    放心,application的接口id都是一样的,你set后都一样
      

  4.   

    application的接口id是一样的,要不然就更惨了。事实上,要是不用word提供的事件,还真没有问题,就是因为使用了DocumentBeforePrint这个事件,我在word xp中直接编译的dll在word2000中使用肯定挂,在word 2000环境下编译的,在其后版本中就都没有问题。我认为这是2000的一个bug。原来以为word2k到wordxp到word2003就是改改界面,添加一些功能而已,用了VBA才知道,原来他们也解决了原来系统的一些bug。比如:在word2000中,information属性测量的东西经常不准确(而且还不支持Range),还需要特殊处理一下,而在wordxp中,就没有问题了。
      

  5.   

    那你这样吧,你去把word2000的olb文件(在office的目录里面,名字可能叫msword9.olb之类的)拷贝到你自己机子上,然后你在工程中引用之试试
      

  6.   

    http://babaq.blogbus.com/logs/2004/07/298136.html一种 ActiveX DLL 事件取代方法 
    时间: 2004-07-30 
    感谢好人,提供了一种可以代替传统事件处理的方法。如此 PowerXP 中动态加载Activex DLL后事件无法触发的问题就迎刃而解了。传统的事件处理,是通过RaiseEvent触发的,但是,如果一个Activex DLL被动态加载 [CreateObject(DLL Porject's Name.ClassName)],就无法通过RaiseEvent触发,这样也就无法在工程中使用Activex DLL提供的事件了。这个替代办法是使用CallWindowProc API我现在假设有这么一个问题:我编写一个Activex DLL,通过其中一个Timer的Timer触发在另一个EXE工程中的DoMe事件,我该怎么做?在Activex DLL中,我编写如下代码:工程名:EVENT ,类模块名:SetEvent, 模块名:MainIn Class SetEvent:Public Function SetEventAdd(Address as long) as long EventAdd=AddressEnd FunctionIn Module Main:Public EventAdd as longPublic Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongIn Timer's Event Timer:Private Sub Timer_Timer(...)'Add the judgment here.(If...Then...,Select Case...)CallWindowProc EventAdd,0,0,0,0End Sub在EXE工程中:模块名:ForEvents, 窗体:FormIn Module ForEvents:Public Function DoMe()'TODO.End FunctionIn Form's Event:Dim Example as ObjectPrivate Sub Form_Load()Set Example=CreateObject(EVENT.SetEvent)Example.SetEventAdd AddressOf DoMe End Sub至此,当Activex DLL中Timer事件中的代码通过条件判断,便可随时触发DoMe。在这里,我们必须注意的是,CallWindowProc函数的参数有许多限制,具体请参阅MSDN中的信息。AddressOf 只能返回一个放在模块中的函数的地址,同时AddressOf只能放在参数中使用。在使用AddressOf返回函数地址时,函数中必须有实际可执行的代码,否则出错。更多信息,可以参阅好人的文章:http://www.blogbus.com/blogbus/blog/diary.php?diaryid=284978
      

  7.   

    看来word的时间我们是得不到了,弄一个自己的事件还这么费事呢!结帖。谢谢各位的帮助!