2010-01-09 6 views
2

COPYDATASTRUCT를 사용하여 다른 응용 프로그램에 VARIANT 값을 보내야합니다. 다음은 메시지를 보내는 데 사용하는 구조입니다.COPYDATASTRUCT를 통해 VARIANT_bstr을 보내는 방법

struct { 
    int  i_MsgId; 
    VARIANT variant_Value; 
}Message; 

내 코드에서 VARIANT를 초기화하여 BSTR을 입력하고 다음과 같이 문자열을 할당합니다.

Message structMessage; 
VariantInit(&structMessage.variant_Value); 
structMessage.var_Value.vt = VT_BSTR; 

structMessage.variant_Value.bstrVal = ::SysAllocString(L"I am a happy BSTR"); 

그런 다음 COPYDATASTRUCT를 사용하여 다음과 같이 보냅니다. 내가 원래 구조체로 다시 캐스팅 할 때

COPYDATASTRUCT structCDS; 

structCDS.cbData = sizeof(structMessage); 
structCDS.dwData = 12; 
structCDS.lpData = (LPVOID)(&structMessage); 

::SendMessage(this->m_RemoteWindow,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&structCDS); 

이 메시지가 성공적으로 내 두 번째 응용 프로그램에 수신하지만, 는 "bstrVal는"나쁜 포인터을 나타냅니다.

나는이 오류로 어려움을 겪고 있으므로 귀중한 도움을 기대합니다. 다른 varinat 유형 (int, double)은 성공적으로 변환 될 수 있으며이 오류는 bstr에서만 발생합니다. :(

는 감사

답변

0

WM_COPYDATA는 데이터 구조를 다른 응용 프로그램에 의해 액세스 할 수 데이터 구조의 내부에 포함 된 다른 응용 프로그램입니다. 아무것도 (lpData에 의해 참조되는 하나)를 공유합니다. 그러나, bstrVal입니다 . 응용 프로그램에서 메모리를 참조하고, 다른 프로그램이이를 참조 할 때, 실패 할 것입니다 포인터 여기

하나의 해결책이다, 그것은 양쪽 측면에 별도의 작업이 필요 않습니다

보낸 사람에. 측면, 당신은 데이터 구조 (structMessage)를 할당 할 때 요를 잡아 충분한 여분의 공간을 추가 ur 문자열. 데이터 구조의 끝 부분에 문자열을 추가합니다 (dwData를 적절한 크기만큼 늘리십시오).

수신 측에서는 문자열을 검색하고 그 시점에서 SysAllocString 호출을 사용하여 bstrVal을 할당 할 수 있습니다. 완료되면 SysFree에 전화하는 것을 잊지 마십시오.

관련 문제