wm_copydata 예제

WM_COPYDATA 블록 내의 모든 것이 블록의 일부여야 합니다. 포인터를 무언가에 전달하는 데 사용할 수 없습니다. 예를 들어 문자열 자체가 보낸 사람의 주소 공간에 계속 있기 때문에 WM_COPYDATA 블록에서 CString 변수를 전달하는 것은 치명적인 오류입니다. 복잡한 구조를 전달해야 하는 경우 WM_COPYDATA 블록의 모든 포인터를 데이터 블록의 내용을 참조하는 포인터를 기반으로 만들어야 합니다. 그것은 언젠가 쓸 수 있는 에세이입니다. 이 통신 방법에는 중요한 문제가 있습니다 – WM_COPYDATA 메시지는 의도한 보낸 사람 이외의 응용 프로그램에서 생성될 수 있으므로 메시지의 위치를 확인하는 몇 가지 방법을 구현해야 합니다. 가장 간단한 것은 고유한 데이터 시퀀스를 데이터 배열에 붙인 다음 일치하는지 확인합니다. 예를 들어 온도 제어 소프트웨어에서 처음 16바이트는 메시지의 위치를 나타냅니다. 수신된 메시지의 데이터가 일치하지 않으면 무시되고 기본 창 프로시저로 전달됩니다. 이 사람은 정확히이 문제를 설명하는 좋은 페이지가 있습니다.

다음은 내가 보내는 메시지의 종류입니다. 이 경우 자체 프로세스로 보냈지만 프로세스 경계를 넘어 동일하게 작동합니다. 처음 16바이트는 GUID이며 나중에 표시됩니다. 세 개의 다른 버튼이 있습니다. 다음 예제에서는 WM_COPYDATA 메시지를 사용하여 두 응용 프로그램 간에 정보를 보내는 방법을 보여 줍니다. HWND_BROADCAST를 대상 창으로 사용하면 모든 창에 메시지가 전송됩니다. 이 예제에서는 프로그램의 복사본이 두 개 실행중이고 왼쪽 위 창은 오른쪽 아래 창과 동일한 데이터를 수신합니다. 그러나 데스크톱의 다른 모든 응용 프로그램 창에서 이 메시지가 수신되었습니다.

나는 운이 좋았다. 그들 중 누구도 WM_COPYDATA에 의해 방해받지 않았습니다. 항상 그렇지는 않습니다. 따라서 HWND_BROADCAST를 사용하여 이와 같은 메시지를 보내는 것은 심각한 반사회적 행위로 간주됩니다. 내 파일을 다운로드하고 HWND_BROADCAST를 사용하여 보내려고 하면(브로드캐스트 상자 선택), 실행 중인 프로그램이 충돌할 수 있습니다. 그렇다면, 그것은 당신에게 교훈이 될 수 있습니다. 수신 응용 프로그램에는 WM_COPYDATA에서 정보를 수신하고 사용자에게 표시하는 숨겨진 창이 있습니다. 수신 코드는 상태 상자에 메시지를 로드하는 코드를 뺀 다음 매우 간단합니다: 수신 응용 프로그램이 이 메시지를 처리하는 경우 TRUE를 반환해야 합니다. 그렇지 않으면 FALSE를 반환해야 합니다.