【发布时间】:2011-05-30 20:39:31
【问题描述】:
我正在编写一个小型包装器来熟悉 C++ 中的一些重要主题(WinAPI、COM、STL、OOP)。现在,我的班级应该能够创建一个(子)窗口。 主要是,这个窗口连接到一个全局消息循环,该循环将消息分发到正确实例的本地循环(全局是静态的,本地是虚拟的)。
显然,肯定有更好的方法可以做到这一点,但我使用 std::maps 成对存储 HWND 及其实例指针(全局循环使用 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;
好的,因为你在这里要求更多代码:
实际上我没有导入 DLL,因为我使用的是 COM。 ` HRESULT hr = S_OK; int retval = 1; 味精味精 = {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”之前运行良好。
【问题讨论】:
-
没有地图不会造成任何问题;既不在类中,也不在 DLL 中。根据您的描述,似乎没有编译时或运行时错误——只是您返回的值不是您期望存储在地图中的值。你能再分享一些代码吗?
-
非常不清楚。你真的在使用DLL吗?一切都是用相同的设置编译的吗?你在用 /MD 吗?
-
@Jay Walker:是的,实际上没有编译错误。最初它甚至可以处理那个奇怪的错误。我还能够建立一个窗口。那时的值实际上还可以,但直到现在我才得到奇怪的结果(闪烁和滞后)。 @Hans Pasant:是的,我使用 DLL 构建(COM-Object)。