foobar-shared.lib にこのクラスがあるとしましょう:
class FooBar {
std::string m_helloWorld;
}
そして、次のように SendCopyData を使用して foobar-from.exe を呼び出します。
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によると、「渡されるデータには、データを受信するアプリケーションがアクセスできないオブジェクトへのポインターやその他の参照が含まれていてはなりません。」したがって、これは構造体データでのみ可能であると思われます。私は正しいですか?