您现在的位置:首页 >> API >> API >> 内容

Delphi中EmptyParam参数被改写问题

时间:2011/9/3 15:43:40 点击:

  核心提示:EmptyParam为Variants.pas中定义的:EmptyParam: OleVariant;它在Variant.pas的initialization节中被初始化:procedure SetV...

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;

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号