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) ...
随机推荐
- PYTHON-面向对象 继承 派生
1. 什么是继承 继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承有3个特点: 1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题) 2. 在p ...
- AS 中 Plugin for Gradle 和 Gradle 之间的版本对应关系
Plugin for Gradle 和 Gradle 之间的版本对应关系 来源:https://developer.android.com/studio/releases/gradle-plugin. ...
- vue系列之vue-resource
vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且 ...
- html5手机 input file 上传图片 调用API
<input type="file" accept="video/*;capture=camcorder"> <input type=&quo ...
- java StringTokenizer
在java引入正则表达式和Scanner类之前分割字符串的唯一方法是使用StringTokenizer来分词,不过现在有了正则表达式和Scanner类我们可以使用更加简单更加简洁的方式来完成同样的工作 ...
- Laravel 的文件存储 - Storage
记录一下 Laravel Storage 的常见用法 内容写入磁盘文件 > php artisan tinker >>> use Illuminate\Support\Faca ...
- 详解如何进行第三方App接入微信登录
微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...
- 手动部署 kubernetes 1.9 记录
前言 目前 kubernetes 正式版本已经到1.10版本.因为前面有大佬(漠然)已经采完坑,所以自己也试着部署 kubernetes 1.9 体验下该版本的新特性.对于前面部署的 kubernet ...
- “教你如何玩转Web响应式布局” 的更多相关文章
“教你如何玩转Web响应式布局” 的更多相关文章 网址:http://www.360doc.com/relevant/641896074_more.shtml
- BZOJ2618 [Cqoi2006]凸多边形 凸包 计算几何
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2618 题意概括 给出多个凸包,求面积交. 题解 首先我们考虑两个凸包相交的情况. 例题:HDU16 ...