Delphi,OleVariant作为参数

时间:2014-08-28 13:20:52

标签: delphi dll activex ole

我有一个第三方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中得到了Access Violation。

另一方面,我看到ActiveX控件创建了8字节数据(通过查看DLL的跟踪)。

请指教。感谢。

其他信息: 我使用的是Delphi 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;

1 个答案:

答案 0 :(得分:1)

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