IDispatch vs OleVariant

时间:2016-10-12 02:35:21

标签: delphi automation delphi-7 fingerprint delphi-6

我从指纹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); 为'未声明的标识符:'导出'

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

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

谢谢

2 个答案:

答案 0 :(得分:3)

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

pTemplate.Export(l_val);

使用:

(pTemplate as IExporter).Export(l_val);

答案 1 :(得分:3)

如果类型库说参数是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;