在调用CreateInstanceEx()激活DCOM服务端时,返回错误:服务器运行失败。请高手解答!

archimedes_zht 2006-08-17 03:52:44
在调用CreateInstanceEx()激活DCOM服务端时,返回错误:服务器运行失败。
以下是客户端的部分代码:
CoInitialize(NULL);

HRESULT hr = E_FAIL;
wchar_t szServerIp[] = L"192.168.1.31";
IEvent1* pIEvent1 = NULL;

COSERVERINFO cs;
ZeroMemory(&cs, sizeof(cs));
cs.pwszName = szServerIp;
MULTI_QI mqi[1] = {{&IID_IEvent1, 0, 0}};
hr = CoCreateInstanceEx(CLSID_Event1, NULL, CLSCTX_SERVER, &cs, 1, mqi);
if (hr == S_OK || SUCCEEDED(mqi[0].hr))
{
// Extract the interface from the MULTI_QI strucure
pIEvent1 = reinterpret_cast<IEvent1*>(mqi[0].pItf);
}
else
{
CoErrorMessage(hr);
return FALSE;
}
...全文
915 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldsjlzy 2006-08-18
  • 打赏
  • 举报
回复
参数带指针吗? 全局接口是通过本地cookies做中介进行的传递的,不能跨机器.
archimedes_zht 2006-08-18
  • 打赏
  • 举报
回复
// Event1.h : Declaration of the CEvent1

#ifndef __EVENT1_H_
#define __EVENT1_H_

#include "resource.h" // main symbols

/////////////////////////////////////////////////////////////////////////////
// CEvent1
class ATL_NO_VTABLE CEvent1 :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CEvent1, &CLSID_Event1>,
public ISupportErrorInfo,
public IEvent1
{
public:
CEvent1();
~CEvent1();

DECLARE_REGISTRY_RESOURCEID(IDR_EVENT1)
DECLARE_NOT_AGGREGATABLE(CEvent1)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CEvent1)
COM_INTERFACE_ENTRY(IEvent1)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

// IEvent1
public:
STDMETHOD(Advise)(ICallback* pICallback, DWORD* pdwCookie);
STDMETHOD(Unadvise)(DWORD dwCookie);
STDMETHOD(Add)(long n1, long n2);

void Lock();
void UnLock();
private:
DWORD m_dwCookie_itf;
CRITICAL_SECTION m_cs;
};

#endif //__EVENT1_H_



// Event1.cpp : Implementation of CEvent1
#include "stdafx.h"
#include "Server.h"
#include "Event1.h"
#include <assert.h>

extern IGlobalInterfaceTable *g_pGIT;

/////////////////////////////////////////////////////////////////////////////
// CEvent1

CEvent1::CEvent1() : m_dwCookie_itf(0)
{
CoCreateInstance(CLSID_Event1, 0, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void**)&g_pGIT);
InitializeCriticalSection(&m_cs);
}

CEvent1::~CEvent1()
{
DeleteCriticalSection(&m_cs);
}

STDMETHODIMP CEvent1::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IEvent1
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (ATL::InlineIsEqualGUID(*arr[i], riid))
return S_OK;
}
return S_FALSE;
}

STDMETHODIMP CEvent1::Advise(ICallback* pICallback, DWORD* pdwCookie)
{
if (pICallback == NULL)
{
return E_INVALIDARG;
}
Lock();
assert(g_pGIT != NULL && m_dwCookie_itf == 0);
HRESULT hr = g_pGIT->RegisterInterfaceInGlobal(pICallback, IID_ICallback, &m_dwCookie_itf);
*pdwCookie = m_dwCookie_itf;
UnLock();

return hr;
}

STDMETHODIMP CEvent1::Unadvise(DWORD dwCookie)
{
if (dwCookie < 0 || dwCookie > 10)
return E_INVALIDARG;
Lock();
assert(g_pGIT != NULL && m_dwCookie_itf != 0);
HRESULT hr = g_pGIT->RevokeInterfaceFromGlobal(m_dwCookie_itf);
UnLock();

return hr;
}

STDMETHODIMP CEvent1::Add(long n1, long n2)
{
long nResult = n1 + n2;
ICallback *pICallback = NULL;
assert(g_pGIT != NULL && m_dwCookie_itf != 0);
HRESULT hr = g_pGIT->GetInterfaceFromGlobal(m_dwCookie_itf, IID_ICallback, (void**)&pICallback); // 产生一个临时指针。
if (SUCCEEDED(hr))
{
hr = pICallback->Fire_Result(nResult);
}

return hr;
}

void CEvent1::Lock()
{
EnterCriticalSection(&m_cs);
}

void CEvent1::UnLock()
{
LeaveCriticalSection(&m_cs);
}

那你看看我的这个使用全局接口表的实现对吗?
archimedes_zht 2006-08-17
  • 打赏
  • 举报
回复
我在服务端用了全局接口指针表(GIT)的,不会和这个有关吧。没有用这个时候,可以正常激活的。主要是要跨机器啊,应该对指针进行列集和散集啊。
archimedes_zht 2006-08-17
  • 打赏
  • 举报
回复
这样还是不行啊。郁闷。
ldsjlzy 2006-08-17
  • 打赏
  • 举报
回复
设置完记得要重启
ldsjlzy 2006-08-17
  • 打赏
  • 举报
回复
还是DCOM的权限问题,DCOM的权限配置很变态的,
你在你的DCOM组件配置页的标识(Identity)页面下改成the launching user,如果本来就是该项,改成the interactive user(交互用户)试试
archimedes_zht 2006-08-17
  • 打赏
  • 举报
回复
错误码是:-2146959355
八进制是:0x80080005
查过了,WinError.h里的描述是:
//
// MessageId: CO_E_SERVER_EXEC_FAILURE
//
// MessageText:
//
// Server execution failed
//
#define CO_E_SERVER_EXEC_FAILURE _HRESULT_TYPEDEF_(0x80080005L)
ldsjlzy 2006-08-17
  • 打赏
  • 举报
回复
返回什么错误码?
archimedes_zht 2006-08-17
  • 打赏
  • 举报
回复
用DCOM配置工具配置应该是正确的,因为另外一个程序就能够正确激活,访问。

3,248

社区成员

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

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