Strings Delphi

Title: transfer strings, images (streams) between processes?
{
TheWM_COPYDATAmessagesmakesitpossibletotransferinformation
betweenprocesses.Itdoesthisbypassingthedatathroughthekernel.
Spaceisallocatedinthereceivingprocesstoholdtheinformationthatiscopied,
bythekernel,fromthesourceprocesstothetargetprocess.
ThesenderpassesapointertoaCOPYDATASTRUCT,whichisdefinedasastructure
ofthefollowing:
}
{
MitderWindows-NachrichtWM_COPYDATAistesunter32Bit-Windowsmglich,
DatenverschiedensterNaturzwischenunterschiedlichenProzessenauszutauschen.
EineWindows-interneFunktionalittermglichtbeiVerwendungvonWM_COPYDATAdieNutzung
einesgemeinsamenSpeicherbereichsbereineDatenstrukturCOPYDATASTRUCT,
diewiefolgtaussieht:
}
type
TCopyDataStruct=packedrecord
dwData:DWORD;//anwendungsspezifischerWert
cbData:DWORD;//Byte-LngederzubertragendenDaten
lpData:Pointer;//AdressederDaten
end;
{
DabeigeschiehtderDatenaustauschauffolgendeWeise
(ZitatausJ.Richter,"WindowsProgrammierungfrExperten",
MicrosoftPress1997,S.524):
"BeimSendeneinerMeldungdesTypsWM_COPYDATAreserviertdieFunktionSendMessage
einenSpeicherbereichderangegebenenGre(cbDataBytes)undkopiertdieDaten
vomAdreraumihresProzessesinebendiesenSpeicherbereich.DanachsendetSendMessage
dieMeldungandasausgewhlteFenster.WennschlielichdieempfangendeFensterprozedur
mitderBearbeitungderMeldungbeginnt,verweistderParameterlParamaufeine
COPYDATASTRUCT-StrukturimAdreraumdesempfangendenProzesses.
DielpData-KomponentederStrukturverweistaufdengemeinsamen
Speicherbereich,dessenAdressejedochandenAdreraumdes
empfangendenProzessesangepatwordenist.
}
}
{SenderApplication}
{SenderApplikation}
unitSenderApp;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls,ExtCtrls;
type
TForm1=class(TForm)
Button1:TButton;
Edit1:TEdit;
Button2:TButton;
Image1:TImage;
procedureButton1Click(Sender:TObject);
procedureButton2Click(Sender:TObject);
private
procedureSendCopyData(hTargetWnd:HWND;ACopyDataStruct:TCopyDataStruct);
public
end;
var
Form1:TForm1;
implementation
{$R*.DFM}
//Sender:Senddata
//Sender:Datenschicken
procedureTForm1.SendCopyData(hTargetWnd:HWND;ACopyDataStruct:TCopyDataStruct);
begin
ifhTargetWnd0then
SendMessage(hTargetWnd,WM_COPYDATA,Longint(Handle),Longint(@ACopyDataStruct))
else
ShowMessage('NoRecipientfound!');
end;
//SendTextfromEdit1tootherapp
//TextvonEdit1anandereAnwendungschicken
procedureTForm1.Button1Click(Sender:TObject);
var
MyCopyDataStruct:TCopyDataStruct;
hTargetWnd:HWND;
begin
//SetupaCOPYDATASTRUCTstructureforusewithWM_COPYDATA
//TCopyDataStructmitdenSende-DatenInfosausfllen
withMyCopyDataStructdo
begin
dwData:=0;//mayuseavaluedoidentifycontentofmessage
cbData:=StrLen(PChar(Edit1.Text))+1;//Needtotransferterminating#0aswell
lpData:=PChar(Edit1.Text)
end;
//FindthedestinationwindowfortheWM_COPYDATAmessage
//EmpfngerFensteranhanddesTitelzeilentextessuchen
hTargetWnd:=FindWindow(nil,PChar('MessageReceiver'));
//sendthestructuretothereceiver
//DieStrukturandenEmpfngerschicken
SendCopyData(hTargetWnd,MyCopyDataStruct);
end;
//SendImage1tootherapp
//Image1anandereAnwendungschicken
procedureTForm1.Button2Click(Sender:TObject);
var
ms:TMemoryStream;
MyCopyDataStruct:TCopyDataStruct;
hTargetWnd:HWND;
begin
ms:=TMemoryStream.Create;
try
image1.Picture.Bitmap.SaveToStream(ms);
withMyCopyDataStructdo
begin
dwData:=1;
cbData:=ms.Size;
lpData:=ms.Memory;
end;
//Searchwindowbythewindowtitle
//EmpfngerFensteranhanddesTitelzeilentextessuchen
hTargetWnd:=FindWindow(nil,PChar('MessageReceiver'));
//SendtheData
//DatenSenden
SendCopyData(hTargetWnd,MyCopyDataStruct);
finally
ms.Free;
end;
end;
end.
{*********************************************************************}
{ReceiverApplication}
{EmpfngerApplication}
unitReceiverApp;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
ExtCtrls,StdCtrls;
type
TForm1=class(TForm)
Image1:TImage;
Label1:TLabel;
private
procedureWMCopyData(varMsg:TWMCopyData);messageWM_COPYDATA;
{Private-Deklarationen}
public
{Public-Deklarationen}
end;
var
Form1:TForm1;
implementation
{$R*.DFM}
procedureTForm1.WMCopyData(varMsg:TWMCopyData);
var
sText:array[0..99]ofChar;
ms:TMemoryStream;
begin
caseMsg.CopyDataStruct.dwDataof
0:{ReceiveText,Textempfangen}
begin
StrLCopy(sText,Msg.CopyDataStruct.lpData,Msg.CopyDataStruct.cbData);
label1.Caption:=sText;
end;
1:{ReceiveImage,Bildempfangen}
begin
ms:=TMemoryStream.Create;
try
withMsg.CopyDataStruct^do
ms.Write(lpdata^,cbdata);
ms.Position:=0;
image1.Picture.Bitmap.LoadFromStream(ms);
finally
ms.Free;
end;
end;
end;
end;
end.