playyuer老兄怎么到delphi组来啦。
这个问题好像不是太好回答。com object实现了IUNKnown接口,Automation Object实现了
双接口:IUnKnown IDispatch,这两个接口的详细介绍你可以参考MSDN。下面是一段相关
的文章:1.4.1 IDipatch接口
自动化对象在本质上是一种实现IDispatch接口的COM对象。在System单元中,IDispatch 是这样定义的: 
IDispatch = interface(IUnknown)
    ['{00020400-0000-0000-C000-000000000046}']
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  end;
IDispatch的核心函数是Invoke()。当客户获取了一个自动化服务器的IDispatch指针后,它就可以调用Invoke()方法来执行自动化服务器上的一个方法。DispID参数指定了要执行的方法的调度号(dispatch ID)。IID参数目前未用。LocaleID参数包含了语言信息。Flags 参数描述了要执行的方法的类型(一般的方法、属性的读访问方法/写访问方法)。Params属性包含了一个指针,指向一个TDispParams数组,指定了要传递给方法的参数。VarResult参数是一个指向OleVariant的指针,用于返回所调用方法的返回值。ExcepInfo是一个指向TExcepInfo记录的指针,如果Invoke()返回DISP_E_EXCEPTION,则这个记录包含了错误信息。如果Invoke()返回DISP_E_TYPEMISPATCH或DISP_E_PARAMNOTFOUND,ArgError参数是指向一个整数的指针,该整数表示Params 数组中哪个参数导致了错误。
IDispatch接口的GetIDsOfNames()方法用于根据给出的名称来得到一个或多个方法的调度号。IID参数目前未用。Names参数是一个PWideChar类型的数组,用于给出一个或多个方法名。NameCount参数用于指定Names数组中实际的方法名称数。LocaleID包含了语言信息。最后一个参数DispIDs是一个整型数组,返回每个方法的调度号。GetTypeInfo()方法用于获取自动化对象的类型信息(关于类型信息后面再讲)。Index参数代表了要获取的信息的类型,通常设为0 。LCID参数包含了语言信息。如果这个方法调用成功,TypeInfo参数就是一个ITypeInfo指针,指向自动化对象的类型信息。
GetTypeInfoCount()方法返回自动化对象所支持的类型信息接口的数量。参数Count只能取两个值:0 表示自动化对象不支持的类型信息;1 表示自动化对象支持类型信息。1.4.2 先期绑定与后期绑定
我们首先来创建一个简单的自动化客户端程序:
procedure TForm1.Button1Click(Sender: TObject); //代码片断1
var
     V:Variant;
begin
  V:=CreateOLEObject('Word.Application');
  V.Quit;
end;
要运行上面的代码,首先需要在Uses中加入对comobj的引用。运行程序,上面的代码十分简单,就是调用CreateOLEObject函数启动自动化服务器Word,然后关闭Word。
再看下面的代码:
procedure TForm1.Button1Click(Sender: TObject); //代码片断2
var
  V:TWordApplication;
begin
  V:= TWordApplication.Create(Self);
  V.Quit;
end;
运行上面的代码之前需要在Uses中加入对Word97,OLEServer的引用。代码片断2的作用同前面的代码是一样。但是代码片断2的方法称为先期绑定(Early Binding),先期绑定方式就是指对接口方法的所有调用在编译时检查参数是否正确,例如我们在语句代码片断中添加: V.NotInWord 。显然,NotInWord方法不会是TWordApplication类的方法,那么在程序执行前就会出错。
现在来看代码片断1,我们在定义中将V定义为Variant类型变量,也就是说,Delphi并不把V当作一个对象,那么如何在这个“对象”中调用方法呢?答案是使用后期绑定(Late Bindind),使用后期绑定时,Delphi并不会对对象以及对象方法在编译时进行检查。例如,如果在代码片断1中添加语句:
V.NotInWord
程序在编译时并不会出错,但是在执行时会产生“method NotInWord not supported by automation object”错误。
那么在自动化服务器中是如何实现后期绑定的呢?所谓后期绑定指的是通过IDispatch的Invoke()调用的自动化方法。之所以称之为后期绑定,是因为方法调用是在运行期确定的。在编译期,只是把方法的有关参数传递给IDispatch. Invoke(),只有到了运行期才执行具体的方法。当通过一个Delphi变量或OLE变量调用一个自动化方法的时候,其实就是在使用后期绑定,因为Delphi必须要调用IDispatch.GetIDsOfNames()把方法名转换为一个DispID,然后再根据这个DispID,用IDispatch.Invoke()调用这个方法。
前期绑定发生在自动化对象通过一个继承于IDispatch的接口显露其方法的时候。这时客户就不需要通过IDispatch.Invoke()而可以直接调用自动化对象,这就比通过后期绑定来调用更快一些。当使用Delphi的接口调用一个方法的时候就使用了前期捆绑。
如果一个自动化对象既支持通过Invoke()来调用方法,也支持通过IDispatch的派生接口调用方法,我们就称这个自动化对象支持双重接口(dual interface)。Delphi生成的对象都支持双重接口,既可以用Invoke()来调用方法,也可以直接通过接口调用方法。

解决方案 »

  1.   

    TechnoFantasy(www.applevb.com):
        实例化一下,麻烦给个例子!
    我是这样做的,请大家指正:
       1.new ActiveX Library
       2.new Com Object 或 Automation Object ?????
       3....????另: Compile 与 Build 的区别 = ????
      

  2.   

    Compile 在"内存"???
    Build 在"硬盘"???
      

  3.   

    你的建立步骤正确的,首先建立activex library。然后建立Com Object 或 Automation Object 然后打开typelibrary view浏览对象、接口。添加方法等。然后就是编码了。
    Compile 是编译成中间代码。例如将pas编译成为dcu,build是将工程生成最后的文件
    例如exe dll等,说的不是很确切,大概是这个意思。
      

  4.   

    我确实是这么做的,在 VB 里调用报错: 不能创建 ActiveX 对象
    麻烦给个简单例子!
    要求包含:
        一个方法: Method1 将一个 Form.ShowModal
        一个属性: Porporty1 传一个字符串进去就行
    拜托了!
     
      

  5.   

    在 VB 里调用:
    是 Run Time 报错: 不能创建 ActiveX 对象!
    Design time 引用完(前期绑定),已在 VB 中认了!
      

  6.   

    范例代码已经发给你了,从[email protected]发过去的。
      

  7.   

    老大你的 Sample:
    在 VB 里调用,也是:
    是 Run Time 报错: ActiveX 部件不能创建 对象!
    Design time 引用完(前期绑定),已在 VB 中认了!
    继续....
      

  8.   

    delphi的向导很详细的哦,先建一个Active libary,然后可以在这个Dll里加 Com Object 或 Automation Object ,Com Object跟Automation Object的区别主要是Automation Object是可以自动化的,也就是说它实现了IDipatch接口,支持双重接口,可以通过编组在进程间交换数据,编组时数据类型必须时可以自动化的类型(有很多参考书上讲过的),建议你先去理解“接口”这个概念,有些抽象,不过也不难,祝你好运啦
      

  9.   

    这个范例我试过,没有问题。你可以在delphi中注册,然后再vb中引用后再调用
      

  10.   

    我是 Delphi 6!
    delphi中如何注册???(编译了就应已经注册了吧?)(应该是相当于 Regsvr32...)
    Import Type Library 里本来已经认了!