在Delphi中使用ATL组件

时间:2016-11-19 20:52:08

标签: delphi com atl

[改写为更易于理解]

我迷失了尝试在Delphi中使用COM对象。该对象是使用Visual Studio ATL创建的。

我在VBScript中测试了对象:

Set ourObj = Server.CreateObject( "JC_ATL_Q.JCsimple")
ourJCversion = ourObj.JCversion
Response.Write "<li>Get: JCversion = " + cstr( ourJCversion)

在德尔福,我跟着:

  

http://101.lv/learn/delphi/ch15.htm1

创建下面的代码,但这会产生错误

“无法找到指定的程序”

我检查了注册表,TGUID似乎是正确的。

我是否正确访问IDispatch接口?有没有办法获得有关出错的更多信息?

IJCsimple = interface(IUnknown)
    ['{96154141-4169-4321-BADC-A08F1B2D53A4}']
    function get_JCversion: Integer; stdcall;
  end;

const
CLASS_JCsimple: TGUID = '{6724FCDA-14F6-4D40-82A1-C8FD451BED9C}';

var
  Form2: TForm2;
  Result : variant;

implementation

procedure TForm2.Button1Click(Sender: TObject);
  begin

    Result := CreateComObject(CLASS_JCsimple) as IJCsimple;

  end;

end.

解决方案: 正如Remy Lebeau指出的那样,我不应该重新发明轮子,而应该使用Component&gt;&gt;导入组件&gt;&gt;导入类型库工具

1 个答案:

答案 0 :(得分:1)

您对接口方法使用了错误的声明。看起来应该更像这样:

type
  IJCsimple = interface(IUnknown)
    ['{DA13AEFD-C5A1-4A94-AD74-B9C355E1F19C}']
    function get_Version(out Result: Integer): HResult; stdcall;
    property Version: Integer read get_Version;
  end;

或者这个:

type
  IJCsimple = interface(IUnknown)
    ['{DA13AEFD-C5A1-4A94-AD74-B9C355E1F19C}']
    function Version: Integer; safecall;
  end;

话虽这么说,你不应该手动实现接口单元。正确的解决方案是让IDE导入COM对象的TypeLibrary并为您生成正确的包装代码:

Importing Type Library Information