IDispatch 与 OleVariant

IDispatch vs OleVariant

我从指纹 SDK 获得了事件 onDone 的示例代码(在注册指纹后)

procedure TfrmRegister.FPRegisterTemplate1Done(ASender: TObject;
var pTemplate: OleVariant);
var
  l_val : OleVariant;  
  l_pArray : PSafeArray;
  i : integer;
  fpBuffer : PByteArray;
begin
  txtEvtMessage.Caption := 'Done Event Received !!';
  pTemplate.Export(l_val);
  l_pArray := PSafeArray(TVarData(l_val).VArray);
  blobSize := l_pArray.rgsabound[0].cElements * l_pArray.cbElements;
  fpBuffer := VarArrayLock(l_val);

  for i := 0 to blobSize - 1 do
  fpData[i] := fpBuffer[i]; //pvData is byte array

  VarArrayUnlock(l_val);
  mode := 0;
  btnVerify.Enabled := True;
end;

但是当我安装SDK并导入类型库时 onDone 的第二个参数是 const pTemplate:IDispatch 而不是 var pTemplate:OleVariant

所以错误出现在行 pTemplate.Export(l_val); as 'Undeclared identifier: 'Export'

我根本不懂 ActiveX/OLE/COM 编程。似乎它喜欢旧的 pascal 代码(PSafeArray、PByteArray 等)并且很难通过简单的示例和解释来理解这个术语。

有人知道如何通过一些修改使这些代码 运行 正确吗? 实际上这些代码是 Delphi 6(我用的是 Delphi 7)

谢谢

如果你说你能够导入类型库,你应该能够找到哪个接口实际描述了这个 Export 方法。那么,如果您说此 OnDone 事件处理程序在 OleVariant 之前有 IDispatch,您应该能够将此 Export 的后期绑定调用替换为早期-绑定调用。例如,如果此接口被称为 IExporter(以确保您必须与我们共享此 *_TLB.pas 文件或在文档中查找它,如果有的话),则替换:

pTemplate.Export(l_val);

与:

(pTemplate as IExporter).Export(l_val);

如果类型库说参数是一个 IDispatch,那么它实际上是一个 IDispatch。只需将其分配给本地 OleVariant 变量,然后根据需要使用它,例如:

procedure TfrmRegister.FPRegisterTemplate1Done(ASender: TObject;
  const pTemplate: IDispatch);
var
  l_template, l_val : OleVariant;  
  l_pArray : PSafeArray;
  i : integer;
  fpBuffer : PByteArray;
begin
  txtEvtMessage.Caption := 'Done Event Received !!';

  l_template := pTemplate;
  l_template.Export(l_val);

  l_pArray := PSafeArray(TVarData(l_val).VArray);
  blobSize := l_pArray.rgsabound[0].cElements * l_pArray.cbElements;
  fpBuffer := VarArrayLock(l_val);

  for i := 0 to blobSize - 1 do
    fpData[i] := fpBuffer[i]; //pvData is byte array

  VarArrayUnlock(l_val);
  mode := 0;
  btnVerify.Enabled := True;
end;