http://blog.sina.com.cn/s/blog_5f8861b60100nnzt.html
Delphi中EmptyParam参数被改写问题
(2010-12-20 19:34:22)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之窗,原文地址:http://www.52delphi.com/list.asp?ID=1203
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之窗,原文地址:http://www.52delphi.com/list.asp?ID=1203
delphi lazarus opengl
网页操作自动化, 图像分析破解,游戏开发