【问题标题】:Can I use WM_COPYDATA to copy a non-struct?我可以使用 WM_COPYDATA 复制非结构吗?
【发布时间】:2009-10-31 14:36:28
【问题描述】:

假设我在 foobar-shared.lib 中有这个类:

class FooBar {
    std::string m_helloWorld;
}

我在 foobar-from.exe 中使用 SendCopyData 调用,如下所示:

extern HWND hMainWnd; // foobar-from.exe

{
FooBar fooBar;

HWND hWnd = FindAppWindow(); // foobar-to.exe
COPYDATASTRUCT cds;
cds.dwData = ('f'|('o'<<8)|('o'<<16));
cds.cbData = sizeof(FooBar);
cds.lpData = (LPVOID)fooBar;
SendCopyData(hWnd, (WPARAM)hMainWnd, (LPARAM)&cds);
}

当从 foobar-to.exe 时,我处理 OnCopyData:

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) {
    if (pCopyDataStruct->dwData==('f'|('o'<<8)|('o'<<16))) {
        FooBar fooBar = *(FooBar *)pCopyDataStruct->lpData;
    }
}

当 FooBar 是一个结构时,这工作得很好,但现在它是一个类,我得到了这个错误:

First-chance exception at 0x0064ef81 in foobar-to.exe: 0xC0000005: 
Access violation reading location 0x0231dd7c.

我最初认为这是因为我的 fooBar 实例在堆栈上,所以我尝试将它移到堆中,但得到了一个稍微不同的错误(如果需要,我可以在此处发布结果)。

根据MSDN,“传递的数据不得包含指针或其他对接收数据的应用程序无法访问的对象的引用。”所以我怀疑这只有结构数据才有可能。我说的对吗?

【问题讨论】:

    标签: winapi wm-copydata


    【解决方案1】:

    你是正确的和不正确的。

    你的问题是你不知道std::string的实现细节。不幸的是,这个(标准)类似乎使用动态分配的缓冲区来存储其字符数据。这就是为什么 WM_COPYDATA 不能使用它的原因。

    但如果您的类不包含指向任何外部数据的指针,如文档中所建议的,那么使用WM_COPYDATA 复制它是完全有效的。不幸的是,这极大地限制了您班级成员的可能类型。

    (认为WM_COPYDATA 就像通过网络发送数据:在将其发送出去之前,您应该注意序列化您的类...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2020-11-21
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2019-08-14
      相关资源
      最近更新 更多