问题描述
将字符串从我的程序的一个实例发送到我的程序的另一个实例的最佳和最简单的方法是什么?接收程序必须执行一个过程,使用接收到的字符串作为参数.
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 的命名管道组件.有一个 TPipeClient 和 TPipeServer 组件.
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
这两个组件使命名管道的使用变得异常简单,而且命名管道非常适合进程间通信 (IPC).
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 程序的一个实例发送到另一个实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,WP2