Windows IPC - WM_COPYDATA
Posted 2009/04/24 01:27|
|
|
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
WM_COPYDATA
- 사용하기 쉽다
- 포인터로 전달 가능(메모리 복사)
- 메모리의 제약이 없음
- 내부적으로 메모리 맵 파일을 사용하여 통신하는것임
- 간단한 데이터를 보낼때 사용
--------------------------------- IPC_A.exe ----------------------------------- 데이터를 보내는 프로그램 #include <windows.h> #include <stdio.h> void main() { HWND hwnd = FindWindow(0, "B"); if(hwnd == 0) { printf("B를 먼저 실행하세요\n"); return ; } //------------------------------------------------------------ while(1) { char buf[1024]; scanf("%s", buf); // 현재 프로세스의 메모리를 통채로 다른 프로세스로 // 보내고 싶다면!! COPYDATASTRUCT cds; cds.cbData = 1024; // 보낼 메모리 크기 cds.dwData = 1; // 식별자 cds.lpData = buf; // WM_COPYDATA를 보내면 내부적으로 CDS안에 있는 // 메모리를 통채로 // 상대 프로세스에 전달해준다. SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&cds); } } // 주의 WM_COPYDATA는 Send로만 보낼수 있다. Post로는 전달할 수 없다. -------------------------------- B.exe ------------------------------------- 데이터를 받는 프로그램 #pragma comment(linker, "/subsystem:windows") #include <windows.h> LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CREATE: return 0; case WM_COPYDATA: { COPYDATASTRUCT *p = (COPYDATASTRUCT*)lParam; if(p->dwData == 1) // 식별자 확인 { char *temp = (char*)p->lpData; MessageBox(0, temp, "도착한 data", MB_OK); } } return 0; // B를 먼저 실행하세요.. // 그리고 A를 실행한 후에 문자열을 넣고 Enter... case WM_LBUTTONDOWN: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc( hwnd, msg, wParam, lParam); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { ATOM atom; WNDCLASS wc; HWND hwnd; MSG msg; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground= (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.hCursor = LoadCursor( 0, IDC_ARROW ); wc.hIcon = LoadIcon( 0, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName= "B"; wc.lpszMenuName = 0; wc.style = 0; atom = RegisterClass( &wc); if ( atom == 0 ) { MessageBox( 0, "Fail To RegisterClass", "Error", MB_OK); return 0; } hwnd = CreateWindowEx( 0, "B", "B", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT,0, 0, 0, hInstance, 0); ShowWindow( hwnd, nShowCmd); UpdateWindow( hwnd ); while ( GetMessage( &msg, 0, 0, 0) ) { TranslateMessage(&msg); DispatchMessage( &msg); } return 0; }
위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
- Filed under : 프로그래밍/MFC & Win32
- Comment Trackback

