Win9x下程序间的数据传递

原创 2005年03月03日 11:31:00
大家知道在Window 9x中一个应用程序不能直接访问另一个程序的内存地址,因为WIN9x为每个运行中的进程提供了自己的虚拟空间,这起到了很好的保护作用,然而,它也使得两个程序间不能轻易的交换数据,但是这并不是说程序间就一定不能进行数据传送了,Win9x为我们提供了几个特殊的方法来实现这个目的,如通过Windows消息WM_CopyData 和存储影响文件等方法。
使用消息WM_CopyData传送需要传递的数据缓冲区的内存地址,前面讲过,我们不能从一个应用程序向另一个程序发送内存块的地址,因为一个虚拟存储空间中的地址在另一个地址空间中没有意义。但是WM_CopyData消息回在后台执行一些特殊操作之后在传递数据,因此我们能够在接受方得到正确的地址。该消息使用时需要传递正在发送消息的窗口的句柄,及一个指TCopyDataStruct结构的指针。该结构如下:
tagCOPYDATASTRUCT = packed record
dwData: DWORD;
//这是一个附加的32位参数;
cbData: DWORD;
//我们将要传递的数据缓冲区的大小;
lpData: Pointer;
//指向数据缓冲区的指针。
end;
TCopyDataStruct=tag COPYDATASTRUCT;
一个例子,SendData程序包含一个文本框,在它的OnChange事件中将文本框中的内容发送到GetData程序重并显示出来。
在SendCopyData程序里,文本框OnChange事件的处理函数如下:
procedure TForm1.InputEditChange(Sender: TObject);
var
cds: TCopyDataStruct;
ss: PChar;
targetHandle: THandle;
begin
cds.cbData:=Length(InputEdit.Text)+1;
GetMem(ss,cds.cbData); //申请cbData大小的缓冲区,并把指针赋给ss;
strCopy(ss,Pchar(InputEdit.text));
cds.lpData:=ss; //设置缓冲区指针
targetHandle:=FindWindow(′TForm1′,′GetCopyData′); //用API函数获取″GetCopyData″窗口句柄
if targetHandle=0 then
begin
ShowMessage(′Don′'t find target window′);
exit;
end;
SendMessage(targetHandle,WM_COPYDATA,Handle,Integer((@cds)));//将cds结构指针发送个目标窗口;
//targetHandle使目标窗口句柄;
//Handle 发送消息的窗口句柄;
FreeMem(ss);
end;
在GetCopyData程序中,通过一个定制的消息处理程序接受wm_CopyData消息:
public
procedure GetCopyData(var msg: TWMCopyData); message WM_COPYDATA;
procedure TForm1.GetCopyData(var msg: TWMCopyData);
begin
with msg.CopyDataStruct^ do
begin
Form1.Edit1.Text:=PChar(lpdata);
end;
end;
其中TWMCopyData结构定义如下:
TWMCopyData = record
Msg: Cardinal;
From: HWND; //发送该消息的窗口的句柄
CopyDataStruct: PCopyDataStruct; //即SendCopyData程序中cds结构的指针
Result: Longint;
end;
除了用wm_CopyData消息传递数据外,Windows还提供了File_Mapping内存共享技术用于实现程序间数据共享。使用与上例窗口相似的两个程序来说明
在MapWrite程序中:
Private
HMapFile: Thanale;
MapFilePointer: Pointer;
procedure TForm1.FormCreate(Sender: TObject);
begin
//使用API函数来建立映象文件
hMapFile:=CreateFileMapping(
$FFFFFFFF, //指定共享内存
nil,
Page_ReadWrite, //共享方式
0,
1000, //共享内存大小
′MyMappedFile′); //映象文件的名字
if hMapFile<>0 then //如果映象文件建立成功
//MapViewOfFile函数返回一个指向共享内存块的在该程序内存空间中有效的指针
MapFilePointer:=MapView OfFile(hMapFile,File-Map-All-Access,0,0,0)
else
ShowMessage(′Can′'t Create MapFile′);
if MapFilePointer=nil then
ShowMessage(′MapFilePointer=nil′);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
StrCopy(PChar(MapFilePointer),PChar(Edit1.Text));//将文本框中的字符串copy到共享内存中
end;
在MapRead程序中使用API函数OpenFileMapping打开MapWrite程序中已建立的映象文件
procedure TForm1.FormCreate(Sender: TObject);
begin
hMapFile:=OpenFileMapping(FILE_MAP_READ,true,′MyMappedFile′); //取得′MyMappedFile′映象文件的句柄
if hMapFile<>0 then
MapFilePointer:=MapViewOfFile(hMapFile,File_Map_All_Access,0,0,0)
else
begin
ShowMessage(′Can not open Mapp File′);
Timer1.Enabled:=false;
end;
end;
//定时从共享内存中读取数据并显示出来
procedure TForm1.Timer1Timer(Sender: TObject);
var
ss: String;
begin
ss:=PChar(MapFilePointer);
Edit1.Text:=ss;
end;
当然最后我们要释放共享内存句柄
UnMapViewOfFile(MapFilePointer);
CloseHandle(hMapFile);
(西安 hszj)

Win9x下程序间的数据传递

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 19:02
  • 110

组件之间的数据传递

Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据。必须使用特定的方法才能实现组件之间的数据传递。 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,co...
  • Sky786905664
  • Sky786905664
  • 2017年06月05日 16:46
  • 418

Android基础之Activity系列 - Activity间的数据传递

Activity间的数据传递总结: Intent:(数据传递的灵魂) Android的应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,应用程序采用一致的...
  • pangrongxian
  • pangrongxian
  • 2015年12月03日 21:51
  • 2404

Java类之间的数据传递3中方法。

1.若是不变的常量可用接口interface,在接口中定义然后几个类就可以共用了。 2.如果是类之间传递变量有两种方法,假如类A调用类B的一个属性,类B的长像如下: class B {   pu...
  • baidu_30204381
  • baidu_30204381
  • 2015年07月30日 10:12
  • 495

总结C#中窗体间传递数据的几种方法 (由别人的方法整理)

总结C#中窗体间传递数据的几种方法 (由别人的方法整理)   在编写C#windows应用程序的时候我们经常会遇到这种问题,怎么样在两个窗体间传递数据呢?以下是我整理的网上的各种方法,在遇到一个实际问...
  • Daisy423XU
  • Daisy423XU
  • 2007年04月24日 14:55
  • 7132

Visual C#中实现窗体间的数据传递

 Visual C#中实现窗体间的数据传递之一Visual C#中实现窗体间的数据传递之一 一个稍微复杂一点的程序一般都有二个或者更多的窗体。有时在程序...
  • cngkqy
  • cngkqy
  • 2008年01月18日 11:29
  • 4463

unity3d_场景间数据传递

在游戏项目中,常常会使用到用户信息,获取信息当然可以从数据库中获取。但是对场景多的游戏这样做是不正确的,那么我我们就需要再第一次获取用户信息之后, 同时在其它的场景中共享用户数据,避免对服务器增加负...
  • braveyoung123
  • braveyoung123
  • 2013年08月11日 02:36
  • 1670

ActionBar通过Tab进行不同的Fragment之间的交换

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wangzhaoli.blog.51cto.com/7607113/1292793...
  • qq_27485253
  • qq_27485253
  • 2015年05月03日 20:46
  • 564

Android入门(8)——使用Intent实现页面跳转

1. Intent可以理解为信使(意图),由Intent来协助完成Android各个组件之间的通讯。 第一种方式直接跳转,第二种方式有返回值,第二种方法还需要onActivityResult来让A...
  • zizidemenghanxiao
  • zizidemenghanxiao
  • 2015年07月05日 11:39
  • 727

OGLES 程序和着色器间的数据传递

一、通过顶点属性下标传递的顶点和索引数据 1.Shader端设置: (1) 着色器输入输出等限定符 in(默认类型),out,inout, const, invariant。 GLSL 1.4版本中a...
  • Blues1021
  • Blues1021
  • 2017年03月08日 12:02
  • 355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win9x下程序间的数据传递
举报原因:
原因补充:

(最多只允许输入30个字)