首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从一个Delphi程序实例发送字符串到另一个实例?

要在Delphi程序实例之间发送字符串,可以使用以下方法:

  1. 使用Windows API函数:

在发送方实例中,使用FindWindow函数找到接收方实例的窗口句柄,然后使用SendMessage函数发送字符串。

在接收方实例中,使用WM_COPYDATA消息来接收字符串。

示例代码:

发送方实例:

代码语言:delphi
复制
uses Winapi.Windows, Winapi.Messages;

const
  WM_COPYDATA = $004A;

type
  PCopyDataStruct = ^TCopyDataStruct;
  TCopyDataStruct = record
    dwData: ULONG_PTR;
    cbData: DWORD;
    lpData: PVOID;
  end;

var
  hWndReceiver: HWND;
  s: string;
  cds: TCopyDataStruct;

begin
  hWndReceiver := FindWindow(nil, 'ReceiverWindowName');
  if hWndReceiver <> 0 then
  begin
    s := 'Hello, this is a string from sender instance.';
    cds.dwData := 0;
    cds.cbData := Length(s) * SizeOf(Char);
    cds.lpData := PChar(s);
    SendMessage(hWndReceiver, WM_COPYDATA, 0, LPARAM(@cds));
  end;
end;

接收方实例:

代码语言:delphi
复制
uses Winapi.Windows, Winapi.Messages;

const
  WM_COPYDATA = $004A;

type
  PCopyDataStruct = ^TCopyDataStruct;
  TCopyDataStruct = record
    dwData: ULONG_PTR;
    cbData: DWORD;
    lpData: PVOID;
  end;

var
  s: string;

procedure TForm1.WMCopyData(var Msg: TWMCopyData);
begin
  if Msg.CopyDataStruct.dwData = 0 then
  begin
    SetLength(s, Msg.CopyDataStruct.cbData div SizeOf(Char));
    Move(Msg.CopyDataStruct.lpData^, PChar(s)^, Msg.CopyDataStruct.cbData);
    ShowMessage(s);
  end;
end;
  1. 使用共享内存:

在发送方实例中,创建一个共享内存区域,并将字符串写入该区域。

在接收方实例中,打开该共享内存区域,并从中读取字符串。

示例代码:

发送方实例:

代码语言:delphi
复制
uses Winapi.Windows, System.SysUtils;

const
  SharedMemoryName = 'MySharedMemory';

var
  hFileMap: THandle;
  pView: Pointer;
  s: string;

begin
  hFileMap := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, 1024, PChar(SharedMemoryName));
  if hFileMap <> 0 then
  begin
    pView := MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
    if pView <> nil then
    begin
      s := 'Hello, this is a string from sender instance.';
      Move(PChar(s)^, pView^, Length(s) * SizeOf(Char));
      UnmapViewOfFile(pView);
    end;
    CloseHandle(hFileMap);
  end;
end;

接收方实例:

代码语言:delphi
复制
uses Winapi.Windows, System.SysUtils;

const
  SharedMemoryName = 'MySharedMemory';

var
  hFileMap: THandle;
  pView: Pointer;
  s: string;

begin
  hFileMap := OpenFileMapping(FILE_MAP_READ, False, PChar(SharedMemoryName));
  if hFileMap <> 0 then
  begin
    pView := MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
    if pView <> nil then
    begin
      SetLength(s, 1024 div SizeOf(Char));
      Move(pView^, PChar(s)^, 1024);
      UnmapViewOfFile(pView);
      ShowMessage(s);
    end;
    CloseHandle(hFileMap);
  end;
end;

这两种方法都可以实现在不同的Delphi程序实例之间发送字符串。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在SQL Server中将表从一数据库复制另一个数据库

在某些情况下,作为DBA,您需要将模式和特定表的内容从数据库复制同一实例中或在不同的SQL实例中,例如从生产数据库中复制特定表开发人员以进行测试或排除故障。...为了研究这些方法中的每一,我们将考虑下面的场景: 托管SQL服务器:localhost。这两个数据库都驻留在同一SQL Server 2014实例中。...在SQL导入和导出向导的指定表复制或查询中,从一或多个表或视图中选择复制数据。单击Next。...我们可以利用这两工具的优点来生成所需的脚本,以创建与其对象一起复制的表,并将数据从源表复制目标表。 启动ApexSQL Diff工具。...使用ApexSQL脚本: ApexSQL提供的另一个有用工具是ApexSQL脚本工具,它可用于将SQL Server表数据和模式从源数据库复制目标数据库。

8.1K40

如何从 0 1 重构一 APP 项目?(附实例)| 极客时间

后来我们扒了不少文章,终于看到一不错的,一针见血地指出了三关键点:自动化、系统化及工程化。...五步提升,带你真正实战系统重构 为了让内容能够切切实实地帮助大家,听说这个专栏经过了多次深入用户、专家调研的反复打磨。而且实打实地带大家实战,围绕着一贴近日常开发场景的 APP 项目重构。...特意看了下,这个实例里综合了很多遗留系统里的典型代码“坏味道”和代码耦合问题。...第二步:分析设计篇 这部分是针对遗留系统业务复杂度高的问题,会结合实例教你如何分析系统、诊断问题。根据现有架构与理想架构设计的差距,找出撬动遗留系统的关键杠杆点。...第五步:扩展篇 这一部分会将遗留系统的问题从 APP 扩展整个手机厂商的 Android 定制系统,带你了解 Android 定制系统的耦合问题以及解耦的策略及方法。

76510
  • java-程序运行时间检测实例-字符串叠加与两变量交换数据

    参考链接: 交换两个字符串,而无需在Java中使用第三用户定义的变量 上篇文章介绍了用System.currentTimeMillis()方法检测运行时间的用法,这篇文章结合两实际例子,看一下实际效果...字符串叠加  在《Thinking in java》里,作者着重强调了,字符串叠加的时候,尽量使用StringBuilder,相对于直接使用String.append()可以提高效率。...(3)异或运算  利用的原理是:一数异或同一数两次,结果还是那个数  int x =5,y=10; //定义两变量 x = x^y; y = x^y;  //y=(x^y)^y x = x^x; ...(4)运行效率  下面看下三者的运行速度如何:  public static void main(String[]args)     {         int x = 10, y = 5;        ...3.参考链接  java如何计算程序运行时间:https://zhidao.baidu.com/question/560976550653732724.html  两变量交换的四种方法(Java):http

    46750

    sdfsdfsd_dsd cd

    发布程序竟是如此简单!!! (3)—DataSnap服务器如何得到客户端的IP和端口 作为一服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。...在delphi2010中的datasnap服务器如何获得客户端ip,的确花了我点时间,奇怪为什么这个功能不做的更人性化点呢,功能总是藏着掖着。还得让程序员像寻宝一样摸索,浪费时间。...(6)—加强服务程序对访问者的控制能力 1)作为一服务程序,如果不限制客户端访问数量,后果将是很可怕的。如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机。如何限制访问者的数量呢?...Session 说明:这是delphi2010中默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一线程来实例化。实例化是什么概念呢?...这个线程和实例化并不释放,直到客户端中断连接。如果有300客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是考验。 适用环境:这个设置是线程安全的!

    2K10

    Python 的数据结构

    本篇博客主要内容有,基础的数据结构: 列表、元组、字典 、 集合介绍,如何创建自定义函数,和如何操作Python文件对象及如何与本地硬盘交互。 系统:Windows10系统。...示例1代码如下: # 字符串排序 def list_sort_string(): list=["delphi","Delphi","python","Python","c++","C++",...update 方法可以将一字典与另一个融合; 下面是 keys 和 values 方法使用的一示例: # 分别用keys和values方法输出字典的键和值 d1 = {'a':'some value...它允许用户方便的从一集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。...形式如下: [expr for val in collection if condition] 示例:给定一字符串列表,我们可以过滤出长度在2及以下的字符串,并将其转换成大写,代码如下: strings

    3.2K20

    Delphi类型和引用

    事实上Delphi中所有的元件都是从一些共同的祖先类 继承下来的,利用类的可继承性,您可以编写您自己的类元件,并把它加到Delphi的环境中去。...在Delphi中,所 有的类都是从一共同的类TObject继承下来的,TObject类的声明在System单元中,它定义了一些操纵 类的最基本的方法,因此,Tobject也被称为缺省祖先类。...举例说明,我们在Delphi的可视环境下 建立一表单窗口时,它实际上是创建了一从TForm类中继承下的类类型。如果仔细看Delphi为您生成 的代码,你可以完全看到上面的各个规则是如何被实现的。...构造主要用于控制如何创建类的对象以及如何初始化等行为,跟一般的方法不同的是,一般的方法 只能由类的对象实例引用,而构造可以不依赖于某个特定的对象实例,直接由类来引用,这一点跟后面 要介绍的类方法相似。...,它是一返回类型为字符串的函数。

    2.5K30

    通过示例学 Golang 2020 中文版【翻译完成】

    结构中的匿名字段 检查两结构是否相等或结构相等性 访问和设置结构字段 嵌套结构 结构字段元数据或标记 结构与 JSON 的转换 如何初始化带有另一个嵌套结构的结构 如何初始化具有数组或切片字段的结构...检查字符串是否是数字 移除或去除字符串中的所有空格 编写多行字符串 字符串比较 检查字符串是否包含另一个字符串 分割字符串 从一句子中获取所有单词 通过分隔符连接字符串 检查字符串是否以前缀开头...使用另一个字符串替换子字符串的所有实例 使用另一个子串替换子串的一些实例字符串中的一字符替换为另一个字符 查找子字符串最后一实例的索引 Index character in a string...将函数作为参数传递给另一个函数 从函数返回函数 向的函数传递可变数量的参数 方法与函数的区别 匿名函数 高阶函数 用户定义函数类型 从函数返回多个值 函数 如何另一个包调用函数 延迟 defer关键字...迭代所有文件和文件夹中的路径 获取当前工作目录 触摸 Golang 中的文件 将文件从一位置移动到另一个位置或命令mv 获取文件名、大小、权限位、模式、修改时间 制作文件的副本 文件夹/目录 创建目录或文件夹

    6.2K50

    delphi vcl_delphi数据类型

    每个Delphi应用程序都有一指向TApplication对象的指针,此指针称为Application,用TApplication类主要执行消息框,管理快捷帮助,为按钮和状态栏设置提示文本。...GDI类与一具体的组件没有联系,但很多类都有这些类的属性实例。例如,编辑控件有一属性叫Font,它是TFont类的实例。...除了这里列出的GDI类以外,还有一些其他类,在以后的Delphi学习过程中,我们将会学习更多有关这方面的类,并掌握使用它们。...另一个VCL实用类就是TList类,这个类可以建立任何想要的类型对象数组。...更多这些类的详细信息请大家自己看看Delphi VCL Help。 这不是全部 讨论到这里并没有讨论到所有的VCL类,但这里所涉及的类在应用程序中用到的可能性很大。

    2.7K10

    帮助 Java 开发人员进行 Bean 映射的 8 大框架

    图片 作为一名新手 Java 程序员,您可能想知道如何构建一大型应用程序,而无需使用大量可能使您筋疲力尽的类似代码。...尽管将一对象映射到另一个对象是很常见的,但由于这两类具有相似或相同的映射属性,它通常可能是迭代且乏味的。幸运的是,有几个 Java 映射框架可以用来递归地将数据从一对象复制另一个对象。...如果您想克服编写类似代码行以将数据从一 bean 复制另一个的复杂性和重复性,那么 bean 映射框架非常有用,因为它提供了简单的配置和更少的代码行来简化您的工作。...JavaBean Bean 映射框架,它迭代地将数据从一对象复制另一个对象。...Java 映射框架,它使用 APL/XML 配置和注释将数据从一对象复制另一个对象。

    2.3K10

    博客目录及索引,欢迎指导交流

    当然大牛的人还要会沉淀、思考、修正、分享,这或许是写博客的一意义所在吧。...开源一简单的缓存组件j2cache 聊聊从web session的共享可扩展缓存设计 Apache Ignite Apache Ignite之集群应用测试 Ignite性能测试以及对redis的对比...支持腾讯QQ邮箱邮件发送 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题 技术笔记:Delphi多线程应用读写锁 技术笔记:Indy控件发送邮件 学习笔记:7z在delphi的应用...、302重定向 学点HTTP知识 学习笔记:URL Protocol在浏览器中打开本地应用程序 学习笔记:发现一IE版本判断的好方法 使用js在网页上记录鼠标划圈的小程序 其他 学习笔记:内存,堆栈,...基于 Asp.Net的 Comet 技术解析 LinqToSql开发实践之认识LinqToSql 如何正确看待手机的续航 钉钉开放平台demo调试异常问题解决:hostname in certificate

    1.7K90

    delphi bpl插件系统开发

    ,把他们拷贝目录下,发布没有delphi的机器上试试吧....然后这样的系统在架构上已经达到了我们的要求,唯一不太完美的是一旦有了切换,我们需要重新编译整个程序,分发....怎么解决它,我们需要一可以动态载入程序中的实现,并能配置容器告知容器我们切换了实现.....,这种机制叫做"依赖注入",而我们在delphi中该如何实现类似的应用(水平不够,不敢说相同的应用) 构思一下: 容器(即应用程序)完全按照面向接口编程 容器读入一外部配置文件来确定每个接口的具体实现类的名称...载入bpl(bpl中注册了实现某接口的类,以让宿主程序可以访问到) 通过rtti(类似java的反射)创建类的实例 将该实例as 成接口,容器使用该实例完成工作....撰写每个接口的实现,并生成多个bpl 用TPluginLoader来载入这些插件, 主程序,实例化一TPluginLoader,然后取得IMisLoader的实例,运行它.

    1.7K11

    Delphi 教程

    虽然delphi是面向对象的,但是application是面向过程的,这是因为在程序刚建立的时候,是按顺序从上到下执行,此时还没有创建任何的对象,application是一全局的过程变量....它的重要方法有以下几个: Initialize:对全局程序进行初始化.就比如说你有2窗体,form1和form2,里面分别有1全局变量,一般在人们的理解上,这些全局变量在form创建时才拥有实例...,但是实际上在application.initializel的时候就有了 第二重要的方法是run: 它表明程序可以启动,注意不是“启动”,而是“可以启动”.这个地方是delphi命名不规范的地方...一般的网络通信程序中,将这2种协议放在一起用。单纯的发送信息用UDP,发送文件用TCP。它们的发送和接收方法都一样:通过SendBuffer进行发送 ,Adata.ReadBuffer进行接收。...也就是说end.后面写的代码,编译器不会检查,但是要注意一点,那些代码也会被编译程序内。

    1.9K11

    关于“Python”的核心知识点整理大全22

    9.4.6 在一模块中导入另一个模块 有时候,需要将类分散多个模块中,以免模块太大,或在同一模块中存储不相关的类。 将类存储在多个模块中时,你可能会发现一模块中的类依赖于另一个模块中的类。...在2处,我们创建了OrderedDict 类的一实例,并将其存储favorite_languages中。...实例名 和模块名都采用小写格式,并在单词之间加上下划线。 对于每个类,都应紧跟在类定义后面包含一文档字符串。这种文档字符串简要地描述类的 功能,并遵循编写函数的文档字符串时采用的格式约定。...9.7 小结 在本章中,你学习了:如何编写类;如何使用属性在类中存储信息,以及如何编写方法,以 让类具备所需的行为;如何编写方法__init__(),以便根据类创建包含所需属性的实例。...你见识 了如何修改实例的属性——包括直接修改以及通过方法进行修改。你还了解了:使用继承可简化 相关类的创建工作;将一类的实例用作另一个类的属性可让类更简洁。

    10010

    Dart的语法详解系列篇(三)-- mixin入门详解一、继承歧义

    其他类如何访问Mixin的方法取决于语言。Mixin有时被描述为“包含的”而不是“继承的”。...如果从AB的继承和从AC的继承都标记为virtual(例如,class B:virtual public A),那么c++会特别注意只创建一对象,并正确使用A的成员。...如果一结构体D嵌入两种结构体B和C(这两结构体都有一方法F()),从而满足接口A,那么如果调用D.F(),或者如果D的实例被分配给类型A.B和C的变量,则编译器将会提示ambiguous selector...所以,解决的顺序是[D, C, A, B, A],被减少[D, C, B, A] 只允许单个继承(类只能从一基类派生)的语言没有菱形问题。...这样做的原因是,无论方法的重复或位置如何,这些语言在继承链的任何级别上最多只能实现一方法。通常,这些语言允许类实现多个protocols,在Java中称为接口。

    1.8K10

    一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案

    Hydra 是一 NodeJS 模块,可以将其导入 JavaScript Node 应用程序中,以使其具有微服务功能。Hydra 通过利用 Redis 做到这一点。...因此,可以按服务实例存储运行状况(health)信息。使用包含字符串化的JSON文本的字符串 key 进行管理。而且这些信息可以通过监视应用程序来使用。...让我们看看如何在实践中使用它。 在左边,“client-svcs” 向 “project-svcs” 发送消息。注意,这只需要一 UMF 创建调用和一发送消息调用,这里用黄色显示。...有了服务名,下一步是检查可用的实例。有了目标实例,消息就会被字符串序列化,并通过 Redis 的 “publish” 命令发送。...Queuing(队列) 作业(Job)和消息队列(message queues)是许多重要应用程序另一个重要部分。

    96620

    delphi调用webservice问题总结

    1.把WSDL的URL地址放到了HTTPRIO的WSDLLocation参数中,然后选择service和port 2.最近一项目用到了delphi调用C#写的web服务的功能。...这是一通过web服务把一照片上传到网站指定位置的方法。...先测试了N次都不成功,通过跟踪发现delphi根本没传过来任何值,通过查资料发现VS2005 默认是用的 SoapDocumentProtocol而Delphi 是使用的 SoapRpcProtocol....这会造成所以客户端传过去的字符串变成null,需要在生成的接口单元的INITIALIZATION 部分加上一句:InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap...服务代码: [WebMethod] public int UploadFile(byte[] fs, string FileName) { try { ///定义并实例化一内存流,以存放提交上来的字节数组

    2.4K20

    一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案

    Hydra 是一 NodeJS 模块,可以将其导入 JavaScript Node 应用程序中,以使其具有微服务功能。 Hydra 通过利用 Redis 做到这一点。...而且这些信息可以通过监视应用程序来使用。 Service Discovery(服务发现) 接下来,让我们考虑服务发现,这是任何微服务架构的另一个必备功能。...让我们看看如何在实践中使用它。 在左边,“client-svcs” 向 “project-svcs” 发送消息。 注意,这只需要一 UMF 创建调用和一发送消息调用,这里用黄色显示。...有了服务名,下一步是检查可用的实例。 有了目标实例,消息就会被字符串序列化,并通过 Redis 的 “publish” 命令发送。...Queuing(队列) 作业(Job)和消息队列(message queues)是许多重要应用程序另一个重要部分。

    68910

    Delphi使用NativeXml处理XML(一)

    ---- 3.2.例子B:连接到节点   这个例子显示了如何访问在XML文件中的各个节点。一节点可以从一普通的XML标记、注释、CDATA结构,等等东西。...该示例演示如何使用一简单的双循环列出前2层的节点。   添加Tedit、TButton和TMemo窗体,然后将下面的事件代码连接到按钮的OnClick。...添加一TButton(Button3)和一TMemo(Memo1)您的窗体,然后将NativeXml包括在uses中。接下来,键入下面的TButton.OnClick事件处理程序代码。...字符串类型不会改变(它仍然是“string”)。虽然Delphi7有一种特殊类型“Utf8String”,但没有使用,以保持较低的Delphi版本的兼容性。   ...(例如从一TCP连接)读入,流并不总是包含字节顺序标记(BOM)。

    1K40

    Sednit组织最新研发的恶意软件组件

    复杂的入侵活动 下图显示的攻击者一步一步实现成功入侵的过程,即从一开始目标用户在收件箱中收到恶意电子邮件,最终在目标用户的设备上部署后门: ?...如第一张截图所示,wordData.dotm中的宏会打开另一个文档:lmss.doc,而lmss.doc文件需要恶意宏从wordData.dotm中提取出来。...需要注意的是,lmss.doc中包含的VBA代码可以执行新型的Nim下载器,而且它还嵌入了一Base64编码的可执行程序,根据其文档属性,lmss.doc创建于2019年1月份,并且在8月20日进行过修改...另一个特性就是代码混淆,攻击者使用了代码混淆技术来重构恶意组件的URL地址字符串,以增加静态分析工具的分析难度: ?...在攻击的下一阶段,恶意软件会获取目标设备桌面的屏幕截图,并执行攻击者通过C2服务器发送过来的命令。截图操作自下载器执行之后开始,每35秒截图一次,然后以Base64编码形式发送至C2服务器。

    77630
    领券