进程间通讯的方法

1.使用共享内存

代码如下:

[cpp] view plaincopy

  1. void FileMapping(void)
  2. {
  3. //打开共享的文件对象。
  4. m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));
  5. if (m_hMapFile)
  6. {
  7. //显示共享的文件数据。
  8. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
  9. OutputDebugString(lpMapAddr);
  10. }
  11. else
  12. {
  13. //创建共享文件。
  14. m_hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "TestFileMap");
  15. //拷贝数据到共享文件里。
  16. LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
  17. StrCpy(lpMapAddr,"TestFileMap");
  18. FlushViewOfFile(lpMapAddr,12+1);
  19. }
  20. }

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

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函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:

[cpp] view plaincopy

  1. HWND hWnd=::FindWindow(NULL,"b");
  2. if(hWnd!=NULL)
  3. {
  4. COPYDATASTRUCT   cpd;   /*给COPYDATASTRUCT结构赋值*/
  5. cpd.dwData   =   0;
  6. cpd.cbData   =   strlen("字符串");
  7. cpd.lpData   =   (void*)"字符串";
  8. ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!
  9. }

接收的时候:

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

);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 00:39:48

进程间通讯的方法的相关文章

windows进程间通讯的方法

版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正.   1.使用共享内存 代码如下: [cpp] view plaincopy void FileMapping(void) { //打开共享的文件对象. m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap")); if (m_hMapFile) { //显

linux进程间通讯-System V IPC 信号量

进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在

C#进程间通讯技术-整理。

原文:C#进程间通讯技术-整理. 扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1)共享内存 包括:内存映射文件,共享内存DLL,剪切板. 2)命名管道及匿名管道 3)消息通讯 4)利用代理方法.例如SOCKET,配置文件,注册表方式. 等方式. 方法一:通讯. 进程间通讯的方式有很多,常用的有共享内存(内存映射文件.共享内存DLL.剪切板等).命名管道和匿名管道.发送消息等几种方

Android AIDL 进行进程间通讯(IPC)

编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3.AIDL默认支持的类型包括java基本类型 (int.long.boolean等) 和 (String.List.Map.CharSequence),使用这些类型时不需要import声明.对于List和Map中的元素类型必须是AIDL支持的类型,如果使用自定义类型作为参数或者返回值,自定义类型必须实

Android进阶笔记04:Android进程间通讯之Messenger ( 区别于AIDL)

一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消息的进程间通信,就像子线程和UI线程发送消息那样,是不是很简单,还不用去写AIDL文件,是不是有点小爽.哈哈.此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信:甚至作为一个转接处,任意两个进程都能通过服务端进行通信. (2) Messenger 与 AIDL 比较:    

UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

 IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对的IPC的持续性(Persistence of IPC Object)也有三种: 随进程持续的(Process-Persistent IPC) IPC对象一直存在,直到最后拥有他的进程被关闭为止,典型的IPC有pipes(管道)和FIFOs(先进先出对象) 随内核持续的(Kernel-persist

Android进程间通讯之messenger

这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消息的进程间通信,就像子线程和UI线程发送消息那样,是不是很简单,还不用去写AIDL文件,是不是有点小爽.哈哈. 此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信:甚至作为一个转接处,任意两个进程都能通过服务端进行通信. 与 AIDL 比较: 当您

进程间通讯。

进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有自己的一部分独立的系统资源,彼此是隔离的. 为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信. 举一个典型的例子,使用进程间通信的两个应用可以被分类为客户端和服务器(见主从式架构),客户端进程请求数据,服务端回复客户端的数据请求. 有一些应用本身既是服务器又是客户端,这在分布式计算中,

【IPC进程间通讯之一】邮槽MailSlot

IPC进程间通信+邮槽MailSlot         IPC(Inter-Process Communication,进程间通信).        现代计算机采用虚拟内存机制,为进程提供独立的足够大的地址空间,处于安全目的,一个进程不具有特殊的权限,是无法访问另一个进程的内存空间,进程间相互隔绝.进程间通信IPC就需要特别的机制来实现,邮槽MailSlot是常用的IPC方法之一.                 1.邮槽(MailSlot):                 邮槽MailSlo