用Delphi实现程序间的数据传递

进程之间通信的几种方式,总有一款适合你 进程之间通信的几种方式前言shared memoryPipeMsgMsgQueue 前言 这个问题面试官必问的好吧,这是非常经典的问题,正好之前的项目中有这样的经历,所以就咱们的项目出发,讲一下进程之间通信的几种方式。 shared memory 共享内存,大家读写双方约定一块内存地址,然后咱们分别读写这块地址的数据(当然,大家也要一起约定好数据的格式)。记得加锁哦。 咱们看一下shared memory的写和读是咋搞的: //1.没有锁的话,创建锁,然后尝试获取锁 HANDLE Gmute 阅读详情
用Delphi实现程序间的数据传递
在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。

有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。
利用WM_COPYDATA消息
使用该消息涉及一个TcopyDataStruct结构类型的指针。该结构中有三个成员:
dwData是一个32位的附加参数
cbData表示要传递的数据区的大小
lpData表示要传递的数据区的指针
下面举个例子。该例子由两个程序构成,分别为SendData和GetData。
SendData程序向GetData程序发送消息,并传递edit1中的字符串;GetData在收到消息后,把SendData发送的字符串接受下来,并显示在相应的edit1中。
SendData程序:
var
Form1:TForm1;
implementation
{$R*.DFM}
procedureTForm1.Button1Click(Sender:Tobject);
var
ds:TCopyDataStruct;
hd:Thandle;
begin
ds.cbData:=Length(Edit1.Text)+1;
GetMem(ds.lpData,ds.cbData);//为传递的数据区分配内存
StrCopy(ds.lpData,Pchar(Edit1.Text));
Hd:=FindWindow(nil,'Form2');//获得接受窗口的句柄
ifHd<>0then SendMessage(Hd,WM_COPYDATA,Handle,
Cardinal(@ds))//发送WM_COPYDATA消息
else
ShowMessage('目标窗口没找到!');
FreeMem(ds.lpData);//释放资源
end;

GetData程序:
TForm2=class(Tform)
Edit1:Tedit;
private
{Privatedeclarations}
public
procedureMymessage(vart:TWmCopyData);messageWM_COPYDATA;
{Publicdeclarations}
end;
var
Form2:TForm2;
implementation

procedureTForm2.Mymessage(vart:TWmCopyData);
begin
Edit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受数据并显示。
end;

使用这种方法是WIN32应用程序进行交互的最简单的方法。
使用全局原子
Win32系统中,为了实现信息共享,系统维护了一张全局原子表。每个原子中存放了一些共享数据。关于对原子的操作,有一组专门的API函数:
GlobalAddAtom在表中增加全局原子
GlobalDeleteAtom在表中删除全局原子
GlobalFindAtom在表中搜索全局原子
GlobalGetAtomName从表中获取全局原子
笔者用这种方法实现了避免程序二次启动,但把第二次启动所带的参数传到第一个实例中以进行相应的处理的程序。基本处理如下:
在工程文件中:
programPvdde;
uses
Forms,shellapi,Windows,dialogs,ddein'dde.pas'{Form1};

{$R*.RES}

begin
ifGlobalFindAtom(Pchar('PDDE_IS_RUNNING'))=0then
//避免二次启动
begin

K:=GlobalAddAtom(Pchar('PDDE_IS_RUNNING'));
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end
else
begin
//传递二次启动时的参数到第一个实例
H:=FindWindow(Pchar('TForm1'),Pchar('资料保密严禁外传'));
ifParamCount>0then
begin
L:=GlobalAddAtom(Pchar(ParamStr(1)));
ifH<>0then
SendMessage(H,WM_MYMESSAGE,0,L);
{传递原子句柄}

GlobalDeleteAtom(L);{使用后释放}
end;
Application.Terminate;
end;
end.

在相应的窗口单元dde.pas增加对自定义消息WM_MYMESSAGE的处理:

procedureTForm1.MyMessage(varT:Tmessage);
{对WM_MYMESSAGE消息进行处理}

var
P:Array[0..255]ofchar;
begin
GlobalGetAtomName(T.Lparam,P,255);{接受数据到p数组中}
end;

使用存储映象文件
这种方法相对较复杂一些。

当Win95与Winows
Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或DLL文件)时,它们实际可以在内存中共享其执行代码。

笔者通过调用一个带有特殊参数的CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。

HANDLECreateFileMapping(HANDLEhFile,//文件句柄
LPSECURITY_ATTRIBUTESlpFileMappingAttributes,//可选安全属性
DWORDflProtect,//映象文件保护方式
DWORDdwMaximumSizeHigh,//映象文件区域的底值
DWORDdwMaximumSizeLow,//映象文件区域的顶值
LPCTSTRlpName//映象文件的名字);

如果hFile是0xFFFFFFFF,在调用程序中必须指定dwMaximumSizeHigh
和dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。
在建立了映象文件之后,我们可以通过调用另外一个API函数MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。
LPVOIDMapViewOfFile(
HANDLEhFileMappingObject,//映象文件句柄
DWORDdwDesiredAccess,//访问方式
DWORDdwFileOffsetHigh,//映象文件区域的底值
DWORDdwFileOffsetLow,//映象文件区域的顶值
DWORDdwNumberOfBytesToMap//映射字节数
);
如果dwNumberOfBytesToMap是0,映射整个文件。

以下举例说明:

private
hMapFile:Thandle;
MapFilePointer:Pointer;
public

{Publicdeclarations}
end;

var
Form1:TForm1;
implementation

{$R*.DFM}

procedureTForm1.FormCreate(Sender:Tobject);
begin
hMapFile:=CreateFileMapping(
$FFFFFFFF,//特殊内存映射句柄
nil,page_ReadWrite,0,10000,'DdhDemoMappedFile');//文件名
ifhMapFile<>0then
MapFilePointer:=MapViewOfFile(hMapFile,//上面映象文件的句柄
File_Map_All_Access,0,0,0)//访问整个映象文件
else
ShowMessage('hMapFile=0');
ifMapFilePointer=nilthen
ShowMessage('MapFilePointer=nil');
end;

procedureTForm1.BtnWriteClick(Sender:Tobject);
begin
StrCopy(Pchar(MapFilePointer),
Pchar(EditWrite.Text));//把内容写入共享内存
end;

procedureTForm1.BtnReadClick(Sender:Tobject);
var
S:string;
begin
S:=Pchar(MapFilePointer);//从共享内存读出内容
EditRead.Text:=S;
end;

用这种方法,不但可以在不同的程序之间共享数据,还可以在同一程序的不同实例间共享数据。为了及时通知其它进程共享数据的变化,可以自定义一条用户消息,通过发消息来实现,这里不再赘述。
Delphi跨进程通信:三种高效字符串传递方案对比与实践 本文详细对比了Delphi中三种高效的跨进程字符串传递方案:窗口消息、线程消息和WM_COPYDATA。通过实际案例和性能测试数据,分析了各方案的优缺点及适用场景,帮助开发者根据项目需求选择最佳通信方式,提升系统性能与稳定性。 阅读详情

相关推荐

Delphi语言的函数实现

在编程中,函数是一组执行特定任务的代码块。函数接收输入(参数),并返回一个输出(返回值)。函数可以提高代码的重用性和可读性,减少代码的重复性。通过将特定的逻辑封装在函数中,程序员可以轻松管理和维护代码。delphifunction 函数名(参数列表): 返回类型;begin// 函数体end;在这里,AddNumbers函数接收两个整数参数a和b,返回它们的和。Result是在Delphi中用于返回值的特殊变量。

2501_90406404的博客 1528

DELPHI WM_CopyData 用法

unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2...

weixin_34409357的博客 256

使用OLE拖放不同程序间的数据

使用OLE拖放不同程序间的数据(OLE Drag and Drop)难度:★★★☆☆先行知识:Delphi / 接口 / Win32 / OLE or COM 从一个程序拖动数据到另一个程序(典型的情况是拖动文本)已经不是什么新鲜事了,很多共享软件都支持这个功能(比如说著名的flashget、netants等的浮动窗口功能)。作者一直想在自己的软件中实现这个功能,经过一段时间的资料

hkbarton的专栏 2237

Delphi里WM_COPYDATA消息传递的使用

首先是发送数据 procedure SendMsg(Msg: string); var DS: TCopyDataStruct; hd: THandle; begin Ds.cbData := Length(Msg) + 1; GetMem(Ds.lpData, Ds.cbData); StrCopy(ds.lpData, PChar(Msg)); i...

小S资料屋 1431

delphi使用消息Sendmessage/Postmessage传递字符串三种方式实现

如果同一进程传递字符串可以使用PostMessage传递,该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。1、直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递。

yygyyygy1233的博客 1465

Delphi 7程序间数据通信实战

本文还有配套的精品资源,点击获取 简介:本文介绍在IT行业中,特别是在使用Delphi 7进行Windows应用程序开发时,如何实现两个独立的EXE文件之间通过进程间消息传递进行数据通信。详细阐述了Windows消息队列的工作原理、如何在Delphi中使用API函数或VCL框架进行消息发送和接收,以及配置文件和项目文件的作用。同时,强调了数据安全性、大小限制和同步问题的重要...

weixin_36474966的博客 1237

DELPHI:实现程序间的数据传递

在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。 有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。 利用WM_COPYDATA消息   使用该消...

我的IT之旅 307

基于51单片机的简易计算器设计(原理图+仿真+源代码+参考论文)

本设计以51单片机为核心,矩阵键盘输入数字,通过1602显示屏显示计算结果,能够实现整数的加、减、乘、除四则运算,具备清除功能。

u012759563的博客 7710

【转载】用Delphi实现程序间的数据传递

在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。 有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。 利用WM...

weixin_30894583的博客 140

ESP32 Arduino学习篇 (一) 引脚和串口的基本使用

简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制,例如LED灯,蜂鸣器,按键arduino程序首先来讲arduino程序是基于C语言,而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语言知识即可实现。arduino程序是基于函数的,而在arduino的库有很多函数,我们只需要调用即可。arduino的程序主体是**setup()函数和loop()**函数以及其它在使用过程中需要构建的函数:setup()函数。

DOF526570的博客 1万+

在ros里给机械臂加上夹爪和底盘后,控制真实机械臂

使用ur3_bringup 可以连接真实机械臂 使用官方的ur3_moveit_planning_execution.launch 可以对机械臂 moveit规划。 但是只有机械臂,没有夹爪。 官方如图: 我把原来的ur3_moveit_config 复制出来,修改 然后把ur3.xacro 等模型文件复制出来修改,修改完之后,有了夹爪,有了底盘。 规划组什么的使用moveit setup assistant 配置过了。 在rviz中可以笛卡尔空间规划了。 ...

超级菜 2719

回答一位朋友的提问:在Delphi7下如何与DLL共享数据库连接

朋友,你好!       因为有疑问,所以要思考;因为找不到答案,所以要询问。文明,就在疑惑与不懈的探索中演进。    我的一些文章赢得部分人的关注,我因此而荣幸。于是,QQ上朋友顿然多了起来。很多问题在QQ上无法简单的答复,还有一些问题是提问者自己也不知道如何表达,更谈不上解决问题了。    时间和精力对于我,太匮乏。我无法一次性回答所有的问题,这里权且回答一个“如何与dll共享数据库连接”

软件开发资料汇总 1602

相衬成像介绍

相衬成像介绍

qq_41981768的博客 2914

Delphi 控制外部程序

最近做一个项目,需要从外部控制挰序,好比做一个外挂,要获取游戏里各个控件的句柄,然后对它进行操作。在网上查了查,这方面的例子无一例外都是C++的,找不到Delphi的,在几个网站上问了,回答的人都说不知道,并且推荐我用C++进行开发,难道Delphi真的不能对外部程序操作? 经过一天的努力,我证明了Delphi也是可以做到的,并且比C++做起来更方便,我把它做成一个控件,以便随时拖出来就用。

被遗忘的遐想空间 2008

电子工程师必看:dB与放大倍数快速换算表(附常见误区解析)

本文为电子工程师提供了dB与放大倍数快速换算的实战指南。文章深度解析了分贝的本质与核心价值,并提供了电压/电流与功率增益的速查表及心算技巧。重点剖析了混淆电压与功率dB、-3dB带宽理解等常见误区,并结合示波器、频谱仪测量及系统级应用,帮助工程师在实际工作中高效、准确地运用这一对数工具。

weixin_29214199的博客 655

手把手教你学Simulink——基于自动驾驶辅助系统的场景实例:车道保持辅助系统(LKA)的仿真与实现

本文通过Simulink实例讲解车道保持辅助系统(LKA)的实现方法。首先介绍LKA从预警到主动控制的技术演进,阐述其系统架构、核心组件和工作原理。重点演示基于自行车模型的车辆横向动力学建模过程,以及使用线性二次调节器(LQR)设计横向控制器的详细步骤。教程包含四个仿真场景测试,分析关键指标如控制精度、舒适性和响应性。最后探讨LKA技术的发展方向,强调人机协同的安全理念。该实例为自动驾驶辅助系统开发提供了完整的Simulink实践方案。

MHD0815的博客 182

COM/DCOM中如何传递数组

2000年09月20日 15:22:00 因为COM/DCOM对象都不在Client程序运行的内存空间(内进程COM对象除外,即便如此,为了统一接口,内进程的COM也不得传递指针),而且在Win32中所有的程序都有自己独立的2GB的内存空间,程序与程序之间传递指针(内存地址)是毫无意义的,而数组、字符串等大量的数据在程序中都是分配一定的内存空间,然后用指针加内存偏移量来存取数据的,

秦梦瑶的专栏 433

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 387

Delphi application Send Data to C# application

最近做C/S的程序,不免要遇到窗体及程序间数据的传递,程序间或者进程间数据的封送传递,我知道的方法不多(学习不够啊),我最喜欢用的就是发送WM_COPYDATA消息,这时就要遇到CopyDataStruct结构体了,对于这个结构体的原形,我们并不陌生.   typedef struct tagCOPYDATASTRUCT {        DWORD dwData;        DWORD

sbz0409的专栏 1925

指纹对抗指南:如何绕过Cloudflare与Akamai的5s盾与浏览器指纹检测

现在的CDN反爬技术虽然越来越强,但是道高一尺魔高一丈,只要掌握了指纹伪造、流量伪装、行为模拟这些核心技术,就可以绕过绝大多数的防护措施。对抗过程中要注意效率和成本的平衡,小规模爬取用Playwright+stealth最方便,大规模爬取用curl_cffi+代理池性价比最高,遇到验证码用打码平台或者自动识别服务,不需要死磕破解。本文介绍的方案已经在实战中验证过,可以绕过95%以上的Cloudflare/Akamai防护,成功率非常高。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 299

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怎样实现模块间的参数传递?急急急!!!!!!!!!

怎样实现模块间的参数传递?急急急!!!!!!!!! Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061208171655219.html 我现在做一个简易的登录器,由一个登录界面,及登录后的一些模块,但登录成功进入另一个模块后,我需要知道当前是谁登录的系统,好久都想不通,请高人指...

aibi9196的博客 275

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

DELPHI XE2 BPL窗口调用主程序与BPL窗体参数传递:提升DELPHI程序交互体验

DELPHI XE2 BPL窗口调用主程序与BPL窗体参数传递:提升DELPHI程序交互体验 去发现同类优质开源项目:https://gitcode.com/ 在软件开发领域,DELPHI XE2环境下的BPL(Binary Program Library)窗口调用与参数传递一直是开发者关注的焦点。本文将详细介绍DELPHI XE2 BPL窗口调用的核心功能与场景,帮助开发者更好地理解和应用这一技...

gitblog_06746的博客 1038

vc++ 与delphi开发的程序传递数据

用的是WM_COPYDATA消息和COPYDATASTRUCT这个结构。 注意的是数据类型:C++中用char*,delphi中用PChar。 void CTestCydataDlg::OnButton1() { CWnd *pWnd = CWnd::FindWindow(NULL,_T("Form1")); if(pWnd==NULL) { AfxMessageBox("Unab

zhuameng.com的博客 1192

delphi中程序间数据传递。及消息使用(转)

在实际应用中,我们经常需要多个程序相互配合来完成某些特定功能。例如两个应用程序间的同步、互斥;应用程序在起第二份实例时的参数自动传递…。要实现这些功能,就必须能实现程序间的数据传递。 有些特殊的高级技术可在不同的程序间传递数据,如剪贴板、动态数据交换以及OLE自动化,但有条件限制并且相对较复杂。这里,我介绍三种有效的底层技术,希望对编程爱好者有所帮助。 利用WM_COPYDATA消息   使用该消

songfuqiang的专栏 1994
上一篇: Win9x下程序间的数据传递
下一篇: 如何实现大图标风格的打开对话框
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值