net CreateObject 方式无法直接拿到com组件的具体内容

Q:在下列中的第二种情形:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim mExcelApplication As New Excel.Application
        Dim mWorkbook As Object = mExcelApplication.Workbooks.Add

        Dim mEventInfo As Reflection.EventInfo = mWorkbook.GetType.GetEvent("BeforeClose")
        Console.WriteLine(mEventInfo Is Nothing) 'False

        mWorkbook.Close()
        mExcelApplication.Quit()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim mExcelApplication As Object = CreateObject("Excel.Application")
        Dim mWorkbook As Object = mExcelApplication.Workbooks.Add

        Dim mEventInfo As Reflection.EventInfo = mWorkbook.GetType.GetEvent("BeforeClose")
        Console.WriteLine(mEventInfo Is Nothing)        'True

        mWorkbook.Close()
        mExcelApplication.Quit()
    End Sub
 第二种情况无法拿到EventInfo

A

1、com的调用:
    .net调用com不是直接调用而是通过RCW来调用的,RCW相当于com本身一模一样的分身,.net调用com的方法,事件,属性其实都是通过这个rcw.
具体可看
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconmarshalingselectedinterfaces.htm
2、com的事件:
   com的事件类似于.net的委托,不过不是传入一个函数指针这么简单,它叫连接点技术,引发事件的com组件叫源对象,它要求任何使用它的事件功能的程序实现它的一个输出接口,客户通过把这个接口传入com组件,com组件引发事件时调用客户的接口方法来实现的
ms-help://MS.MSDNQTR.2003FEB.2052/vccore/html/_atl_Connection_Points.htm
3、自动化
   这里要说自动化,因为我记得除了c调用com外,其它语言必须使用自动化技术调用com,也就是说com要想被诸如vb、java、脚本调用必须支持自动化,这是因为别的语言无法直接理解c++的对象在内存中的表示。
   com实现自动化,是通过实现IDispatch接口,这个接口提供了一组标准的方法,可以让客户可以了解com组件的方法,事件,属性。
   ms-help://MS.MSDNQTR.2003FEB.2052/automat/htm/autoportal_7l45.htm

通过引用获得com的RCW,相当于直接获得了com对象的全部(方法,属性,事件),所以eventinfo有值
而CreateObject只有在运行中通过自动化方式获得com的接口,前面我说过要支持com事件需要客户实现com组件的一个接口,也就是说如果运行时要自动添加一个类型,技术上可以达到但不合理,例如一个组件有几百个事件,而且程序只需支持几个事件,确要实现几百接口?而且没有必要,因为连接点也可以是自动化的可以在运行时获得具体的内容。

posted on 2007-06-29 02:34  子原  阅读(252)  评论(0编辑  收藏  举报

导航