描述:
小弟最近在学习COM,费九牛二虎之力知道了点老虎皮毛。昨天在做DCOM时又遇到拦路虎,请各位大虾帮忙。
工程类型Service (Exe)类型,我在其中加了一个接口IGetHost,为改接口添加了一个方法GetComputerName(BSTR* bs)。我用CoCreateInstance能调用成功,显示了"soft5"---我的计算机名,COM调用成功。用CreateInstanceEx调用则每次都不能成功创建实例(我已经注册了代理存根,在DCOMCNFG中设置了身份验证为“无”,设置了“在此计算机上运行”和“在以下计算机上运行192.168.0.5”),DCOM调用失败。
COM调用的代码省略了,以下是DCOM客户端调用的代码:
我在stdafx.h文件中定义了 _WIN32_DCOM
#define _WIN32_DCOM
COM服务器接口是这样的:
接口:IGetHost
方法:GetComputerName(BSTR* bs);//得到主机名称
调用DCOM的代码是这样的:
HRESULT hr;
hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
if(FAILED(hr))
{
MessageBox(_T("CoInitializeEx Failed"));
return ;
}
// hr=CoInitializeSecurity(NULL,- 1,NULL,NULL,RPC_C_AUTHN_LEVEL_NONE,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL);
COAUTHINFO info;
COSERVERINFO cs;
memset(&info,0,sizeof(info));
memset(&cs,0,sizeof(cs));
cs.dwReserved1=0;
cs.dwReserved2=0;
cs.pAuthInfo=&info;
cs.pwszName=LPWSTR("192.168.0.5");//远程计算机
MULTI_QI qi[1];
memset(&(qi[0]),0,sizeof(qi[0]));
qi[0].pIID=&IID_IGetHost;
CoCreateInstanceEx(CLSID_GetHost,NULL,CLSCTX_SERVER,&cs,1,qi);
hr=qi[0].hr;
if(FAILED(hr))
{
MessageBox(_T("CoCreateInstanceEx Failed"));//每次都执行到这里,也就是失败了
CoUninitialize();
return ;
}
IGetHost *pI=NULL;
pI=(IGetHost*)qi[0].pItf;
BSTR bs;
hr=pI->GetComputerName(&bs);
if(FAILED(hr))
{
pI->Release();
CoUninitialize();
return;
}
_bstr_t str(bs);
MessageBox((LPCTSTR)str);
pI->Release();
CoUninitialize();
return;
另外,那位大虾有时间发给小弟一个简单的DCOM程序供小弟学习之用,不胜感激!邮箱:entaoyang@163.com
解决方案1:
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId();
//This means that calls come in on a random RPC thread
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
// This provides a NULL DACL which will allow access to everyone.
hr = CoInitializeSecurity( 0, -1, 0, 0,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IDENTIFY, 0, 0, 0 );
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER |
CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
关于com的讨论,我建了一个群9461821,欢迎加入
解决方案3:谁说DCOM要被淘汰了,当前的技术发展眼花缭乱,不要被冲昏了头。今天出了个.net框架,立马就转向.net,明天出了个G#,又改用G#。对于我们从事技术工作的IT人来说,没有什么过时的技术。我现在回过头还在搞8086和80386保护模式编程呢。COM/DCOM是windows的核心,如果掌握好了,对于你理解操作系统业务流程非常有帮助的。.net框架其实还是搭建在windows的COM/DCOM之上的,他现在摆脱不了COM/DCOM,除非出新的操作系统;COM是一种中间件技术,采用了CORBAR中的很多思想,很值得学习。这并不是说我们不要去学习最新的技术,而是在学习新技术的同时,要知道为什么会有这种技术出现,他跟以前技术之间的关系以及它们之间的过渡等等。说得太多了,脱离了搂主的话题,只是想借此批判那些过于浮躁的人。
解决方案4: http://www.codeproject.com/com/clientserverwithdcom.asp
这个因该对你有帮助。
两台电脑在同一个域(domain)或信任的域里才会成功,具体原因不清楚。
解决方案6: ^_^,前两天刚化大力气搞定了DCOM配置。
收集资料如下:
http://community.csdn.net/Expert/topic/3659/3659650.xml?temp=.5582392
http://www.livejournal.com/users/hanson2010/103257.html
http://program.tommsoft.com/bbs/reannounce.asp?boardid=3&rootid=15709&id=15710&reply=true
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1156
http://www.cnblogs.com/77543/archive/2005/01/12/90915.html
http://www.sou3w.com/database13/database225554.htm
http://community.csdn.net/Expert/topic/3659/3659650.xml?temp=.5582392
此外,把错误返回的值到MSDN里查查,到底是什么问题引起的。