Delphi中EmptyParam参数被改写问题


本文整理自网络,侵删。

 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共享软件防破解的实用方法

Delphi gdi+ 文本输出

Delphi 拖动form上的图片,form一起动

Delphi firedac 获取 insert 记录的自增 id

判断url的有效性

Delphi xe6取得android智能手机的电话号码等的终端信息

Delphi 根据盘符弹出u盘

Delphi 关于构造方法的重写

Delphi中对进程内存进行读写

Delphi tstreamwriter快速写入文件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...