如何将字符串从Delphi程序的一个实例发送到另一个? [英] How do I send a string from one instance of my Delphi program to another?

查看:216
本文介绍了如何将字符串从Delphi程序的一个实例发送到另一个?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将字符串从程序的一个实例发送到程序的另一个实例的最佳和最简便的方法是什么?接收程序必须使用接收到的字符串作为参数来执行一个过程。

What is the best and easiest way to send a string from one instance of my program to another instance of my program? The receiving program has to execute a procedure, using the received string as a parameter.

我开始阅读有关DDE的内容,但感到困惑。我还有什么其他选择,最简单的实现方法是什么?

I started reading about DDE but I got confused. What other options do I have, and what is the easiest way to implement this?

推荐答案

使用命名管道,但我建议罗素·利比(Russell Libby)的命名管道组件。

Use named Pipes, but I would recommend Russell Libby's named Pipe components. There is a TPipeClient and TPipeServer component.

截至(2013-10-04) Francoise Piette和arno.garrels@gmx.de更新了此源代码,以将Delphi 7编译为XE5(早期版本)可能会编译,但未经测试)并放在此处:
http:/ /www.overbyte.be/frame_index.html?redirTo=/blog_source_code.html

As of (2013-10-04) Francoise Piette and arno.garrels@gmx.de updated this source code to compile with Delphi 7 to XE5 (earlier versions may compile however untested) and put it here: http://www.overbyte.be/frame_index.html?redirTo=/blog_source_code.html

这2个组件使使用命名管道非常容易,命名管道

These 2 components make using named pipes incredibly easy, and named pipes are great for inter-process communication (IPC).

他的网站在这里。查找 Pipes.zip。来自源的描述是://描述:一组用于Delphi的客户端和服务器命名管道组件,以及//控制台管道重定向组件。

His website is here. Look for "Pipes.zip". The description from the source is: // Description : Set of client and server named pipe components for Delp as // well a console pipe redirection component.

另外,Russell使用此组件的较旧版本在控制台应用程序中通过命名管道发送/接收消息,从而帮助了我在Experts-Exchange上的发展。这可能有助于您入门并使用其组件。请注意,在VCL应用程序或服务中,您不需要像在此控制台应用程序中那样编写自己的消息循环。

Also, Russell helped me out on Experts-Exchange with using an older version of this component to work in a console app to send/receive messages over named pipes. This may help as a guide in getting you up and running with using his components. Please note, that in a VCL app or service, you don't need to write your own message loop as I did in this console app.

program CmdClient;
{$APPTYPE CONSOLE}

uses
  Windows, Messages, SysUtils, Pipes;

type
  TPipeEventHandler =  class(TObject)
  public
     procedure  OnPipeSent(Sender: TObject; Pipe: HPIPE; Size: DWORD);
  end;

procedure TPipeEventHandler.OnPipeSent(Sender: TObject; Pipe: HPIPE; Size: DWORD);
begin
  WriteLn('On Pipe Sent has executed!');
end;

var
  lpMsg:         TMsg;
  WideChars:     Array [0..255] of WideChar;
  myString:      String;
  iLength:       Integer;
  pcHandler:     TPipeClient;
  peHandler:     TPipeEventHandler;

begin

  // Create message queue for application
  PeekMessage(lpMsg, 0, WM_USER, WM_USER, PM_NOREMOVE);

  // Create client pipe handler
  pcHandler:=TPipeClient.CreateUnowned;
  // Resource protection
  try
     // Create event handler
     peHandler:=TPipeEventHandler.Create;
     // Resource protection
     try
        // Setup clien pipe
        pcHandler.PipeName:='myNamedPipe';
        pcHandler.ServerName:='.';
        pcHandler.OnPipeSent:=peHandler.OnPipeSent;
        // Resource protection
        try
           // Connect
           if pcHandler.Connect(5000) then
           begin
              // Dispatch messages for pipe client
              while PeekMessage(lpMsg, 0, 0, 0, PM_REMOVE) do DispatchMessage(lpMsg);
              // Setup for send
              myString:='the message I am sending';
              iLength:=Length(myString) + 1;
              StringToWideChar(myString, wideChars, iLength);
              // Send pipe message
              if pcHandler.Write(wideChars, iLength * 2) then
              begin
                 // Flush the pipe buffers
                 pcHandler.FlushPipeBuffers;
                 // Get the message
                 if GetMessage(lpMsg, pcHandler.WindowHandle, 0, 0) then DispatchMessage(lpMsg);
              end;
           end
           else
              // Failed to connect
              WriteLn('Failed to connect to ', pcHandler.PipeName);
        finally
           // Show complete
           Write('Complete...');
           // Delay
           ReadLn;
        end;
     finally
        // Disconnect event handler
        pcHandler.OnPipeSent:=nil;
        // Free event handler
        peHandler.Free;
     end;
  finally
     // Free pipe client
     pcHandler.Free;
  end;

end.

这篇关于如何将字符串从Delphi程序的一个实例发送到另一个?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆