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;
我从指纹 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;