2012-09-25 50 views
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() 

}; 

如果我跳過下面的RegisterClassObjectp->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; 
} 
+0

您進一步調試,看看你有什麼活動對您的服務器端:'1'是'CICEConnect :: CICEConnect()'曾經叫,'2'是同級車廠' IClassFactory :: CreateInstance'曾經被調用過。 –

+0

的IClassFactory ::的CreateInstance不叫,但類廠對象被創建 – Maanu

+0

這表明有什麼錯類實現本身。它可以是安全的,或者是防止實例化的coclass註冊。 –

回答

0

的COM對象被賦予難道你不認爲DispatchMessage是一個系統調用及其實現超出VS2008 & VS2010的控制?也許你不會處理正確的消息來創建控件!例如,SDK中的更改可能會導致您的錯誤。 ID爲1024的消息爲WM_USER,系統無法正常處理。處理此消息是由用戶代碼