глобальные проблемы инициализации сервера std :: unordered_map com - PullRequest
2 голосов
/ 06 июня 2010

Я хочу иметь статический глобальный std :: unordered_map в cpp моей точки входа для моего COM-сервера.

соответствующий код заголовка:

typedef unordered_map<HWND,IMyInterface*> MyMapType;

соответствующий орган:

static MyMapType MyMap;

void MyFunction(HWND hWnd, IMyInterface* pObj){
    MyMap[hWnd] = pObj;
}

HINSTANCE g_hInstModule = NULL;
BOOL WINAPI DllMain ( __in HINSTANCE hInstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved )
{
    if( fdwReason == DLL_PROCESS_ATTACH )
    {
        g_hInstModule = hInstDLL;
        return true;
    }
    else if( fdwReason == DLL_PROCESS_DETACH )
    {
        return true;
    }
    return false;
}

MyCoClass::MyCoClass()
{
    DRM_Refcount = 1;
}

HRESULT STDMETHODCALLTYPE MyCoClass::InitMyCoClass()
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    //replace with make window code
    MyFunction(hWnd,ISomeInterface);
    return S_OK;
}

Единственный способ заставить это работать - создать указатель map_type и создать экземпляр map_type в куче и указать на него глобальным указателем. : /

Почему?

1 Ответ

0 голосов
/ 06 июня 2010

Вам нужно изменить DllMain для явной инициализации среды выполнения C: http://support.microsoft.com/kb/814472

Поиск "Чтобы изменить DLL на основе COM"

Статические объекты с конструкторами обычно инициализируются через точку входа CRT, которая для .exes затем вызывает основную функцию вашей программы. С DLL вы должны работать самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...