【问题标题】:COM-Objects containing maps / content error(0)包含地图/内容错误的 COM 对象 (0)
【发布时间】: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)。

标签: c++ dll com maps wrapper


【解决方案1】:

没有看到您具体如何使用 DLL,我只能推测您正在使用静态链接到 DLL 中的 C++ 运行时库。这意味着每个 DLL 分配的内存分配在与主运行程序分开的堆上。您要么必须更改 DLL 上的链接,以便只有一个 C++ 运行时库的共享副本,要么为位于特定位置的映射创建分配器,以便映射仅使用一个运行时库进行分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多