• windows进程间通讯的方法


    版权声明

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

     

    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.           
    18.         StrCpy(lpMapAddr,"TestFileMap");  
    19.         FlushViewOfFile(lpMapAddr,12+1);  
    20.     }  
    21. }  

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

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

  • 相关阅读:
    PHP函数---$_Get()和$_Post()的用法
    python mysqldb 教程
    python+ mysql存储二进制流的方式
    Android项目 手机安全卫士(代码最全,注释最详细)之七 应用程序的更新安装
    约瑟夫环的两种实现
    80386的各种寄存器一览
    hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]
    物理DG主备库切换时遇到ORA-16139: media recovery required错误
    c# 获取全屏 中鼠标焦点的位置坐标
    hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)
  • 原文地址:https://www.cnblogs.com/findumars/p/4865529.html
Copyright © 2020-2023  润新知