【发布时间】:2014-08-28 13:20:51
【问题描述】:
我有一个第三方 ActiveX 控件,我将它导入到我的应用程序中。 其中一个函数被导入为:
function GenerateMACClearIVSync(const KeyName: WideString;
out MacBytes: OleVariant): Integer;
它的作用是计算某个 8 字节的值并将其存储到“MacBytes”变量中。 但是,我遇到了这个函数调用的问题,因为它给了我访问冲突。
这是我尝试的代码:
var i: integer;
MacBytes: OleVariant;
begin
MacBytes := VarArrayCreate([0, 7], varByte);
i := GenerateMACClearIVSync('MMM22', MacBytes);
end;
我希望 MacBytes 填充 8 个字节的数据,但在 Delphi 中却出现访问冲突。
在另一端,我看到 ActiveX 控件创建了 8 字节数据(通过查看 DLL 的跟踪)。
请指教。谢谢。
附加信息: 我使用德尔福 XE5。这是导入的函数原型:
GenerateMACClearIVSync(BSTR KeyName, VARIANT* MacBytes,long* pVal)
这就是他们的称呼:
VARIANT macResult; long length = GenerateMACClearIVSync(EncKey, &macResult)
当我将 ActiveX 导入 Delphi 时,我得到包含此声明的 ..._TLB.pas 文件:
IKXSDMCtrl = interface(IDispatch)
...
function GenerateMACClearIVSync(const KeyName: WideString; out MacBytes: OleVariant): Integer; safecall;
....
end;
然后,再往下看:
IKXSDMCtrlDisp = dispinterface(IDispatch)
...
function GenerateMACClearIVSync(const KeyName: WideString; out MacBytes: OleVariant): Integer; dispid 13;
....
end;
再往下:
TKXSDMCtrl = class(TOleControl)
...
function GenerateMACClearIVSync(const KeyName: WideString; out MacBytes: OleVariant): Integer;
...
end
最后是这样的:
function TKXSDMCtrl.GenerateMACSync(const KeyName: WideString; out MacBytes: OleVariant): Integer;
begin
Result := DefaultInterface.GenerateMACClearIVSync(KeyName, MacBytes);
end;
【问题讨论】:
-
更多信息:我使用的是 Delphi XE5。这是导入的函数原型: GenerateMACClearIVSync(BSTR KeyName, VARIANT* MacBytes,long* pVal) 这就是他们所说的: VARIANT macResult;长长度 = GenerateMACClearIVSync(EncKey, &macResult);
-
调用约定在哪里?三参数版本是什么。我不禁觉得你提供的一些细节是错误的。
-
我只有一个要导入的 ActiveX 控件,然后 Delphi 生成 ..._TLB.pas 文件,其中还包含以下内容: function GenerateMACSync(const KeyName: WideString; out MacBytes: OleVariant): Integer;安全呼叫;
-
安全调用是否安全?这些细节很重要。
-
如果它是一个输出参数,你为什么要初始化它?为什么 cmets 中有重要的细节而不是问题?为什么 cmets 中的详细信息与问题中的不匹配?