1
失敗,我們有在Win正常工作7 64位的VS 2008構建DCOM服務器。在VS 2010構建的情況下,客戶端對象創建失敗,並顯示「服務器創建失敗」錯誤消息。類定義如下。ATL DCOM對象的創建在VS 2010構建
調試時,我們看到消息ID爲1024的消息已在消息循環中收到,但DispatchMessage
不路由消息,以創建CICEConnect
對象。在VS 2008版本中,DispatchMessage
將呼叫路由到創建CICEConnect
對象。我相信這會在問題
服務器應用程序指出,當客戶端嘗試創建的對象。 DCOM服務器在本地機器
運行如何調試問題的進一步?
void RunMessageLoop() throw()
{
MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
class ATL_NO_VTABLE CICEConnect :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CICEConnect, &CLSID_ICEConnect>,
public IDispatchImpl<IICEConnect, &IID_IICEConnect, &LIBID_ICEConnectServerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CICEConnect()
{
}
DECLARE_CLASSFACTORY_SINGLETON(CICEConnect)
DECLARE_REGISTRY_RESOURCEID(IDR_ICECONNECT)
BEGIN_COM_MAP(CICEConnect)
COM_INTERFACE_ENTRY(IICEConnect)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
};
如果我跳過下面的RegisterClassObject
p->Release();
的COM對象創建成功。
struct _ATL_OBJMAP_ENTRY30
{
HRESULT WINAPI RegisterClassObject(
_In_ DWORD dwClsContext,
_In_ DWORD dwFlags)
{
IUnknown* p = NULL;
if (pfnGetClassObject == NULL)
return S_OK;
HRESULT hRes = pfnGetClassObject(pfnCreateInstance, __uuidof(IUnknown), (LPVOID*) &p);
if (SUCCEEDED(hRes))
hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
if (p != NULL)
p->Release();
return hRes;
}
// Added in ATL 3.0
void (WINAPI *pfnObjectMain)(_In_ bool bStarting);
};
代碼中使用下面創建
int _tmain(int argc, _TCHAR* argv[])
{
CoInitializeEx(NULL,COINIT_MULTITHREADED);
COSERVERINFO server;
memset(&server,0,sizeof(COSERVERINFO));
COAUTHINFO athn;
ZeroMemory(&athn, sizeof(COAUTHINFO));
athn.dwAuthnLevel = RPC_C_AUTHN_LEVEL_NONE;
athn.dwAuthnSvc = RPC_C_AUTHN_WINNT;
athn.dwAuthzSvc = RPC_C_AUTHZ_NONE;
athn.dwCapabilities = EOAC_NONE;
athn.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
athn.pAuthIdentityData = NULL;
athn.pwszServerPrincName = NULL;
server.pAuthInfo = &athn;
server.pwszName = L"\\\\localhost";
server.dwReserved1 = 0;
server.dwReserved2 = 0;
MULTI_QI mqi = {&IID_IICEConnect, NULL, S_OK};
// Access the PMC on the given machine
HRESULT hRes = CoCreateInstanceEx(CLSID_ICEConnect,NULL,
CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,&server,1,&mqi);
return 0;
}
您進一步調試,看看你有什麼活動對您的服務器端:'1'是'CICEConnect :: CICEConnect()'曾經叫,'2'是同級車廠' IClassFactory :: CreateInstance'曾經被調用過。 –
的IClassFactory ::的CreateInstance不叫,但類廠對象被創建 – Maanu
這表明有什麼錯類實現本身。它可以是安全的,或者是防止實例化的coclass註冊。 –