版权声明

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

 

1.使用共享内存

代码如下:

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

  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 
    );

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

  1. Windows进程间通讯(IPC)----消息队列

    消息队列 windows系统是通过消息驱动的,每移动一下鼠标,点击一下屏幕都会产生一个消息.这些消息会先被放在windows的一个系统消息队列(先进先出)中,windows系统会为每一个GUI线程创建 ...

  2. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  3. Windows进程间通讯(IPC)----内存映射文件

    内存映射文件原理 内存映射文件是通过在虚拟地址空间中预留一块区域,然后通过从磁盘中已存在的文件为其调度物理存储器,访问此虚拟内存空间就相当于访问此磁盘文件了. 内存映射文件实现过程 HANDLE hF ...

  4. Windows进程间通讯(IPC)----WM_COPYDATA

    WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...

  5. windows 进程间通讯方法

    Windows平台为我们提供了多种进程间通信的机制,主要包括:注册表方式.共享文件方式.共享内存方式.共享数据段.映射文件方式.管道方式. 剪贴板方式.消息方式.其中注册表方式需要增加注册表表项,而注 ...

  6. Windows进程间通讯(IPC)----管道

    管道的分类 管道其实际就是一段共享内存,只不过Windows规定需要使用I/O的形式类访问这块共享内存,管道可以分为匿名管道和命名管道. 匿名管道就是没有名字的管道,其支持单向传输数据,如果需要双向传 ...

  7. Windows进程间通讯(IPC)----信号量

    线程同步内核对象 操作系统进行进程间同步是利用信号量机制.对于windows系统而言,可以利用一些内核对象进行线程同步,因为这些内核对象可以命名并且属于系统内核,所以可以支持不同进程间的线程同步进而实 ...

  8. Windows进程间通讯(IPC)----套接字

    Windows套接字 Windows套接字即socket,通过socket可以实现在不同的进程间通信,甚至这两个进程可以不在同一个计算机中. Winsock使用步骤 服务端 socket初始化 创建套 ...

  9. [转]Windows 下的进程间通讯及数据共享

    http://blog.codingnow.com/2005/10/interprocess_communications.html Windows 下有很多方法实现进程间通讯,比如用 socket, ...

随机推荐

  1. libvirtVirsh

    virsh基于不同协议远程连接libvirt drivers(Hypervisors) 基于OS系统账号ssh登陆

  2. Q - Get The Treasury - HDU 3642 (扫面线求体积)

    题意:求被三个或三个以上立方体重合的体积 分析:就是平面面积的加强,不过归根还是一样的,可以把z轴按照从小向大分区间N个,然后可以得到N个平面,用平面重复三次以上的在和高度计算体积. ******** ...

  3. activity theme parent 属性浅析

    在AndroidManifest.xml文件中,可以对每一个Activity设置android:themetheme的设置 可以设置为系统自带的格式,也可以自定义格式. A: 系统自带格式 1.and ...

  4. Java基础(十)内部类

    1.使用内部类的原因(3点) ①内部类方法可以访问该内部类定义所在的作用域中的数据,包括私有数据. ②内部类可以对同一个包中的其他类隐藏起来. ③当想要定义一个回调函数且不想编写大量代码时,使用匿名内 ...

  5. 《Effective C++ 》学习笔记——条款11

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  6. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  7. 现代的新语言--Swift初探

    新的语言 WWDC简短的介绍,新的语言Swift就问世了,尽管新语言的名字导致贴吧下歌手粉丝和开发人员们争抢地盘- -,只是雨燕就是这么来了. WWDC keynote里给Swift打上了非常多标签: ...

  8. 2014ACMICPC亚洲区域赛牡丹江现场赛之旅

    下午就要坐卧铺赶回北京了.闲来无事.写个总结,给以后的自己看. 因为孔神要保研面试,所以仅仅有我们队里三个人上路. 我们是周五坐的十二点出发的卧铺,一路上不算无聊.恰巧邻床是北航的神犇.于是下午和北航 ...

  9. ibatis中的resultClass,parameterClass,resultMap,resultType的使用与区别

    parameterClass 是参数类.指定了参数的完整类名(包括包路径).可通过别名避免每次重复书写冗长的类名. resultClass 是结果类, 二.resultClass取值 1.result ...

  10. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...