2009-10-31 52 views
0

可以说我有这个类在foobar的-shared.lib:我可以使用WM_COPYDATA复制一个非结构体吗?

class FooBar { 
    std::string m_helloWorld; 
} 

而且我在foobar的-from.exe使用SendCopyData像这样的电话:从foobar-

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); 
} 

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

回答

2

你是正确的和不正确的。

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

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

(认为WM_COPYDATA就像是通过网络发送数据:你应该在野外发送之前对其进行序列化类的护理...)

相关问题