본문 바로가기
Delphi Tip/+Tip

프로그램간 메세지 전송

by MonoSoft 2022. 4. 11.
728x90
반응형

프로그램간 메세지 전송

 

1. 개요

   - 독립된 다른 응용 프로그램간의 메시지 교환을 통해 프로그램을 제어 해 본다.

 

2. 처리 방법

   - Windows의 메시지인 WM_COPYDATA 를 이용한다.

   - 데이터 교환을 위해 CopyDataStruct 구조체를 이용한다.

   - SendMessage API를 이용한다.

   가. 메시지를 교환 하고자 하는 델파이 프로젝트 양쪽의 

        유닛에 messages 를 Uses 절에 추가한다.

   나. 메시지를 보내는 쪽 Unit

  - 메시지를 받을 응용 프로그램의 핸들을 얻는다. (FindWindow 이용)

  - CopyDataStruct 구조체에 보낼 정보를 채운다.
  - SendMessage를 이용해 받는쪽 윈도우 핸들에 

    WM_CopyData 메시지를   CopyDataStruct 구조체와 함께 보낸다.

  - 처리는 보내는 프로시저 또는 함수를 별도로 만들어서 보내거나, 

    버튼 클릭 이벤트에 직접 코딩해도 된다.

처리 예 : 버튼 클릭 이벤트에 직접 작성

     - 파일명을 보내서 받는 쪽에서 해당 파일의 내용을 메모장에 읽도록 한다

 

var

  hwnd: THandle;

  DataStruct: CopyDataStruct;

begin

  //받을 윈도우 핸들을 윈도우 폼 이름을 이용해 찾는다.

  hwnd := FindWindow('TMyForm', nil); 

  if hwnd <> 0 then

  begin

    DataStruct.dwData := 0;

    // 보낼 데이터 길이

    DataStruct.cbData := length(Ed_Filename.Text) + 1;  

    // 보내고자 하는 데이터(예:파일명)

    DataStruct.lpData := PChar(Ed_Filename.Text); 


    // 받을 응용 프로그램의 폼을 활성화 시킨다

       (이 명령은 안해도 됨, 받는 윈도우를 Active시킬 필요가 

         있다면 하세요)

    SetForegroundWindow(hwnd);

    // SendMessage로 메시지를 보낸다.

    // SendMessage는 받는 쪽에서 메시지를 받아서 처리해야만 

       제어가 다시 넘어온다(동기모드).

    // 메시지를 보내기만 하고 받는 쪽에서 처리하던지 말던지 

       상관 없다면 PostMessage를 이용하도록 한다(비동기모드).

    SendMessage(hwnd, wm_CopyData, 

                            Form1.Handle, Integer (@DataStruct));

  end;

end;

 

다. 메시지를 받아서 처리하는 쪽 Unit

 

-  선언 -

procedure CopyData(var Msg: TWMCopyData);message wm_CopyData;

 

- 구현 -

procedure TMyForm.CopyData(var Msg: TWmCopyData);

var

  Filename: String;

begin

  // 옵션 : 현재 프로그램이 최소화(아이콘)되어 있는 

     상태라면 폼을 원복 시킨다

  if IsIconic(Application.Handle) then

    Application.Restore;

 

  // 받은 메시지를 추출한다.

  Filename := PChar(Msg.CopyDataStruct.lpData);

  // 받은 파일을 열어서 RichEdit 컴포넌트에 불러온다.

  try

    RichEdit1.Lines.LoadFromFile(Filename);

  except

      MessageDlg('Invalid file', mtWarning, [mbOK], 0);

  end;

end;

 

728x90
반응형

댓글