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

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值