【问题标题】:Delphi, OleVariant as out parameterDelphi,OleVariant 作为输出参数
【发布时间】: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 中的详细信息与问题中的不匹配?

标签: delphi dll activex ole


【解决方案1】:

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

【讨论】:

  • 我认为这不是问题所在。我认为您应该创建一个 varVariant 元素类型的 VarArray。
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2015-12-01
  • 2013-11-09
相关资源
最近更新 更多