Tuesday, March 17, 2020

Send Information Between Delphi Apps With WM_COPYDATA

Send Information Between Delphi Apps With WM_COPYDATA There are many situation when you need to allow for two applications to communicate. If you do not want to mess with TCP and sockets communication (because both applications are running on the same machine), you can *simply* send (and properly receive) a special Windows message: WM_COPYDATA. Since handling Windows messages in Delphi is simple, issuing a SendMessage API call along with the WM_CopyData filled with the data to be sent is quite straight forward. WM_CopyData and TCopyDataStruct The WM_COPYDATA message enables you to send data from one application to another. The receiving application receives the data in a TCopyDataStruct record. The TCopyDataStruct is defined in the Windows.pas unit and wraps the COPYDATASTRUCT structure that contains the data to be passed. Heres the declaration and the description of the TCopyDataStruct record: 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; Send a String over WM_CopyData For a Sender application to send data to Receiver the CopyDataStruct must be filled and passed using the SendMessage function. Heres how to send a string value over WM_CopyData: 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; The SendData custom function locates the receiver using the FindWindow API call: 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; In the code above, the Receiver application was found using the FindWindow API call by passing the class name of the main form (TReceiverMainForm) and the caption of the window (ReceiverMainForm). Note: The SendMessage returns an integer value assigned by the code that handled the WM_CopyData message. Handling WM_CopyData - Receiving a String The Receiver application handles the WM_CopyData mesage as in: 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; The TWMCopyData record is declared as: 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; Sending String, Custom Record or an Image? The accompanying source code demonstrates how to send a string, record (complex data type) and even graphics (bitmap) to another application. If you cannot wait the download, heres how to send a TBitmap graphics: 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; And how to receive it: 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;

Sunday, March 1, 2020

Word Choice Rout vs. Route - Proofread My Papers Academic Blog

Word Choice Rout vs. Route - Proofread My Papers Academic Blog Word Choice: Rout vs. Route Ah, the English language, will you ever stop confusing us? Why, for instance, would anyone think it’s a good idea to have two words which differ in meaning and sound different, but which are spelled almost identically? It beats us, yet that’s what we have with â€Å"rout† and â€Å"route.† It’s easy to get these words mixed up, especially because â€Å"rout† is not common in everyday speech. So, what is the difference? And which word should we use in any given instance? Rout (Lose Badly) The word â€Å"rout† is commonly associated with battles, as it means â€Å"a disorderly retreat.† Thus, if an army is defeated and forced to run, we say it was â€Å"routed† (â€Å"rout† can be used as either a noun or a verb): During World War II, the French Army was routed at the Battle of Sedan. A more modern use of â€Å"rout† is to mean â€Å"an overwhelming defeat†: In 1990, the 49ers routed the Broncos 55-10 in the Super Bowl. To the best of our knowledge, however, sporting routs rarely end in the losing team making a disorderly retreat from the field of play. Route (Go Places) If nothing else, you’ll probably know the word â€Å"route† from the US Highway System. This, in fact, is a big clue to the main meaning of â€Å"route,† which is â€Å"a road or passage of travel†: If you ever plan to motor west Travel my way, take the highway that is best Get your kicks on Route Sixty-Six As well as major travel routes, the word â€Å"route† is used for any regular round of stops, such as a â€Å"paper route.† Furthermore, â€Å"route† can be used as a verb meaning â€Å"direct something†: Because of the accident, traffic was routed away from the town center. In both cases, the essence of â€Å"route† is always to do with traveling or following a particular course. Rout or Route? In everyday life, you’re more likely to need â€Å"route† than â€Å"rout.† But if you’re discussing a battle or an overwhelming defeat in sport, you might need to use â€Å"rout.† Remember: Rout = An overwhelming defeat and/or disorderly retreat Route = A road or regular passage of travel Be careful when using the past tense with these words, though, as both are spelled routed.