windows進程間通訊的方法

來源:互聯網
上載者:User

標籤:

著作權聲明

請尊重原創作品。轉載請保持文章完整性,並以超連結形式註明原始作者“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 
    );   

windows進程間通訊的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.