> ## Content Index
> Fetch the complete content index at: https://suitmyself.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Send Data between Process
- URL: https://suitmyself.com/send-data-between-process/
- Published: 2023-05-15T06:05:59.000Z
- Updated: 2026-09-16T03:19:01.000Z
- Author: Benjamin Kim
- Tags: Programming, #Import 2026-09-15 05:58

[WM\_COPYDATA AND TCOPYDATASTRUCT](https://www.thoughtco.com/send-information-between-applications-1058476?ref=suitmyself.com)

위링크의 내용을 간략하게 번역해두었습니다.

WM\_COPYDATA 메시지를 사용하면 한 응용 프로그램에서 다른 응용 프로그램으로 데이터를 보낼 수 있습니다. 수신 응용 프로그램은 TCopyDataStruct 레코드로 데이터를 수신합니다. TCopyDataStruct는 Windows.pas 유닛에 정의되어 있으며 전달할 데이터가 들어있는 COPYDATASTRUCT 구조체를 래핑합니다.

다음은 TCopyDataStruct 레코드의 선언과 설명입니다.

```pascaligo
 type
 TCopyDataStruct = packed record
 dwData: DWORD; //up to 32 bits of data to be passed to the receiving application
 cbData: DWORD; //the size, in bytes, of the data pointed to by the lpData member
 lpData: Pointer; //Points to data to be passed to the receiving application. This member can be nil.
 end; 

```

WM\_COPYDATA 이용하여 문자열 전송하기

Sender프로세스에서 Receiver에게 데이터를 보내려면 CopyDataStruct 에 변수를 저장하여 SendMessage 함수를 사용하여 전달해야합니다. WM\_CopyData에 문자열 값을 보내는 방법은 다음과 같습니다.

```pascaligo
 procedure TSenderMainForm.SendString() ;
 var
 stringToSend : string;
 copyDataStruct : TCopyDataStruct;
 begin
 stringToSend := 'About Delphi Programming';

 copyDataStruct.dwData := 0; //use it to identify the message contents
 copyDataStruct.cbData := 1 + Length(stringToSend) ;
 copyDataStruct.lpData := PChar(stringToSend) ;

 SendData(copyDataStruct) ;
 end;

```

SendData 사용자 지정 함수는 FindWindow API 호출을 사용하여 Receiver 프로세스를 찾습니다.

```pascaligo
 procedure TSenderMainForm.SendData(const copyDataStruct: TCopyDataStruct) ;
 var
   receiverHandle : THandle;
   res : integer;
 begin
   receiverHandle := FindWindow(PChar('TReceiverMainForm'),PChar('ReceiverMainForm')) ;
   if receiverHandle = 0 then
   begin
     ShowMessage('CopyData Receiver NOT found!') ;
     Exit;
   end;

   res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct)) ;
 end;

```

위의 코드에서 기본 폼 ( "TReceiverMainForm")의 클래스 이름과 Windows 캡션 ( "ReceiverMainForm")을 전달하여 FindWindow API 호출을 사용하여 Receiver 어플리케이션을 찾았습니다.

참고 : SendMessage는 WM\_CopyData 메시지를 처리하는 코드에서 할당 한 정수 값을 반환합니다.

HANDLING WM\_COPYDATA - RECEIVING A STRING

Receiver 어플리케이션은 다음과 같이 WM\_CopyData 메시지를 처리합니다.

```pascaligo
 type
 TReceiverMainForm = class(TForm)
 private
 procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
 ...
 implementation
 ...
 procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData) ;
 var
 s : string;
 begin
 s := PChar(Msg.CopyDataStruct.lpData) ;

 //Send something back
 msg.Result := 2006;
 end;

```

TWMCopyData 레코드는 다음과 같이 선언됩니다.

```pascaligo
 TWMCopyData = packed record
 Msg: Cardinal;
 From: HWND;//Handle of the Window that passed the data
 CopyDataStruct: PCopyDataStruct; //data passed
 Result: Longint;//Use it to send a value back to the "Sender"
 end;

```

문자열 전송, 일반화된 레코드 or 이미지?  
아래 소스 코드는 문자열, 레코드(복합 데이터 형식) 및 그래픽 (비트맵)을 다른 어플리케이션으로 보내는 방법을 보여줍니다.

다운로드를 기다릴 수없는 경우 TBitmap 그래픽을 보내는 방법은 다음과 같습니다.

```pascaligo
 procedure TSenderMainForm.SendImage() ;
 var
 ms : TMemoryStream;
 bmp : TBitmap;
 copyDataStruct : TCopyDataStruct;
 begin
 ms := TMemoryStream.Create;
 try
 bmp := self.GetFormImage;
 try
 bmp.SaveToStream(ms) ;
 finally
 bmp.Free;
 end;

 copyDataStruct.dwData := Integer(cdtImage) ; // identify the data
 copyDataStruct.cbData := ms.Size;
 copyDataStruct.lpData := ms.Memory;

 SendData(copyDataStruct) ;
 finally
 ms.Free;
 end;
 end;

```

받는 방법 :

```pascaligo
 procedure TReceiverMainForm.HandleCopyDataImage(
 copyDataStruct: PCopyDataStruct) ;
 var
 ms: TMemoryStream;
 begin
 ms := TMemoryStream.Create;
 try
 ms.Write(copyDataStruct.lpData^, copyDataStruct.cbData) ;
 ms.Position := 0;
 receivedImage.Picture.Bitmap.LoadFromStream(ms) ;
 finally
 ms.Free;
 end;
 end;

```

[Message in the Bottle](https://www.thoughtco.com/message-in-the-bottle-1058444?ref=suitmyself.com)  
[Monitoring Registry Changes](http://forum.codecall.net/topic/66869-monitoring-registry-changes/?ref=suitmyself.com)  
[API hooking revealed](https://www.codeproject.com/Articles/2082/API-hooking-revealed?ref=suitmyself.com)  
[How to monitor directory / file changes on network share](https://forum.lazarus.freepascal.org/index.php?topic=37371.0&ref=suitmyself.com)  
[Change Notifier Component Example](http://www.shellplus.com/examples/change-notifier/change-notifier-example.html?ref=suitmyself.com)  
[How can I increase a performance of standard TTreeView/TListView?](http://www.scalabium.com/faq/dct0110.htm?ref=suitmyself.com)