Using Data Copy
The following example demonstrates how to send information between two applications using the WM_COPYDATA message.
The sending application displays a dialog box to the user which requests certain information. The application packages the information into a private data structure, includes a pointer to the structure in the COPYDATASTRUCT structure, and sends the information to the receiving application using the WM_COPYDATA message. The receiving application has a hidden window with the class name Disp32Class.
// ************ Globals ************ // #define MYDISPLAY 1 typedef struct tagMYREC { char s1[80]; char s2[80]; DWORD n; } MYREC; COPYDATASTRUCT MyCDS; MYREC MyRec; HRESULT hResult; BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM ); // ************ Code fragment **************** // Get data from user. InfoDlgProc stores the information in MyRec. // DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc ); // // Copy data into structure to be passed via WM_COPYDATA. // Also, we assume that truncation of the data is acceptable. // hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName ); if (hResult != S_OK) return False; hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName ); if (hResult != S_OK) return False; MyRec.n = nAge; // // Fill the COPYDATA structure // MyCDS.dwData = MYPRINT; // function identifier MyCDS.cbData = sizeof( MyRec ); // size of data MyCDS.lpData = &MyRec; // data structure // // Call function, passing data in &MyCDS // hwDispatch = FindWindow( "Disp32Class", "Hidden Window" ); if( hwDispatch != NULL ) SendMessage( hwDispatch, WM_COPYDATA, (WPARAM)(HWND) hWnd, (LPARAM) (LPVOID) &MyCDS ); else MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
The receiving application has a hidden window which receives the information from WM_COPYDATA and displays it to the user.
// ************ Globals ************ // #define MYDISPLAY 1 typedef struct tagMYREC { char s1[80]; char s2[80]; DWORD n; } MYREC; PCOPYDATASTRUCT pMyCDS; void WINAPI MyDisplay( LPSTR, LPSTR, DWORD ); // // ************ Code fragment **************** // case WM_COPYDATA: pMyCDS = (PCOPYDATASTRUCT) lParam; switch( pMyCDS->dwData ) { case MYDISPLAY: MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1, (LPSTR) ((MYREC *)(pMyCDS->lpData))->s2, (DWORD) ((MYREC *)(pMyCDS->lpData))->n ); } break;