本文整理自网络,侵删。
EmptyParam为Variants.pas中定义的:
EmptyParam: OleVariant;
它在Variant.pas的initialization节中被初始化:
procedure SetVarAsError(var V: TVarData; AResult: HRESULT);
begin
_VarClear(V);
V.VType := varError;
V.VError := AResult;
end;
EmptyParam通常用作COM调用的输入或输入参数,免去每个函数的声明部分都声明一个OleVariant变量的麻烦。比如,IWebBrowser2的方法声明如下:
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; var pvaOut: OleVariant); safecall;
就可以这样调用
aWebBrowser.ExecWB(6,6,EmptyParam,EmptyParam);
但是,EmptyParam的使用也带来了一个问题,有些COM调用会改变EmptyParam的值,以致EmptyParam被改写后其它把EmptyParam作为参数传递的COM调用出现“参数类型不对,或不可识别”的异常。IWebBrowser2.ExecWB就有可能改变EmptyParam的值。一个朋友跟我说它调用ExecWB后,再调用TADOQuery.Open出现“参数类型不对,或不可识别”的异常。通过调试追踪发现ExecWB后,EmptyParam被改写,而TADOQuery的Open方法内部的_RecordSet.Open调用,使用了EmptyParam传参数,导致异常。解决问题有两个,一是改写TADOQuery等VCL的ADO组件重新编译,这很麻烦;二是修改调用ExecWB的方式,这个很容易做到。只要调用ExecWB时不使用EmptyParam做参数就可以了。
var
v:OleVariant;
begin
v:=EmptyParam;
WebBrowser1.ExecWB(6,6,v,v);
end;
相关阅读 >>
Delphi firedac 获取 insert 记录的自增 id
Delphi xe6取得android智能手机的电话号码等的终端信息
更多相关阅读请进入《Delphi》频道 >>