0

假设我在 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的说法,“传递的数据不得包含指向接收数据的应用程序无法访问的对象的指针或其他引用。” 所以我怀疑这只有结构数据才有可能。我对么?

4

1 回答 1

2

你是正确的和不正确的。

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

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

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

于 2009-10-31T14:55:55.353 回答