描述:
我用ATL向导写了一个最简单的com组件,只有一个接口
interface IGetSum : IUnknown
{
[helpstring("method Add")] HRESULT Add([in] long x, [in] long y, [out, retval] long * z);
};
目标就是实现在其它的机子上远程调用这个com+组件
(注:我已经在本机上实现了In process调用和 本机的进程外调用)
但是当我想实现不在本机的调用时,出现了很多问题,想了二天都没有办法,只有来
请教高手了。
1.首先你得已经自己实现过远程的com+调用了,否则不要来讨论这个问题因为我已经想了N个办法是不成功
2.我用的系统是XP系统,我的机子作为客户机,而同学的服务器系统也是XP的系统。
我在同学的机子上安装了,从自己机子上导出的服务器端程序。
3.在自己机子上分几种情况都试过了,(1)我也导出了那个客户端的程序,并且已经安装了,在com+ application上也可以显示出来,其中我手工指定了远程机的IP地址如:219.245.157.82(2)我不安装客户的程序,直接在客户调用的代码中,用CoCreateInstanceEX 来指定远程机的IP
上述两种方法都不能正常的调用。
因为我已经可以实现了本机的调用,所以不可能会出现低级的错误。
而且经我观察,我在客户机的操作,可以让服务机的com+组件运行起来,即显示出
运行的ID号,但是就是不可以申请到所需要的接口。甚至有时候可以申请的接口,
但是在调用函数时就出现错误
一段代码如下:
IUnknown *pIUnknown;
IGetSum *my1;
MULTI_QI qi;
qi.pIID = &IID_IGetSum;
qi.hr = NULL;
qi.pItf = NULL;
COSERVERINFO servInf;
servInf.dwReserved1 = NULL;
servInf.dwReserved2 = NULL;
servInf.pAuthInfo = NULL;
servInf.pwszName = L"219.245.157.82";
HRESULT rt = CoCreateInstanceEx(CLSID_MyClass,
NULL,
CLSCTX_REMOTE_SERVER,
&servInf,
1,
&qi);//申请远程的接口
// 上面的rt 居然返回0(成功)
HRESULT rt1 = qi.hr;// 这个有时候不成功
my1 = (IGetSum *) qi.pItf;
long z = 0;
HRESULT rt3 = my1->Add(100, 200, &z);// 到这里总是出错
TRACE1("sum is %d = ", z);
my1->Release();
Loaded symbols for 'H:\ProxyStub.dll'//这里已经调用了proxy/stub代码,同时让服务器进程运行
Loaded 'I:\WINDOWS\system32\mswsock.dll', no matching symbolic information found.
Loaded 'I:\WINDOWS\system32\ws2_32.dll', no matching symbolic information found.
Loaded 'I:\WINDOWS\system32\ws2help.dll', no matching symbolic information found.
Loaded 'I:\WINDOWS\system32\secur32.dll', no matching symbolic information found.
Loaded 'I:\WINDOWS\system32\msv1_0.dll', no matching symbolic information found.
Loaded 'I:\WINDOWS\system32\wshtcpip.dll', no matching symbolic information found.
First-chance exception in usecom.exe (KERNEL32.DLL): 0x80070005: (no name).// 这里就是我在调用HRESULT rt3 = my1->Add(100, 200, &z提示的错误
总结:我想,很可能是安全性出了问题吧。错误提示时,一般都是“拒绝访问”
我已经试了很多种选项,改来改去的,出现的错误提示也是很乱的。
不知道有没有朋友,也走过相同的比较困扰的路,希望给我点方向,看是不是我这里没有注意到。
或者说,哪位高手,可以将一个“把com组件发布成一个com+,在远程调用”例子的过程比较完整的告诉我。我知道怎么制作com组件,就是不会远程调用
在方面,我极需要朋友的帮助,也许只要花你一点点时间,就可以让我在com的道路上继续走下去。极为感谢
我留下我的QQ:1623156 希望也有我可以帮助您的地方
在这里不太好详细说我的情况,在QQ里细聊。等你的消息。谢谢