请教:关于DCOM创建对象实例失败的问题?

testpwd 2010-10-29 09:42:17
写了一个简单的DCOM服务器程序和客户端程序,服务器程序中主要是提供了一个IChat接口和Chat对象,客户端得到这个IChat接口然后调用接口中的方法。客户端开始的代码如下:


HRESULT hr;
IChat *pChat;
IUnknown *pUnknown;

//组件库初始化
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(FAILED(hr)){
MessageBox("组件初始化失败!");
return FALSE;
}

//初始化安全设置
hr = CoInitializeSecurity(
NULL,-1, NULL,NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IDENTIFY,
NULL, 0, NULL);

if(FAILED(hr)){
MessageBox("初始化安全设置失败!");
return FALSE;
}

//创建对象实例,并返回IUnknown 指针
COSERVERINFO ServerInfo={0,L"10.167.206.69",NULL,0};
MULTI_QI MultiQi={&IID_IUnknown,NULL,NOERROR};
hr=CoCreateInstanceEx(CLSID_Chat,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&MultiQi);

if(FAILED(hr)){
MessageBox("创建对象实例失败!");
return FALSE;
}

//通过IUnkonwn指针去查询接口指针,返回IChat指针
pUnknown = (IUnknown *) MultiQi.pItf;
hr = pUnknown->QueryInterface(IID_IChat,(void**)&pChat);

if(FAILED(hr)){
MessageBox("没有查找的接口指针!");
return FALSE;
}


客户端在本机运行,本机的IP是"10.167.206.51",服务器在另外一台机器上,IP就是上面代码中的"10.167.206.69",

现在有个问题是:执行CoCreateInstanceEx时失败了,返回的hr值是-2147023174。

如果服务器也在本机运行,把上面代码中的IP改成本机IP,就会执行成功。

请问在不同机器上面应该还需要设置些什么呢?或者说这个错误在哪里呢?

分不多了,希望各位大侠指教!
...全文
198 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪影 2010-10-29
  • 打赏
  • 举报
回复
对方机器的RPC服务没有开启吧

右键我的电脑 管理 服务 Remote Procedure Call (RPC) Locator 启动起来
Remote Procedure Call (RPC) 启动起来
testpwd 2010-10-29
  • 打赏
  • 举报
回复
多谢楼上的指点。现在我把两个服务都启动了,CoCreateInstanceEx执行成功了,但是
pUnknown->QueryInterface却执行失败了,hr返回值是-2147467262。请问这可能是怎么回事呢?

服务器是用MFC做的对话框程序(exe),下面是部分代码:


class CATLComServerApp : public CWinApp
{
...
}

BOOL CATLComServerApp::InitInstance()
{
if (!InitATL())
return FALSE;
...
}

BOOL CATLComServerApp::InitATL()
{
m_bATLInited = TRUE;

#if _WIN32_WINNT >= 0x0400
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
HRESULT hRes = CoInitialize(NULL);
#endif

if (FAILED(hRes))
{
m_bATLInited = FALSE;
return FALSE;
}

_Module.Init(ObjectMap, AfxGetInstanceHandle());
_Module.dwThreadID = GetCurrentThreadId();

LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
TCHAR szTokens[] = _T("-/");

BOOL bRun = TRUE;
LPCTSTR lpszToken = _Module.FindOneOf(lpCmdLine, szTokens);

while (lpszToken != NULL)
{
if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLCOMSERVER, FALSE);
_Module.UnregisterServer(TRUE); //TRUE means typelib is unreg'd
bRun = FALSE;
break;
}

if (lstrcmpi(lpszToken, _T("RegServer"))==0)
{
_Module.UpdateRegistryFromResource(IDR_ATLCOMSERVER, TRUE);
_Module.RegisterServer(TRUE);
bRun = FALSE;
break;
}

lpszToken = _Module.FindOneOf(lpszToken, szTokens);
}

_Module.UpdateRegistryFromResource(IDR_ATLCOMSERVER, TRUE); //这里进行注册
_Module.RegisterServer(TRUE);

if (!bRun)
{
m_bATLInited = FALSE;
_Module.Term();
CoUninitialize();
return FALSE;
}

hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
if (FAILED(hRes))
{
m_bATLInited = FALSE;
CoUninitialize();
return FALSE;
}

return TRUE;

}

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧