태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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;

}

위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!

Write your message and submit
« PREV : 1 : ... 56 : 57 : 58 : 59 : 60 : 61 : 62 : 63 : 64 : ... 432 : NEXT »