How to Send Information (String, Image, Record) Between Two Applications
http://delphi.about.com/od/windowsshellapi/a/wm_copydata.htm

here 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.
Here's the declaration and the description of the TCopyDataStruct record:
type
TCopyDataStruct = packed record
dwData : DWORD;
// up to 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. Here's how to send a string value over WM_CopyData:
procedure TSenderMainForm.SendString( );
var
stringToSend : string;
copyDataStruct : TCopyDataStruct;
begin
stringToSend := 'About Delphi Programming';
copyDataStruct.dwData := ; // use it to identify the message contents
copyDataStruct.cbData := + 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 = 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;
end; type
// 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; implementation procedure TReceiverMainForm.WMCopyData( var Msg : TWMCopyData );
var
s : string;
begin
s := PChar( Msg.CopyDataStruct.lpData );
// Send something back msg.Result := ;
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, here's 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 := ;
receivedImage.Picture.Bitmap.LoadFromStream( ms );
finally
ms.Free;
end;
end;
Downloadwm_copydata source code example.
How to Send Information (String, Image, Record) Between Two Applications的更多相关文章
- Java14版本特性【一文了解】
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- kafka客户端发布record(消息)
kafka客户端发布record(消息)到kafka集群. 新的生产者是线程安全的,在线程之间共享单个生产者实例,通常单例比多个实例要快. 一个简单的例子,使用producer发送一个有序的key/v ...
- Method and apparatus for encoding data to be self-describing by storing tag records describing said data terminated by a self-referential record
A computer-implemented method and apparatus in a computer system of processing data generated by a f ...
- 记录类型中String的释放
String能自动释放,在进行内存拷贝时需要进行手动释放.可以直接调用Finalize手工释放 如:TGraphicHideTab 记录中声明的Caption:string TGraphicHideT ...
- [LeetCode] Masking Personal Information 给个人信息打码
We are given a personal information string S, which may represent either an email address or a phone ...
- [Swift]LeetCode831. 隐藏个人信息 | Masking Personal Information
We are given a personal information string S, which may represent either an email address or a phone ...
- Masking Personal Information
Masking Personal Information We are given a personal information string S, which may represent eithe ...
- 【LeetCode】831. Masking Personal Information 解题报告(Python)
[LeetCode]831. Masking Personal Information 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzh ...
- Vertica 导出数据测试用例
需求:构建简单的测试用例,完成演示Vertica导出数据的功能. 测试用例:导出test业务用户t_jingyu表中的数据. 一.初始化测试环境 二.导出数据 2.1 vsql命令说明帮助 2.2 导 ...
随机推荐
- 【转】使用Xcode中的iOS SDK给iphone开发出第一个App程序
之前已经折腾过用Xcode开发OS X的程序了,现在继续折腾,用iOS SDK开发移动设备(iphone/ipad/ipod touch)的程序. 1.从iOS Developer Library中找 ...
- hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
题意: 告诉我们有m个任务和k个机器.第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束.每台机器每天可以执行一个任务.问,是否可以将所有的任务都按时完成? 输入: 首行输入一个整数t, ...
- python27+django1.9添加api
我们进入Python的交互 shell 并使用Django提供的API.要进入Python shell,使用python manage.py shell 使用这个而不是简单的输入"pytho ...
- python中的深拷贝与浅拷贝
深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...
- HTTP Post请求过程详解
摘要: HTTP(HyperText Transfer Protocol),超文本传输协议,是一个客户端和服务器端请求和应答的标准(TCP),客户端是终端用户,服务器端是网站. HTTP是基于Sock ...
- WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5
以下是我的程序(取自headfirst Java): import javax.sound.midi.*; public class MiniMiniMusicApp { public static ...
- WCF基礎
參考:http://www.cnblogs.com/MeteorSeed/archive/2012/04/24/2399455.html http://www.cnblogs.com/scy25114 ...
- python中基于descriptor的一些概念
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- Archlinux 踩坑实录
Archlinux 没声音 1. 排查驱动,声卡驱动没问题 2.排查alsa,alsa没问题(并确认声卡存在且取消静音) 3.抱着尝试的心态,安下VLC.然后提示找不到默认声卡设备(大概这个意思),通 ...
- 【解决】SAE部署Django1.6+MySQL
终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今天的工作吧. 1,装SVN 这个没什么好说的,去官 ...