我从指纹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)
谢谢
答案 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;