IDispatch中invoke的问题 ( 积分: 150 )

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
IDispatch中的invoke方法,定义如下:
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;

(1)为什么这个var Params没有类型定义呢?
(2)在MSDN中,const IID:TGUID是保留的变量,必须设为IID_NULL,在Delphi中,该怎么定义呢?
(3)var Params在MSDN中好像是TDISPPARAMS,delphi中,应该怎么写呢?有没有谁有类似的代码片断?

特别声明:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1479908
http://www.delphibbs.com/delphibbs/dispq.asp?lid=642446
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1682012
http://www.delphibbs.com/delphibbs/dispq.asp?lid=585738
这几个文章我都看了,离线数据包也查了。关于invoke调用,大部分都是关于这个函数实现的代码,现在我想找一个调用invoke的代码例子。

求:一个例子。在OLE中的一个方法,有3个参数,现在我需要通过DispID去invoke这个方法,当然传递我刚才提到的三个参数过去了。
我开始的时候把Param设置成一个Variant的数组,没有参数的时候调用该方法已经成功。但是那个做法应该是不对的(指设置Param成Variant数组)。
var
aaaGUID:TGUID;
aaa:IDispatch;
HR:HRESULT;
tc:Integer;
dps:array[0..255] of Variant;//这个写法不对,当初我以为这个Params是个数组,就用这个方法,IDispatch中无参数的方法可以调用成功
pTypeInfo:ITypeInfo;
vaResult:OLEVariant;
excepInfo:TexcepInfo;
ArgErr:Integer;
begin
aaaGUID:=StringToGUID('{49739C4B-B689-4575-BAB6-70A4C302FE06}');
OleContainer1.OleObjectInterface.QueryInterface(aaaGUID,aaa);//OLEContainer中加载有我自己的ActiveForm
HR:=aaa.Invoke(217,aaaGUID,LOCALE_USER_DEFAULT,DISPATCH_METHOD,dps,@vaResult,@excepInfo,@ArgErr);
// 这里的aaaGUID本来应该是 IID_NULL,但是Delphi没有它的声明
OleCheck(HR);
aaa:=nil;
end;

现在哪位朋友可以帮我修改一下,改成可以传递参数的形式。
 
IDispatch中的invoke方法,定义如下:
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;

(1)为什么这个var Params没有类型定义呢?
(2)在MSDN中,const IID:TGUID是保留的变量,必须设为IID_NULL,在Delphi中,该怎么定义呢?
(3)var Params在MSDN中好像是TDISPPARAMS,delphi中,应该怎么写呢?有没有谁有类似的代码片断?

特别声明:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1479908
http://www.delphibbs.com/delphibbs/dispq.asp?lid=642446
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1682012
http://www.delphibbs.com/delphibbs/dispq.asp?lid=585738
这几个文章我都看了,离线数据包也查了。关于invoke调用,大部分都是关于这个函数实现的代码,现在我想找一个调用invoke的代码例子。

求:一个例子。在OLE中的一个方法,有3个参数,现在我需要通过DispID去invoke这个方法,当然传递我刚才提到的三个参数过去了。
我开始的时候把Param设置成一个Variant的数组,没有参数的时候调用该方法已经成功。但是那个做法应该是不对的(指设置Param成Variant数组)。
var
aaaGUID:TGUID;
aaa:IDispatch;
HR:HRESULT;
tc:Integer;
dps:array[0..255] of Variant;//这个写法不对,当初我以为这个Params是个数组,就用这个方法,IDispatch中无参数的方法可以调用成功
pTypeInfo:ITypeInfo;
vaResult:OLEVariant;
excepInfo:TexcepInfo;
ArgErr:Integer;
begin
aaaGUID:=StringToGUID('{49739C4B-B689-4575-BAB6-70A4C302FE06}');
OleContainer1.OleObjectInterface.QueryInterface(aaaGUID,aaa);//OLEContainer中加载有我自己的ActiveForm
HR:=aaa.Invoke(217,aaaGUID,LOCALE_USER_DEFAULT,DISPATCH_METHOD,dps,@vaResult,@excepInfo,@ArgErr);
// 这里的aaaGUID本来应该是 IID_NULL,但是Delphi没有它的声明
OleCheck(HR);
aaa:=nil;
end;

现在哪位朋友可以帮我修改一下,改成可以传递参数的形式。
 
参数类型应该是
MyDispParams: TDispParams;
MyParams: array[0..1] of TVariantArg;
VarResult: OleVariant;
ExcepInfo: TExcepInfo;
调用时
[red]// 参数压栈是反序[/red]
MyParams[0].vt := VT_BSTR;
MyParams[0].bstrVal := '我的子窗体';
MyParams[1].vt := VT_UNKNOWN;
MyParams[1].unkVal := Pointer(MyClass);
with MyDispParams do
begin
rgvarg := @MyParams;
rgdispidNamedArgs := nil;
cArgs := 2;
cNamedArgs := 0;
end;
MyStatus := MyIntf.Invoke(201,GUID_NULL,0,DISPATCH_METHOD,MyDispParams,@VarResult, @ExcepInfo, nil);
 
谢谢piao40993470。真是救火队员啊~~

不过还差一点你就可以领分了。
我传的参数,选择整型和浮点都可以了。但是这个字符串,不知道选哪个才行。
我在ActiveX这边的参数定义是LPSTR,然后这边需要调用它的话,怎么定义呢?
我是这么写的,不过不对。

MyParams[0].vt := VT_LPSTR;
MyParams[0].pcVal := '测试!!';

请指点。
 
字符串在接口应该用BSTR的类型
[red]MyParams[0].vt := VT_BSTR;
MyParams[0].bstrVal := '我的子窗体';[/red]
 
晕菜。把你的参数改了,竟然没看你回帖的原文就有BSTR了。
派分。
 
后退
顶部