2009-10-31 5 views
0

이 클래스는 foobar-shared.lib에 있습니다.비 구조체를 복사하기 위해 WM_COPYDATA를 사용할 수 있습니까?

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 처리 :

구조체 때 FooBar 괜찮 았지만 이제는이 오류가 클래스 :

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

원래 내 fooBar 인스턴스가 스택에 있으므로 힙으로 이동하려고 시도했지만 약간 다른 오류가 발생했습니다 (필요한 경우 여기에 결과를 게시 할 수 있음).

MSDN에 따르면 "전달되는 데이터에는 데이터를 수신하는 응용 프로그램이 액세스 할 수없는 개체에 대한 포인터 또는 다른 참조가 없어야합니다." 그래서 이것은 struct 데이터에서만 가능하다고 생각합니다. 제가 맞습니까?

답변

2

당신은 정확하고 틀립니다.

여기에서 문제는 std :: string의 구현 세부 사항을 알 수 없다는 것입니다. 불행하게도이 표준 클래스는 문자 데이터를 저장하기 위해 동적으로 할당 된 버퍼를 사용합니다. 그렇기 때문에 WM_COPYDATA이 작동하지 않습니다.

하지만 클래스에 외부 데이터에 대한 포인터가 포함되어 있지 않은 경우 설명서에 제안 된대로 WM_COPYDATA을 사용하여 복사하는 것이 좋습니다. 불행히도, 이것은 클래스의 멤버에 대한 가능한 유형을 크게 제한합니다.

(WM_COPYDATA 네트워크를 통해 데이터를 전송 같은 생각 ... 당신은 야생에서 그것을 밖으로 보내기 전에 클래스를 직렬화의주의를 기울여야한다)

관련 문제