Delphi,OleVariant作为输出参数

Delphi,OleVariant作为输出参数,delphi,dll,activex,ole,Delphi,Dll,Activex,Ole,我有一个导入应用程序的第三方ActiveX控件。 其中一个函数导入为: function GenerateMACClearIVSync(const KeyName: WideString; out MacBytes: OleVariant): Integer; 它所做的是计算特定的8字节值并将其存储到“MacBytes”变量中。 但是,我在这个函数调用中遇到了问题,因为它会导致访问冲突 这是我尝试的代码: var i: integer; MacBytes: OleVari

我有一个导入应用程序的第三方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的跟踪)

请告诉我。谢谢

其他信息: 我使用delphixe5。以下是导入的函数原型:

GenerateMACClearIVSync(BSTR KeyName, VARIANT* MacBytes,long* pVal) 
他们这样称呼它:

VARIANT macResult; long length = GenerateMACClearIVSync(EncKey, &macResult)
将ActiveX导入Delphi时,我会得到包含以下声明的…\u 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;

部分解决:只有在调试模式下运行应用程序时才会崩溃。如果我通过双击来运行EXE,那么应用程序将正常运行,不会出现任何错误。
我不知道是什么导致了这个问题,但我会继续这个项目,因为这是一个很大的阻碍。也许一些德尔福大师可以给出更多的解释。

更多的信息:我使用德尔福XE5。这是导入的函数原型:GenerateMACClearIVSync(BSTR键名,VARIANT*MacBytes,long*pVal),他们这样称呼它:VARIANT macResult;长长度=GenerateMACClearIVSync(EncKey和macResult);电话会议在哪里?三个参数的版本是什么。我忍不住觉得你提供的一些细节是错误的。我所拥有的只是一个要导入的ActiveX控件,然后Delphi生成…_TLB.pas文件,其中还包含以下内容:函数GenerateMACSync(const KeyName:WideString;out MacBytes:OleVariant):Integer;安全呼叫;那么是不是安全电话?这些细节很重要。如果变量是out参数,为什么要初始化它?为什么评论中有重要的细节而不是问题?为什么评论中的细节与问题中的不一致?我认为这不是问题所在。我认为您应该创建varVariant元素类型的VarArray。