Mega Code Archive

 
Categories / Delphi / Strings
 

Transfer strings, images (streams) between processes

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.