윈도우 프로세스 간 통신

  마이크로 소프트 Win32 응용 프로그래밍 인터페이스 (응용 프로그램 API, 인터페이스 프로그래밍), 응용 프로그램 및 이러한 활동의 행사의 교환 메커니즘을 공유하는 데이터라는 프로세스 간 통신 메커니즘 (프로세스 간 통신, IPC) 사이에 많은 지원을 제공하는 의사 소통의 과정을 말합니다 서로 다른 프로세스 사이 데이터 공유 및 데이터 교환 . 방법 프로세스 간 통신은 다음과 같습니다 :

1, 파일 매핑

  프로세스가 처리하는대로 파일 매핑 (메모리 매핑 된 파일)는 메모리 주소 범위로 파일의 내용을 처리 할 수 있습니다. 따라서, 프로세스가 파일 I / O 작업을 사용하지 않는, 포인터 동작은 단순히 파일의 내용을 읽고 수정할 수 있습니다.
  는 Win32 API는 각각의 프로세스는 자신의 주소 공간에 메모리에 대한 포인터를 수신, 여러 프로세스가 동일한 파일 매핑 개체에 액세스 할 수 있습니다. 이 포인터를 사용하여 다른 프로세스를 읽거나 파일의 내용을 수정할 수, 파일에 데이터를 공유 할 수 있습니다.
응용 프로그램 파일 매핑 오브젝트를 공유하는 여러 프로세스를 가능하게하는 방법은 세 가지가 있습니다 :
  (1) 상속 : 첫 번째 과정 설립 파일 매핑 개체, 그 아이가 개체에 대한 핸들을 상속합니다.
  (2) 파일 매핑 이름 : 파일 매핑 개체를 만들 때 첫 번째 프로세스가 (파일 이름이 다를 수 있습니다) 객체에 이름을 할당 할 수 있습니다. 두 번째 과정은 이름으로 파일 매핑 개체를 열 수 있습니다. 또한, 첫 번째 프로세스는 다른 IPC 메커니즘 (명명 된 파이프, 메일 슬롯 등)을 통해 두 번째 프로세스로 전달 자신의 이름을 넣을 수 있습니다.
  (3), 핸들 복사 : 제 프로세스 설정 파일 매핑 객체 다음 두 번째 오브젝트 핸들 공정 다른 IPC 메커니즘 (네임드 파이프, 메일 슬롯 등)를 통과한다. 두 번째 프로세스는 파일 매핑 개체에 대한 액세스를 얻을 수있는 핸들을 복제합니다.
  파일 매핑을 여러 프로세스간에 데이터를 공유하는 매우 효과적인 방법이다, 더 나은 보안이 있습니다. 그러나, 파일 매핑은 단지 네트워크에서 사용할 수 없습니다 로컬 시스템에서 프로세스간에 사용할 수 있습니다 , 그리고 개발자는 또한 프로세스 사이의 동기화를 제어해야합니다 .

단계 1.1 파일 매핑

: 파일 매핑 만든
  1) 파일을 엽니를 CreateFile
  2)하여 CreateFileMapping 파일 매핑 객체 생성하기
  3)지도보기를 만들, 메모리 MapViewOfFile에 맵 파일을  

데이터 공유 통신의 과정을 실현하지 않는 파일 매핑 파일을 생성합니다 :

공정 1 :

  1) 파일 매핑 오브젝트하여 CreateFileMapping 만들기

  2)지도보기, 메모리 맵 파일을 만듭니다 MapViewOfFile

공정 2 :

  1) 파일 매핑 개체 OpenFileMapping을 엽니 다

  2)지도보기, 메모리 맵 파일을 만듭니다 MapViewOfFile

1.2 정리 단계

  1) 매핑 해제는 UnmapViewOfFile보기
  2) 닫기하여 CloseHandle 맵 오브젝트를
  . 3) 닫기 파일하여 CloseHandle

2, 공유 메모리

  Win32 API를 공유 메모리 (공유 메모리)는 실제로 파일 매핑의 특별한 경우이다. 파일 핸들 (HANDLE) 대신 0xFFFFFFFF를 가진 파일 매핑 객체를 생성 할 때 프로세스는 해당 파일 매핑 객체가 메모리 블록에 액세스 할 수있는 파일 매핑 오브젝트를 열고, 운영 시스템 페이지 파일 메모리에서 다른 프로세스에 액세스하는 것을 의미한다. 메모리가 파일 매핑 구현을 공유하고 있기 때문에, 그래서 그것은 좋은 안전을 가지고, 또한 동일한 컴퓨터에서 프로세스 사이에서 실행할 수 있습니다 . IPC 통신은 통신의 가장 빠른 방법입니다. 동기화 문제가 고려 될 필요가있다.

2.1 공유 메모리 공정

  1) 메모리 매핑 API 기능을하여 CreateFileMapping는 서버 프로세스의 이름으로 식별되는 공유 메모리를 만들 호출;

  당신이 파일 매핑 객체를 생성 한 후 2), 서버 프로세스는 프로세스의 주소 공간에 매핑 MapViewOfFile 함수를 호출;

  3) 클라이언트 프로세스가 공유 메모리의 개체에 액세스, 당신은 공유 메모리 객체 핸들을 얻기 위해, 객체 이름으로 메모리 기능을 OpenFileMapping 호출 할 필요가;

  클라이언트 프로세스가 핸들을 성공적으로 공유 메모리 개체를 얻을 경우 4) 다음 MapViewOfFile 개체보기를 매핑 할 함수를 호출합니다. 데이터에 사용되는 물체를 볼 수있는 사용자가 읽기 및 쓰기 동작은 데이터 통신의 목적을 달성하는 단계;

  최종 사용자 프로세스가 공유 메모리를 사용하는 경우 5)의 주소 공간에서 UnmapViewOfFile보기를 취소하는 기능을 호출

3, 익명 파이프

  프로세스의 일 단부가 처리 할 수 있고 다른 단부는 핸들 프로세스 통신을 가지고 파이프 (파이프)는 두 단부를 갖는 통신 채널이다. 양방향 일 - 파이프 판독 및 기록 가능한 양 단부 지점 말단는 읽기 전용, 쓰기 전용, 다른 엔드 포인트 - 도관은 단방향 일 수있다.
  익명 관 (익명 파이프)이다  또는 동일한 부모 프로세스의 두 개의 서브 - 프로세스 간의 데이터를 전송하는 단방향 파이프 라인의 이름없이 부모 및 자식 프로세스간에 . 일반적으로 부모 프로세스 배관에 의해 생성하고 읽을 수있는 통신 엔드 포인트 핸들의 채널 또는 쓰기 엔드 포인트 핸들 자식 프로세스에 의해 상속하고 통신 할 수 있습니다. 부모 프로세스는 두 개 이상의 익명 파이프 상속 읽기 및 쓰기 핸들 자식 프로세스를 생성 할 수 있습니다. 이러한 보조 공정이 아닌 상위 프로세스에서 요구되는 파이프를 이용하여 직접 통신 할 수있다.
  익명 파이프 서브 프로세스 표준 I / O 재 단일 시스템에서, 그것이 달성하기위한 효과적인 방법은 인터넷을 사용할 수없고, 두 개의 관련되지 않은 프로세스간에 사용될 수 없다 .

3.1 익명의 파이프 라인을 만들려면

  1), 상속 가능한 핸들 보안 속성 기술자를 만들기
  두 파이프 CreatePipe을 만들 수 2).
  3) 출력을 재 기입하고 리디렉션 서브 프로세스 자식 프로세스를 판독
  ) 4 자식 프로세스의 CreateProcess를 생성
  )도 5는 판독 \ 기록 데이터를 자식 프로세스로의 WriteFile

  참여 관련 구조는 다음과 같습니다 STARTUPINFO, PROCESS_INFORMATION 및 SECURITY_ATTRIBUTES.

4, 명명 된 파이프

  命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
  命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,最好不要同时和多个进程通信

4.1 步骤

服务端流程:

  1)创建命名管道:CreateNamedPipe

  2)等待客户端连接:ConnectNamedPipe

  3)读取客户端请求数据:ReadFile

  4)向客户端回复数据:WriteFile

  5)关闭连接:DisconnectNamedPipe

  6)关闭管道:CloseHandle

客户端流程:

  1)打开命名管道:CreateFile

  2)等待服务端响应:WaitNamedPipe

  3)切换管道为读模式:SetNamedPipeHandleState

  4)向服务端发数据:WriteFile

  5)读服务端返回的数据:ReadFile

  6)关闭管道:CloseHandle

5、邮件槽

  邮件槽(Mailslots)提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
  通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
  邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。

5.1 步骤

服务端流程:

  1)创建CreateMailslot

  2)进行读写操作ReadFile

  3)关闭句柄CloseHandle

客户端流程:

  1)同服务端

6、剪贴板

  剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
  剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用

6.1 步骤

1)设置数据

  打开剪贴板OpenClipboard

  分配空间GlobalAlloc

  获取首地址并加锁GlobalLock

  解锁GlobalUnlock

  清空剪贴板EmptyClipboard

  将数据放到剪贴板SetClipboardData

  关闭剪贴板CloseClipboard

2)读取数据

  打开剪贴板OpenClipboard

  判断剪贴板的值IsClipboardFormatAvailable

  获取数据GetClipboardData,格式为CF_TEXT

  获取首地址并加锁GlobalLock

  解锁GlobalUnlock

7、动态数据交换

  动态数据交换(DDE:dynamic data exchange)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
  DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:
  (1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
  (2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
  (3) 热链:当数据交换时服务器自动给客户发送数据。
  DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。

8、对象连接与嵌入

  应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某些应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。

 9、动态链接库

  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。

10、远程过程调用

 

  Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用
  由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。

11、NetBios函数 

  Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。

12、Sockets

  Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。
  现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。

12.1 步骤

服务端:

  建立Socket
  声明自身的端口号和地址并绑定到Socket
  使用Listen打开监听,然后不断用Accept去查看是否有连接,如果有,捕获Socket,并通过Recv获取消息的内容
  通信完成后调用CloseSocket关闭这个对应Accept到的Socket,如果不再需要等待任何客户端连接,那么用CloseSocket关闭掉自身的Socket 
客户端:
  建立Socket
  通过端口号和地址确定目标服务器,使用Connect连接到服务器
  send发送消息,等待处理
  通信完成后调用CloseSocket关闭Socket

13、WM_COPYDATA消息

  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。 

根据应用程序是在网络环境下还是在单机环境下工作选择不同的通信方式。

추천

출처www.cnblogs.com/Sheenagh/p/12222797.html