`
zyy200411
  • 浏览: 46382 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】VC++中进程间相互通信的十一种方法

阅读更多

      进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

  一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方

  另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。

  为了能在两个进程之间进行通讯,由以下几种方法可供参考:

  1、剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

  2、窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

  3、使用共享内存方式(Shared Memory)

  a.设定一块共享内存区域

         HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)

  产生一个file-mapping核心对象

      LPVOID MapViewOfFile(
              HANDLE hFileMappingObject,
              DWORD dwDesiredAcess,
              DWORD dwFileOffsetHigh,
              DWORD dwFileOffsetLow,
              DWORD dwNumberOfBytesToMap
      );

  得到共享内存的指针

  b.找出共享内存

  决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己排在第一位,并接下来将共享内存初始化。

  还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

      HANDLE OpenFileMapping(DWORD dwDesiredAccess,
                   BOOL bInheritHandle,
                   LPCTSTR lpName);

  再调用MapViewOfFile(),取得共享内存的指针

  c.同步处理(Mutex)

  d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

         CloseHandle()

  4、动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能

  其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。

  5、消息管道(Message Pipe)

  用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序访问一个平面文件一样读写数据。

  匿名管道(Anonymous Pipes)

  单向流动,并且只能够在同一电脑上的各个进程之间流动。

  命名管道(Named Pipes)

  双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。

  可以被使用于I/O Completion Ports

  6、邮件槽(Mailslots)

  广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户

  7、Windows套接字(Windows Socket)

  它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。

  8、Internet通信 它让应用程序从Internet地址上载或下载文件

  9、RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。

  10、串行/并行通信(Serial/Parallel Communication)

  它允许应用程序通过串行或并行端口与其他的应用程序通信

  11、COM/DCOM通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。

分享到:
评论

相关推荐

    VC++中进程间相互通信十一种方法

    ### VC++中进程间相互通信的十一种方法 #### 一、进程概念与通信背景 在计算机科学中,进程通常被定义为一个正在运行的程序的实例,它由两部分组成: 1. **操作系统用来管理进程的内核对象**:这部分是系统用来...

    VC++中进程间相互通信的十一种方法

    本文将详细解析十一种不同的VC++进程间通信方法。 1. **剪贴板(Clipboard)**:在早期的16位系统中,剪贴板常用于进程间的简单数据交换。VC++的CWnd类提供了对剪贴板操作的支持,包括复制和粘贴数据。 2. **窗口...

    进程间通信--操作系统实验

    在操作系统领域,进程间通信(IPC,Inter-Process Communication)是一项至关重要的技术,它使得不同进程之间能够交换数据,协同工作。本实验“进程间通信--操作系统实验”旨在帮助学生深入理解和熟练掌握这一核心...

    VC++网络通信编程实例

    1. **套接字(Sockets)编程**:套接字是网络通信的基础,它是进程间通信的一种方式,允许不同计算机上的进程相互通信。在VC++中,通常通过Windows Socket API(Winsock)来实现套接字编程。开发者需要理解TCP/IP...

    VC++6.0网络通信工程

    SOCKETS是网络通信的标准接口,它提供了一种进程间通信(IPC)机制,使得不同计算机上的应用程序能够相互通信。在Windows系统中,通常使用Winsock库来实现SOCKETS编程。Winsock提供了一系列的API函数,如socket()...

    VC++深入详解学习笔记

    笔记涵盖了从Windows程序内部运行机制到MFC程序框架、消息映射机制、DC获取、菜单编程、对话框编程、图形绘制、文件操作、文档和串行化、网络编程、多线程和简单聊天室制作、线程同步与异步套接字编程、进程间通信、...

    进程通信程序设计--------聊天系统

    进程通信(Inter-Process Communication, IPC)则是指两个或多个进程间交换数据的方法,这在实现多进程协作、服务交互或者像聊天应用这样的实时通信系统中至关重要。 MTChat项目可能采用了多种进程通信方式,如管道...

    VC++编写COM组件教程

    COM(Component Object Model)是微软提出的一种软件组件模型,它允许不同编程语言和操作系统环境中的对象相互通信。在VC++中,利用ATL(Active Template Library)库可以简化COM组件的开发。本教程将深入探讨如何...

    VC++多线程/进程编程实例(3)(7个实例-附源代码)

    - 对进程的理解有助于设计更大规模的并发系统,学习如何管理进程间的资源分配和通信。 7. **实践与调试**: - 运行提供的源代码,观察多线程执行的效果,使用调试工具如Visual Studio的调试器,查看线程状态,...

    VC++学习资料

    进程间通信(IPC)允许不同进程之间共享数据或协调操作,MFC提供了多种IPC机制,如命名管道和共享内存。ActiveX控件则是扩展应用程序功能的一种方式,通过嵌入外部控件,可以轻松地为应用程序添加多媒体、数据库访问...

    VC通信设计 涉及网络层的编程

    Socket是进程间通信的一种方式,尤其适合于跨网络的通信。在VC++中,通过#include 和链接ws2_32.lib库,我们可以创建和操作Socket对象。使用socket()函数创建Socket,bind()函数绑定本地地址,listen()设置监听状态...

    vc++之Activex开发

    COM定义了一种接口,使得不同语言和不同进程中的对象可以相互通信。ActiveX控件本质上就是实现了COM接口的组件。 3. **DCOM(Distributed Component Object Model)**:当需要在分布式环境中使用COM组件时,DCOM...

    VC++编的一个简单的Finger程序

    套接字是网络通信的基础,它是进程间通信的一种方式,允许不同计算机上的进程相互通信。在VC++中,可以使用Winsock库来实现套接字编程。以下是一些基本步骤: 1. **初始化Winsock**:调用`WSAStartup`函数来启动...

    VC++多线程编程

    2. **创建线程**:在VC++中,可以通过两种方式创建线程:一是使用Win32 API函数CreateThread,二是使用C++标准库中的std::thread。CreateThread是Windows API提供的,适用于Windows平台,而std::thread是C++11引入的...

    有关vc的多进程线程.rar_Windows多进程_多进程_多进程 windows

    在"多进程线程.doc"这个文档中,可能详细介绍了如何在VC++中实现多进程和多线程,包括进程的创建、进程间通信(如管道、命名管道、共享内存、邮件槽等)以及线程的创建、线程同步和线程安全的数据访问。此外,文档...

    VC++ winsocket编程,局域网聊天室

    套接字(Socket)是网络通信中的基本单元,它提供了进程间通信的接口,使得运行在不同主机上的程序能够相互通信。Winsocket API遵循BSD Unix的套接字模型,提供了一套跨平台的网络编程接口。 在VC++6.0环境下,使用...

    Socket 通讯实例(VC++)

    Socket,也称为套接字,是网络通信的基本组件,它提供了进程间通信(IPC)的能力,尤其是在网络环境中,使得运行在不同计算机上的应用程序能够相互通信。 在VC++环境下,开发Socket程序通常涉及到以下几个关键知识...

    VC++多线程编程基础实例和源代码

    不同的是,互斥量可以在进程间共享,而临界区只能在同一进程中使用。`CreateMutex`用于创建互斥量,`WaitForSingleObject`用于等待互斥量,`ReleaseMutex`则用于释放互斥量。 在实现这些同步机制时,还需要注意避免...

    VC++ (MFC)编程来操纵word

    COM是一种二进制标准,允许不同进程间的组件相互通信,Word就是通过COM接口暴露了它的功能给其他应用程序使用。 首先,我们需要包含必要的头文件,如`#import`指令引入`msword.tlb`,这是一个包含Word对象模型的...

Global site tag (gtag.js) - Google Analytics