同感!
Automation 好象是OLE,产生的.DLL能以CreateOleObject()方式调用,
这COM产生的.DLL,却不能以CreateOleObject()方式调用,说接口不支持,
我也搞不懂了,这COM 不兼容原来的 OLE ?!

解决方案 »

  1.   

    详细的书上有,简单的说,COM对象支持IUnknown接口,自动化对象支持IUnknown以及IDispatah双接口。
    COM对象必须显示的调用。而自动化对象可以隐式的调用。
      

  2.   

    COM 对象是 COM 体系中的原子。COM 对象只实现了 IUnknown 接口,而其它 COM 组件除了实现 IUnknown 接口还需要实现其它接口 例如 Automation 还要实现 IDispatah 接口。她们之间很像继承的关系:COM 对象是基类,Automation 更高级。
    因为 Automation 实现了 IDispatah 接口,所以她支持高级的按名字调用的约定(当然,在内部她做了转换,最终还是通过指针调用,灵活方便得到了加强,牺牲了性能),因为 VB 不支持指针,所以 VB 不能使用 COM 对象。但是单纯的 COM 对象太原始了,几乎不能直接用来做大事。
      

  3.   

    我以为OLE改进成COM,我不了解其本质
      

  4.   

    The IUnknown interface and methods
         For the definition of the IUnknown interface   and its methods' ueryInterface, AddRef, and Release 梥ee the Microsoft online Help.
         The IUnknown interface is the OLE interface from which AVIFile and AVIStream interfaces are derived. Interfaces used with AVI files rely on definitions of the QueryInterface, AddRef
    , and Release methods from this interface.
    ======================================================= IDispatch InterfaceImplemented by Used by Header filename
    Applications 
    that expose 
    programmable objects. Applications 
    that access 
    programmable objects. OLEAUTO.H (32-bit systems)DISPATCH.H (16-bit systems)
    OLE Automation objects may implement the IDispatch interface for access by OLE Automation controllers, such as Visual Basic. The object's properties and methods can be accessed using IDispatch::GetIDsOfNames and IDispatch::Invoke.
    The following examples show how to access an OLE Automation object through the IDispatch interface. Note that the code is abbreviated and omits error handling.// Declarations of variables used 
    DEFINE_GUID(CLSID_Hello, //...portions omitted for brevity... 
     
    HRESULT hresult; 
    IUnknown * punk; 
    IDispatch * pdisp; 
    OLECHAR FAR* szMember = "SayHello"; 
    DISPID dispid; 
    DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; 
    EXCEPINFO excepinfo; 
    UINT nArgErr; 
     
     
      

  5.   

    我比较认同qkl的说法. COM和Automation就其本质来说应该是一样的.Automation对象也是COM对象,只不过Automation实现了一些特殊功能的接口,如:IDispatch . 但是这两者是没有什么的继承关系这种说法. 对于实现了IDispatch接口的COM(如: Automation)就可以用CreateOleObject来创建对应的对象; 对于没有实现了IDispatch接口的COM就不能用CreateOleObject来创建对应的对象,而改用CreateComObject;这两个函数的参数与返回值是不一样的,我想它们的内部处理过程应该是一样的.每一个COM对象实际的接口都不一样,要理解特定的COM对象,就得理解它实现的接口,Automation也不例外.请各位继续提出自己的理解,谢谢!
      
      

  6.   

    MS好象有很多东西都叫Automation服务器, 如:word, Excel. 符合什么条件的组件才能称得上Automation服务器.唉! Ms定义的名词太多了....
      

  7.   

    我是理解成 COM对像只是对编译形的面像对像语言提供支持,因为只有这种语言才有VTable。
    但如果用的是非面像对像语言如 VB, VBA(总之是VB什么的多一些), 或是没有得COM对像的 TypeLibrary时, 这时不支持双重接口的COM对像就没有意义。Automation只是在原 COM对像上加个外衣,也就是说VTable映射由 IDispatch接口实现
      

  8.   

    CreateOleObject()
    CreateComObject() 
    就本地COM组件时,两个函数是通用的。COM对像的 CLS_ID要用 ProgIDTOClassID得到,这函数好像只有 Borland才有, MS不知用什么东东
      

  9.   

    谢谢!
    CreateComObject没有CreateOleObject简单,主要要什么 怪参数,没法试.
    ole有个类名如 "Excel.Application"等,
    这COM是不是没有这个"类名",所以就不能CreateOleObject("类名");typedef System::DelphiInterface< IUnknown >  _di_IUnknown;
    extern PACKAGE _di_IUnknown __fastcall CreateComObject(const GUID &ClassID);
    怪参数多烦呀
      

  10.   

    怎么能取得某个COM的.DLL的怪参数const GUID &ClassID呀?!
      

  11.   

    我想起来,是不是注册后,从注册表中就可查到这个什么号ClassID呀
    这多难受呀
      

  12.   

    extern PACKAGE GUID __fastcall ProgIDToClassID(const AnsiString ProgID);
    ProgID又是啥东东,一脑子浆糊呀
      

  13.   

    查了注册表,原来ProgID就是类名呀,象什么Comserver.my
      

  14.   

    谁能不能举个小例子,讲一讲 CreateComObject()的用法 ?
      

  15.   

    to BCB: 除了从注册表中查找外,也可以使用Delphi中提供的函数来求得,如:ProgIDToClassID
      

  16.   

    谁能不能举个小例子,讲一讲 CreateComObject()的用法
      

  17.   

    例子:(这个也可以用CreateOleObject('Excel.Application'))
    var
      aaa : IUnknown;
      bbb : OleVariant;
    begin
      aaa := CreateComObject(StringtoGUID('{00024500-0000-0000-C000-000000000046}')) ;//这是Excel
      bbb := aaa As IDispatch;
      bbb.workBooks.open('D:\Temp\aaaa.xls');
      ShowMessage(bbb.workbooks.Item[1].sheets.Item[1].Cells[1,1].text);//显示aaaa.xls中第一个网格的字符串
      bbb.quit;
      bbb := null;
    end;
      

  18.   

    Word、Excel等Automation对象中的方法、属性如何得到??如:Excel中的workBooks、Sheets、Cells等。Word、Excel等的帮助中有这些方法、属性吗??如何查?VBA中有没有这些方法、属性?我没有用过VBA
      

  19.   

    to saipm(saipm) :
       如何改成C++builder5.0,我试不成功!
      

  20.   

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
        OleVariant bbb=(IDispatch *)aaa;
        bbb.Exec(Function("Say")<<"Hello,3333!");  // 这一句执行结果不对
    }
      

  21.   

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
        OleVariant bbb=(IDispatch *)aaa;
        bbb.Exec(Procedure("Say")<<"Hello,3333!");
    }
    是不是缺少对象初始化?
      

  22.   

    有没有函数可以得到对象的ClassID or ProgID?
      

  23.   

    To BCB:  我不知道你的代码中的第三句不对的结果是什么? 我想只要你的COM对象提供了的这个方法是正确的,你的代码应该是正确的.我对CB不熟,不懂这句话的语法.
    To lixia01:  如你没有ClassID或ProgID,怎样标识这个COM. 不过ClassID与ProgID之间的转换,Delphi提供了两个函数.ProgIDToClassID,ClassIDToProgID
      

  24.   

    我的理解是:Automation对象是COM对象的一种特殊形式。IUnknown是所有接口的基类,也是IDispatch接口的基类。Automation对象实现IDispatch接口主要是为了实现与VBA的连接。
      

  25.   

    Automation对象支持动态调用,一个Automation对象的函数可以在runtime调用,这样就
    方便了动态绑定,Automation是很重要的com扩展,这样com组件就可以跨语言调用,特别是
    脚本语言,如VBA等。
      

  26.   

    只要一个COM对象实现了IDispatch接口,那么它就是一个Automation对象,反之亦然。
    推荐你看一本书《COM原理与应用》(潘爱民 著,清华大学出版社出版)
      

  27.   

    看书最好!
    直接看COM的书可能要化比较多的时间。你可以看Delphi关于COM方面的书。
    我觉得《Delphi4编程技术内幕》(Charlie Calvert著)是Delphi书籍中关于COM讲得最好的!
    其它方面也很优秀,你一定会喜欢这本书的!
      

  28.   

    to saipm(saipm):
    下列可能缺少类初始化部分,运行时出怪提示,算了,这种老实的过时方法不采用了,
    现在用类型库定义 _TLB.cpp 更简单了
        IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
        OleVariant bbb=(IDispatch *)aaa;
        bbb.Exec(Procedure("Say")<<"Hello,3333!");   //出现怪提示
      

  29.   

    COM我刚看了李维的书,com通常只能在C和pascal调用,若设为Automation
    就可以让任何一种语言来调用,大概是这个意思,详细的可以去看看李维的
    ado/mts/com+