Ошибка создания объекта ATL DCOM в VS 2010 Build

У нас есть DCOM-сервер, который отлично работает в Win 7 64 Bit для сборки VS 2008. В случае сборки VS 2010 создание объекта на стороне клиента завершается ошибкой «Ошибка создания сервера». Определение класса приведено ниже.

При отладке мы увидели, что сообщение с идентификатором сообщения 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()

};

Если я пропущу p->Release(); в следующем RegisterClassObject, создание 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);
};

Код, используемый для создания COM-объекта, приведен ниже.

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;
}

person Maanu    schedule 25.09.2012    source источник
comment
Дальнейшая отладка заключается в том, чтобы увидеть, какая у вас активность на стороне сервера: 1 Вызывается ли когда-либо CICEConnect::CICEConnect(), 2 Вызывается ли когда-либо его фабрика классов IClassFactory::CreateInstance.   -  person Roman R.    schedule 25.09.2012
comment
IClassFactory :: CreateInstance не вызывается, но создается объект фабрики классов   -  person Maanu    schedule 26.09.2012
comment
Это говорит о том, что в самой реализации класса нет ничего плохого. Это либо безопасность, либо регистрация компонентного класса, которая предотвращает создание экземпляра.   -  person Roman R.    schedule 26.09.2012
comment
Обновил мой пост с некоторой дополнительной информацией. Если я прокомментирую выпуск объекта Class Factory Object После его регистрации создается COM-объект   -  person Maanu    schedule 26.09.2012


Ответы (1)


Вам не кажется, что DispatchMessage - это системный вызов, и его реализация находится вне контроля VS2008 и VS2010? возможно, вы не обрабатываете правильное сообщение для создания элемента управления! например, изменение SDK может вызвать ошибку. сообщение с идентификатором 1024 WM_USER, и система не обрабатывает его нормально. обработка этого сообщения зависит от кода пользователя

person BigBoss    schedule 25.09.2012