如果通过IDispatch的Invoke()实现后期捆绑 我用客户端调用服务器com程序,有谁有通过IDispatch的Invoke()的调用自动化方法实现后期捆绑的代码,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只要搞懂invoke各参数你就会调用了~~function Invoke( DispID: Integer; // DispID参数指定了要执行的方法的调度号,可用GetIDsOfNames得到 const IID: TGUID; // 此参数无用, 以后或许会有用 LocaleID: Integer; // 语言页代号, 也可以不予理会 Flags: Word; // 要执行的方法类型(一般方法/属性读方法/属性写方法/引用赋值方法) var Params; // 参数列表, 下面会继续给出使用方法 VarResult, // 返回所调用方法的返回值, 指向OleVariant类型 ExcepInfo, // 指向一个TExcepInfo异常记录, 当invoke返回DISP_E_EXCEPTION时有效 ArgErr: Pointer // 发生错误用此可知参数列表(Params)中那个参数有误): HResult; stdcall;Params参数列表指针指向一个tagDispParams结构tagDISPPARAMS = record rgvarg: PVariantArgList; // 参数列表, 指向一个变体数组, 可用VarArrayCreate构造 rgdispidNamedArgs: PDispIDList; // 命名参数的调度号列表 cArgs: Longint; // 参数个数 cNamedArgs: Longint; // 命名参数个数end;TDispParams = tagDISPPARAMS;也就是说,调用一个未知的方法,通常需要经过如下几步1 用GetIdsOfNames得到方法名的编号2 用VarArrayCreate构千一个变体数组,并对各参数赋值3 生成一条tagDispParams记录, 其中含有参数信息4 根据得到的方法编号及参数列表调用invoke 我发这个帖子的目的是想知道,比如我做个com,客户端不注册这个com组件也能调用他的方法,后期捆绑能实现吧? 能提供个例子吗,我马上给分,谢谢这位仁兄!!! 不注册应该也是可以的,只是调用起来比较烦琐,你得先CoLoadLibrary该dll, 然后再获得该dll中的DllGetClassObject函数指针,然后调用该函数得到类厂,再用得到的类厂创建该类的实例,代码大致如下: CoInitialize(nil); FLibrary := ActiveX.CoLoadLibrary(theDLL, true); DllGetClassObject := GetProcAddress(FLibrary, 'DllGetClassObject'); if DllGetClassObject(CLASS_MyCom, IID_IMyCom, FFactory) = S_OK then begin FMyCom := FFactory.CreateInstance(nil, IMyCom); //FMyCom.DoSomthing; ... end; westfly(西翔) 对COM理解很透:) 我自己知道了,我是用TDcomConnection控件,设置ComputerName和ServeGUID属性,再connect:=true一下,通过appserver访问它的方法就行了 不管怎么样谢谢这位仁兄 请教,delphi5中对SQL中image类型字段所存放的字符串的操作 谁有TGIFImage 3.0给我发一个? 今天早上发现可用分多了50多万分,拼命散了一些,但什么时候才能散完? 一个对高手来说是简单的问题,三层结构的数据更新问题 重金寻找一位DELPHI师傅! 请教这个语句有何错误? 小小问题 >>>>>>>>这么简单的查询语句,我就是写不出来!!<<<<<<<<<<< 请高手出招:::Tstrings 的构造问题!! 请问用D版开发工具编写的软件算Z版还是算D版? 请问这是什么原因?? 我感觉我太浮躁了!我累了,我好想去农村过农耕田园生活!!
function Invoke(
DispID: Integer; // DispID参数指定了要执行的方法的调度号,可用GetIDsOfNames得到
const IID: TGUID; // 此参数无用, 以后或许会有用
LocaleID: Integer; // 语言页代号, 也可以不予理会
Flags: Word; // 要执行的方法类型(一般方法/属性读方法/属性写方法/引用赋值方法)
var Params; // 参数列表, 下面会继续给出使用方法
VarResult, // 返回所调用方法的返回值, 指向OleVariant类型
ExcepInfo, // 指向一个TExcepInfo异常记录, 当invoke返回DISP_E_EXCEPTION时有效
ArgErr: Pointer // 发生错误用此可知参数列表(Params)中那个参数有误
): HResult; stdcall;Params参数列表指针指向一个tagDispParams结构
tagDISPPARAMS = record
rgvarg: PVariantArgList; // 参数列表, 指向一个变体数组, 可用VarArrayCreate构造
rgdispidNamedArgs: PDispIDList; // 命名参数的调度号列表
cArgs: Longint; // 参数个数
cNamedArgs: Longint; // 命名参数个数
end;
TDispParams = tagDISPPARAMS;也就是说,调用一个未知的方法,通常需要经过如下几步
1 用GetIdsOfNames得到方法名的编号
2 用VarArrayCreate构千一个变体数组,并对各参数赋值
3 生成一条tagDispParams记录, 其中含有参数信息
4 根据得到的方法编号及参数列表调用invoke
能提供个例子吗,我马上给分,谢谢这位仁兄!!!
你得先CoLoadLibrary该dll, 然后再获得该dll中的DllGetClassObject函数指针,
然后调用该函数得到类厂,再用得到的类厂创建该类的实例,
代码大致如下:
CoInitialize(nil);
FLibrary := ActiveX.CoLoadLibrary(theDLL, true);
DllGetClassObject := GetProcAddress(FLibrary, 'DllGetClassObject');
if DllGetClassObject(CLASS_MyCom, IID_IMyCom, FFactory) = S_OK then
begin
FMyCom := FFactory.CreateInstance(nil, IMyCom);
//FMyCom.DoSomthing;
...
end;
不管怎么样谢谢这位仁兄