COM-объекты, содержащие карты / ошибка содержимого (0) - PullRequest
1 голос
/ 26 декабря 2010

Я пишу небольшую оболочку, чтобы ознакомиться с некоторыми важными темами в C ++ (WinAPI, COM, STL, OOP).На данный момент мой класс сможет создать (дочернее) окно.Главным образом, это окно связано с глобальным циклом сообщений, который распределяет сообщения в локальный цикл нужного экземпляра (глобальный - статический, локальный - виртуальный).

Очевидно, что есть, конечно, лучшие способы сделать это, но я использую std :: maps для хранения HWND и их указателя экземпляра парами (цикл Global ищет указатель с параметром HWND, получает самуказатель с карты и затем вызывает локальный цикл).

Теперь кажется, что карта не принимает никаких значений по неизвестной причине.Кажется, он выделяет достаточно места, но в любом случае что-то пошло не так [(ошибка) 0 отображается вместо записей в Visual C ++).

Я также посмотрел это в google и обнаружил, что карты вызывают некоторыепроблема при использовании в классах и DLL.Может ли это быть причиной и есть ли какое-либо решение ??

Защищенная область видимости класса: static std::map<HWND,MAP_BASE_OBJECT*> m_LoopBuf

Реализация в .cpp-файле: std::map<HWND,MAP_BASE_OBJECT*> HWindow::m_LoopBuf;

OK,потому что вы просили больше кода, вот вы:

Я на самом деле не импортирую DLL, потому что я использую COM.`HRESULT hr = S_OK;int retval = 1;MSG msg = {0};

IClassFactory* Class = NULL;
IWindow* Wnd= NULL;

hr = CoInitialize(NULL);

hr = CoCreateInstance(CLSID_IWindow,NULL,CLSCTX_INPROC_SERVER,IID_IWindow,(LPVOID*)&Wnd);

Wnd->CreateOverlappedWindow(L"My window",L"MyClass",250,250,250,250,0,0,0,0,0,hInst);

while (GetMessage(&msg,NULL,0,0)>0)
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

Wnd->Release();

return hr;

COM-объект IWindow реализован в классе HWindow (в DLL).Пример программы работает хорошо до "CreateOverlappedWindow".

1 Ответ

0 голосов
/ 26 декабря 2010

Не зная, как конкретно вы используете библиотеки DLL, я могу только предположить, что вы используете статические ссылки на библиотеку времени выполнения C ++ в своих библиотеках DLL. Это означает, что память, выделенная каждой DLL, выделяется в куче, отдельной от основной работающей программы. Вы должны либо изменить связывание в своих DLL, чтобы была только одна общая копия библиотеки времени выполнения C ++, либо создать распределитель для карты, которая находится в определенном месте, чтобы карта использовала только одну библиотеку времени выполнения для своих распределений.

...