본문 바로가기
delphi

프로그램 간 메시지 전송을 위한 가이드

by doran365 2024. 8. 16.

Delphi에서 독립된 응용 프로그램 간의 메시지 교환은 개발자가 시스템 리소스를 최적화하고, 여러 프로그램이 상호작용할 수 있도록 하는 중요한 기술입니다. 이 가이드는 Windows 메시지 중 하나인 WM_COPYDATA를 활용하여 Delphi에서 다른 프로그램과 데이터를 교환하는 방법을 자세히 설명합니다.

WM_COPYDATA 메시지의 이해

WM_COPYDATA는 Windows 운영체제에서 제공하는 메시지로, 두 개의 독립된 응용 프로그램 간에 데이터를 전송할 때 사용됩니다. 이 메시지는 보통 구조체 형태로 데이터를 담아 전송하며, 이 구조체를 통해 필요한 정보를 주고받을 수 있습니다.

1. CopyDataStruct 구조체

이 메시지를 사용하기 위해서는 CopyDataStruct라는 구조체를 활용해야 합니다. 이 구조체는 데이터를 전송할 때 사용되며, 데이터의 유형, 크기 및 내용을 담고 있습니다.

type
  CopyDataStruct = record
    dwData: ULONG_PTR; // 사용자 정의 데이터 타입
    cbData: DWORD;     // 데이터의 크기 (바이트)
    lpData: Pointer;   // 데이터에 대한 포인터
  end;

2. 메시지를 보내는 프로그램

메시지를 보내는 프로그램에서는 수신 프로그램의 핸들을 찾아, 해당 핸들에 WM_COPYDATA 메시지와 함께 데이터를 전송해야 합니다.

2.1 핸들 얻기: FindWindow 함수 사용

메시지를 받을 프로그램의 핸들을 얻기 위해 Delphi의 FindWindow 함수를 사용합니다. 이 함수는 윈도우 클래스 이름 또는 윈도우 이름을 인자로 받아 핸들을 반환합니다.

var
  hwnd: THandle;
begin
  hwnd := FindWindow('TMyForm', nil);
  if hwnd <> 0 then
  begin
    // 메시지 전송 코드 실행
  end;
end;

2.2 데이터 전송: SendMessage 함수 사용

핸들을 얻은 후, CopyDataStruct 구조체를 채워 SendMessage 함수를 통해 메시지를 전송합니다.

var
  DataStruct: CopyDataStruct;
begin
  DataStruct.dwData := 0; // 사용자 정의 데이터 식별자
  DataStruct.cbData := Length(FileName) + 1; // 전송할 데이터의 크기
  DataStruct.lpData := PChar(FileName); // 전송할 데이터 포인터

  SendMessage(hwnd, WM_COPYDATA, Form1.Handle, Integer(@DataStruct));
end;

3. 메시지를 받는 프로그램

메시지를 받는 프로그램은 TWMCopyData 메시지를 처리하기 위해 특정 메시지 핸들러를 구현해야 합니다. 이 핸들러는 CopyDataStruct 구조체에 담긴 데이터를 추출하여 필요한 작업을 수행합니다.

3.1 메시지 핸들러 선언

TWMCopyData 메시지 핸들러를 선언합니다. 이 핸들러는 WM_COPYDATA 메시지를 수신하면 자동으로 호출됩니다.

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

3.2 메시지 핸들러 구현

핸들러에서는 CopyDataStruct 구조체를 이용하여 전송된 데이터를 추출하고, 이를 바탕으로 필요한 작업을 수행합니다.

procedure TMyForm.CopyData(var Msg: TWMCopyData);
var
  ReceivedData: string;
begin
  ReceivedData := PChar(Msg.CopyDataStruct.lpData); // 전송된 데이터 추출

  // 예: 추출한 데이터를 파일로 저장
  try
    RichEdit1.Lines.LoadFromFile(ReceivedData);
  except
    ShowMessage('Invalid file');
  end;
end;

Delphi 프로그램 간 메시지 전송의 이점

Delphi에서 프로그램 간 메시지 전송은 다양한 이점을 제공합니다. 이는 특히 여러 프로그램이 상호작용해야 하는 상황에서 유용합니다.

1. 리소스 최적화

프로그램 간 메시지 전송을 통해 데이터를 직접 교환함으로써, 불필요한 중간 저장소나 데이터 복사를 피할 수 있습니다. 이는 시스템 자원을 절약하고 프로그램의 성능을 향상시킵니다.

2. 유연한 응용 프로그램 통합

여러 응용 프로그램이 서로 다른 기능을 수행하면서도 데이터 교환이 필요할 때, 메시지 전송을 통해 이들을 유연하게 통합할 수 있습니다. 이는 복잡한 시스템을 보다 간결하게 유지하면서도 필요한 기능을 유지할 수 있도록 돕습니다.

3. 실시간 데이터 처리

WM_COPYDATA 메시지를 사용하면, 실시간으로 데이터를 처리할 수 있습니다. 이는 예를 들어, 한 프로그램에서 생성된 데이터를 다른 프로그램에서 즉시 처리해야 하는 경우에 특히 유용합니다.

실용적인 예제

이제 위에서 설명한 내용을 바탕으로 실제 Delphi 프로젝트에서 프로그램 간 메시지 전송을 구현하는 예제를 살펴보겠습니다.

1. 데이터 전송 프로그램

이 프로그램은 사용자가 지정한 파일명을 다른 프로그램으로 전송하여, 해당 프로그램이 파일을 열도록 요청합니다.

procedure TForm1.SendFileName;
var
  hwnd: THandle;
  DataStruct: CopyDataStruct;
begin
  hwnd := FindWindow('TMyForm', nil);
  if hwnd <> 0 then
  begin
    DataStruct.dwData := 0;
    DataStruct.cbData := Length(Edit1.Text) + 1;
    DataStruct.lpData := PChar(Edit1.Text);

    SendMessage(hwnd, WM_COPYDATA, Self.Handle, Integer(@DataStruct));
  end
  else
    ShowMessage('Target program not found');
end;

2. 데이터 수신 프로그램

이 프로그램은 전송된 파일명을 받아 파일을 열고 내용을 RichEdit 컴포넌트에 로드합니다.

procedure TMyForm.CopyData(var Msg: TWMCopyData);
var
  FileName: string;
begin
  FileName := PChar(Msg.CopyDataStruct.lpData);
  try
    RichEdit1.Lines.LoadFromFile(FileName);
  except
    ShowMessage('Error loading file: ' + FileName);
  end;
end;

3. 동기 및 비동기 메시지 전송

메시지를 전송할 때 SendMessage는 동기적으로 동작하며, 메시지를 받은 프로그램이 이를 처리할 때까지 대기합니다. 반면, PostMessage는 비동기적으로 동작하여, 메시지 전송 후 즉시 제어를 반환합니다.

SendMessage(hwnd, WM_COPYDATA, Form1.Handle, Integer(@DataStruct)); // 동기 전송

PostMessage(hwnd, WM_COPYDATA, Form1.Handle, Integer(@DataStruct)); // 비동기 전송

결론

Delphi에서 프로그램 간 메시지 전송은 복잡한 응용 프로그램 간의 데이터 통합과 실시간 처리에 필수적인 기술입니다. WM_COPYDATA 메시지와 CopyDataStruct 구조체를 이용하여, 두 개의 독립된 응용 프로그램 간에 데이터를 안전하게 교환할 수 있습니다. 이 가이드를 통해 Delphi에서 프로그램 간 메시지 전송을 구현하고, 더욱 효율적이고 유연한 프로그램을 개발해 보시기 바랍니다.