Delphi 简单命名管道在两个进程间通讯
服务器端代码:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; const
WM_MYMSG=WM_USER+; type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
procedure display(var msg:TMessage);message WM_MYMSG;
{ Public declarations }
end; var
Form1: TForm1; implementation var
pipeHandle:HWND;
byteRead:DWORD;
buffer:array[..] of char;
threadId:Cardinal;
threadHandle:HWND; {$R *.dfm} { TForm1 } function fun(p:Pointer):DWORD;stdcall;
begin
if ConnectNamedPipe(pipeHandle,nil)=FALSE then
begin
ShowMessage(format('ConnectNamedPipe failed with error %d',[GetLastError()]));
Application.Destroy;
end; //注意,下面的 ReadFile中,其buffer只能用字符数组
//无论是string,或者pchar,都会让客户端程序报 错误-管道的另一端上无任何进程。
//在msdn中 ReadFile中的buffer是个LPVOID,delphi中则是一个var(引用)参数
//这个问题目前暂时无解决办法,是一个值得深入研究的话题。 if ReadFile(pipeHandle,buffer,sizeof(buffer),byteRead,nil)=FALSE then
begin
ShowMessage(format('ReadFile failed with error %d',[GetLastError()]));
Application.Destroy;
end; SendMessage(integer(p),WM_MYMSG,,); if DisconnectNamedPipe(pipeHandle)=FALSE then
begin
ShowMessage(format('DisconnectNamedPipe failed with error %d',[GetLastError()]));
Application.Destroy;
end; CloseHandle(pipeHandle);
Result:=; end; constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
pipeHandle:= CreateNamedPipe('\\.\Pipe\Jim',PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE or PIPE_READMODE_BYTE,,,,,nil);
if pipeHandle=INVALID_HANDLE_VALUE then
begin
ShowMessage(format('CreateNamePipe failed with error %d',[GetLastError()]));
Application.Destroy;
end;
memo1.Clear;
memo1.Lines.Add('Server is now running'); threadHandle:=createThread(nil,,@fun,Ptr(form1.Handle),,threadId); end; procedure TForm1.display(var msg: TMessage);
begin
memo1.Text:=buffer;
end; end.
客户端代码:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override; { Public declarations }
end; var
Form1: TForm1; implementation var
pipeHandle:HWND;
bytesWrite:DWORD;
pipeNameStr:string; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
begin if WaitNamedPipe(pchar(pipeNameStr),NMPWAIT_WAIT_FOREVER)=FALSE then
begin
ShowMessage(format('WaitNamedPipe faile with error %d',[GetLastError()]));
exit;
end; pipeHandle:= CreateFile(pchar(pipeNameStr),GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,); if pipeHandle=INVALID_HANDLE_VALUE then
begin
ShowMessage(format('CreateFile faile with error %d',[GetLastError()]));
exit;
end; if WriteFile(pipeHandle,pchar(memo1.text)^,length(memo1.text),bytesWrite,nil)=
FALSE then
begin
ShowMessage(format('WriteFile faile with error %d',[GetLastError()]));
exit;
end; ShowMessage(format('write %d Bytes',[bytesWrite]));
CloseHandle(pipeHandle);
end; constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
memo1.Clear;
memo1.Text:='猪悟能到此一游,通过命名管道!hello';
pipeNameStr:='\\.\Pipe\Jim';
end; end.
Delphi 简单命名管道在两个进程间通讯的更多相关文章
- Windows进程间通讯(IPC)----管道
管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...
- Android AIDL 进行进程间通讯(IPC)
编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...
- Unix系统中,两个进程间的通信
进程之间通常需要进行数据的传输或者共享资源等,因此进程间需要通讯. 可以通过管道,信号,消息队列,共享内存,信号量和套接字等方式 FIFO表示命名管道,这种管道的操作是基于先进先出原理. PIPE 表 ...
- 管道实现进程间通讯 、WaitNamedPipe
一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...
- C# 调用Windows API实现两个进程间的通信
使用Windows API实现两个进程间(含窗体)的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 从C#下使用WM_COPYD ...
- C#进程间通讯或同步的框架引荐
这篇文章主要介绍了一个进程间通讯同步的C#框架,代码具有相当的稳定性和可维护性,随着.NET的开源也会被注入更多活力,推荐!需要的朋友可以参考下 0.背景简介 微软在 .NET 框架中提供了多种实用 ...
- High Performance Networking in Google Chrome 进程间通讯(IPC) 多进程资源加载
小结: 1. 小文件存储于一个文件中: 在内部,磁盘缓存(disk cache)实现了它自己的一组数据结构, 它们被存储在一个单独的缓存目录里.其中有索引文件(在浏览器启动时加载到内存中),数据文件( ...
- 服务 进程间通讯 IPC AIDL Parcelable 简介
1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译: IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...
- C#进程间通讯技术-整理。
原文:C#进程间通讯技术-整理. 扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1) ...
随机推荐
- Expm 9_3 无向图的双连通分量问题
[问题描述] 给定一个无向图,设计一个算法,判断该图中是否存在关节点,并划分双连通分量. package org.xiu68.exp.exp9; import java.util.Stack; p ...
- 一次TIME_WAIT和CLOSE_WAIT故障和解决办法
昨天解决了一个curl调用错误导致的服务器异常,具体过程如下: 里头的分析过程有提到,通过查看服务器网络状态检测到服务器有大量的CLOSE_WAIT的状态. 在服务器的日常维护过程中,会经常用到下面的 ...
- LeetCode(33):搜索旋转排序数组
Medium! 题目描述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值 ...
- php反射类的使用及Laravel对反射的使用介绍
PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法.成员,而反射类则是拆封类中的所有方法.成员变量,并包括私有方法等.就如“解刨”一样,我们可以调用任何关键字修饰的方法.成员.当然在正常业 ...
- zabbix server+agent+proxy搭建性能监控平台
这是新找到了配置文件配置方法但未尝试 每个模块工作职责: Zabbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行: Database Sto ...
- jQuery+存储过程实现无刷新分页(九)
涉及到得知识点: 1.分页存储过程 2.分页原理 3.jQuery DOM操作 4.jQuery Ajax存取数据 效果图:
- CentOS6.8安装360 pika
1.安装依赖包 yum install snappy-devel bz2 libzip-dev libsnappy-dev libprotobuf-dev libevent-dev protobuf- ...
- [转] h5上传视频或文件编写
Html5 finally solves an age old problem of being able to upload files while also showing the upload ...
- Codeforces 707E Garlands
Garlands 我怎么感觉好水啊. 因为询问只有2000组, 离线询问, 枚举联通块再枚举询问, 二维树状数组更新答案. #include<bits/stdc++.h> #define ...
- BZOJ2809 [Apio2012]dispatching 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2809 题意概括 n个点组成一棵树,每个点都有一个领导力和费用,可以让一个点当领导,然后在这个点的子 ...