[改写为更易于理解]
我迷失了尝试在Delphi中使用COM对象。该对象是使用Visual Studio ATL创建的。
我在VBScript中测试了对象:
Set ourObj = Server.CreateObject( "JC_ATL_Q.JCsimple")
ourJCversion = ourObj.JCversion
Response.Write "<li>Get: JCversion = " + cstr( ourJCversion)
在德尔福,我跟着:
创建下面的代码,但这会产生错误
“无法找到指定的程序”
我检查了注册表,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;导入类型库工具
答案 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并为您生成正确的包装代码: