如果通过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访问它的方法就行了 不管怎么样谢谢这位仁兄 导航菜单设置为fsStayOnTop,但打开出入库单时希望导航显示在后面怎么办 关于dbedit的使用 100分求助:本地动态数据库数据如何更新 从两个表中汇总后的数据如何生成一个临时表? 如何定义属于类的常量? 小弟刚学DELPHI,请各位介绍基本经典的好的书籍!!! 编译出现错误:“9991 2707 Unknown table type.” 控件问题,困惑! 如何将TPrintDialog选择的系统打印机赋给TQuickRep? Delphi Math单元函数mean怎么用啊? 请问这是什么原因?? 我感觉我太浮躁了!我累了,我好想去农村过农耕田园生活!!
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;
不管怎么样谢谢这位仁兄