假设我在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,“传递的数据不得包含对接收数据的应用程序无法访问的对象的指针或其他引用。”所以我怀疑这只适用于struct数据。我是对的吗?
答案 0 :(得分:2)
你是正确和错误的。
你的问题是你不知道std :: string的实现细节。不幸的是,似乎这个(标准)类使用动态分配的缓冲区来存储其字符数据。这就是为什么WM_COPYDATA
无法使用它。
但如果您的类不包含指向任何外部数据的指针(如文档中所示),那么使用WM_COPYDATA
复制它是完全有效的。不幸的是,这极大地限制了班级成员的可能类型。
(想想WM_COPYDATA
就像通过网络发送数据一样:你应该先把你的课程序列化,然后再将它发送出去......)