`
buliedian
  • 浏览: 1237490 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

windows进程间通讯的方法

阅读更多

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

1.使用共享内存

代码如下:

注意:使用完成共享内存后,要删除共享内存,否则会生成很多临时文件。

UnmapViewOfFile(m_hMapFile)

2.使用dll在进程间共享内存

#pragma data_seg (".IdleUI") // you must define as SHARED in .def
HHOOK g_hHookKbd = NULL; // one instance for all processes
HHOOK g_hHookMouse = NULL; // one instance for all processes
DWORD g_dwLastInputTick = 0; // tick time of last input event
#pragma data_seg ()
然后在def文件中定义:SECTIONS .IdleUI READ WRITE SHARED

注意:共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3.使用WM_COPYDATA在窗体程序间传递消息。

发送的时候的代码如下:WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:

接收的时候:

afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);


BOOL CMyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

4.调用ReadProcessMemory以及WriteProcessMemory函数.

调用ReadProcessMemory以及WriteProcessMemory函数用户在发送进程中分配一块内存存放数据,调用GlobalAlloc或VirtualAlloc函数实现:
pApp->m_hGlobalHandle=GlobalAlloc(GMEM_SHARE,1024);
可以得到指针地址:
pApp->mpszGlobalHandlePtr=(LPSTR)GlobalLock
(pApp->m_hGlobalHandle);
在接收进程中要用到用户希望影响的进程的打开句柄。为了读写另一进程,按如下方式调用OpenProcess函数:
HANDLE hTargetProcess=OpenProcess(
STANDARD_RIGHTS_REQUIRED|
PROCESS_VM_REDA|
PROCESS_VM_WRITE|
PROCESS_VM_OPERATION,//访问权限
FALSE,//继承关系
dwProcessID);//进程ID
为保证OpenProcess函数调用成功,用户所影响的进程必须由上述标志创建。
用户获得一个进程的有效句柄,就可调用ReadProcessMemory函数读取该进程的内存:
BOOL ReadProcessMemory(
HANDLE hProcess, // 进程指针
LPCVOID lpBaseAddress, // 数据块的首地址
LPVOID lpBuffer, // 读取数据所需缓冲区
DWORD cbRead, // 要读取的字节数
LPDWORD lpNumberOfBytesRead
);
使用同样的句柄也可以写入该进程的内存:
BOOL WriteProcessMemory(
HANDLE hProcess, // 进程指针
LPVOID lpBaseAddress, // 要写入的首地址
LPVOID lpBuffer, // 缓冲区地址
DWORD cbWrite, // 要写的字节数
LPDWORD lpNumberOfBytesWritten
);

分享到:
评论

相关推荐

    Windows进程间通信

    在Windows操作系统中,进程间通信(IPC,Interprocess Communication)是一种技术,允许不同的进程之间共享数据、协调工作或交换信息。这种技术对于多线程和多进程应用的开发至关重要,尤其是在分布式系统和并发编程...

    C# 进程间通信 Windows消息通讯,SendMessage

    Windows进程之间是相互独立的,通过Windows消息机制,我们可以在进程之间进行通信,适合一台电脑的windows平台下进行消息交换,该例是两个winform之间通过windows消息发送和接收数据。 1、进程间通信 2、SendMessage...

    Windows下进程间通信

    结合上述技术,一个典型的Windows进程间通信流程可能是这样的: 1. 启动进程A和进程B,它们都创建内存文件映射,共享同一块内存区域用于数据传输。 2. 进程A将数据写入内存映射区,同时增加一个信号量的计数值,...

    windows 进程间通讯大全

    ### Windows 进程间通信(IPC)大全 在Windows操作系统中,进程间通信(IPC, Inter-Process Communication)是实现不同进程之间数据交换的关键技术。本文将详细介绍Windows平台下的多种进程间通信方式,并分析每种...

    windows API进程间的通信

    Windows API进程间的通信 概述:Windows API提供了多种方式来实现进程间的通信,包括管道、内存映射文件、命名消息、剪贴板、磁盘文件等。本文将详细介绍使用管道实现进程间的通信,并通过Windows API函数建立父...

    windows 与linux 进程间通信区别

    为了帮助开发者了解如何将Windows平台上开发的使用IPC的应用程序移植到Linux,本文将详细探讨Windows与Linux在进程间通信方面的区别,并以此为基础提供迁移指导。 首先,同步技术是进程间通信中的重要组成部分。在...

    windows内存共享进程间通信

    Windows内存共享进程间通信是一种高效的数据交换手段,通过内存映射文件、全局原子等方法实现。然而,正确使用同步机制以避免数据冲突至关重要。了解并熟练掌握各种IPC方式,有助于开发出更稳定、高效的多进程应用...

    Windows 下的进程间通信

    内存映射文件是另一种利用内存进行进程间通信的方法。它将磁盘上的文件映射到进程的地址空间,多个进程可以映射同一个文件,从而实现数据共享。与共享内存类似,内存映射文件也提供了高效的数据交换,但同时提供了...

    Windows进程间通信开篇

    本篇文章将深入探讨Windows进程间通信的基本概念、常用技术以及"kaipian"源码可能涉及的具体实现。 首先,我们要理解什么是进程。在Windows系统中,进程是执行中的程序实例,拥有自己的内存空间,每个进程都有独立...

    Windows下实现进程间通信

    Windows下实现进程间通信。 用于操作系统课程。 功能简单,代码简短、清晰。 适合初学者理解进程间通信的实现。

    通过Windows窗口消息实现 QT进程间通信

    在Windows操作系统环境下,利用Windows窗口消息机制进行进程间通信是一种常见的方法,尤其当涉及到跨语言或者跨框架的交互时。本篇文章将详细探讨如何在QT框架下利用Windows窗口消息来实现进程间通信。 首先,让...

    跨平台进程间通信源码

    在标题中提到的“跨平台进程间通信源码”可能是一个软件库或者框架,旨在帮助开发者在Windows和Linux操作系统上实现进程间的通信。 在Windows系统中,常见的IPC方式包括: 1. **管道(Pipes)**:分为命名管道和...

    Windows进程间通信之共享内存

    共享内存方式实现进程间通信。详细看我的博客:http://blog.csdn.net/pengguokan/article/details/8921346

    windows下进程间通信总结

    在Windows中实现进程间通信的主要方法包括: 1. **文件映射 (Memory-Mapped Files)** 2. **共享内存 (Shared Memory)** 3. **匿名管道 (Anonymous Pipe)** 4. **命名管道 (Named Pipe)** 5. **邮件槽 (Mailslots)**...

    C#实现进程间通讯(源码)

    压缩包文件"20230206 进程通讯"很可能包含了一些C#实现的进程间通信的源代码示例。这些示例可能涵盖了上述提到的几种通信方式,通过查看和学习这些源码,开发者可以更好地理解如何在实际项目中应用这些技术。 总之...

    C#与C++进程间通信

    在Windows系统中,命名管道被广泛用于不同进程间的通信,尤其是跨语言的通信场景,如C#和C++。 在C#中,命名管道的实现主要依赖于`System.IO.Pipes`命名空间,其中`NamedPipeServerStream`和`NamedPipeClientStream...

    delphi进程间通信

    本篇文章将深入探讨如何在Delphi中实现进程间通信,特别是通过消息传递的两种方法。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。为了实现进程...

    进程间通信例子

    这个“进程间通信例子”可能涵盖了上述的一些方法,演示了如何在WinForm应用程序中实现这些通信方式。在实践中,开发者可能会根据具体需求选择最合适的通信方式,例如,如果需要高效的数据传输,可能会选择共享内存...

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

    #### 二、具体通信方法 ##### 1. **剪贴板 (Clipboard)** 剪贴板是一种简单的进程间通信机制,在16位Windows时代被广泛使用。`CWnd`类提供了对剪贴板的支持。然而,由于其简单性和局限性,在现代32位或64位系统中...

Global site tag (gtag.js) - Google Analytics