標籤:
著作權聲明
請尊重原創作品。轉載請保持文章完整性,並以超連結形式註明原始作者“tingsking18”和主要站台地址,方便其他朋友提問和指正。
1.使用共用記憶體
代碼如下:
[cpp] view plaincopy
- void FileMapping(void)
- {
- //開啟共用的檔案對象。
- m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));
- if (m_hMapFile)
- {
- //顯示共用的檔案資料。
- LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
- OutputDebugString(lpMapAddr);
- }
- else
- {
- //建立共用檔案。
- m_hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "TestFileMap");
- //拷貝資料到共用檔案裡。
- LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
-
- StrCpy(lpMapAddr,"TestFileMap");
- FlushViewOfFile(lpMapAddr,12+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函數,接受方在資料拷貝完成前不返回,這樣發送方就不可能刪除和修改資料:
[cpp] view plaincopy
- HWND hWnd=::FindWindow(NULL,"b");
- if(hWnd!=NULL)
- {
- COPYDATASTRUCT cpd; /*給COPYDATASTRUCT結構賦值*/
- cpd.dwData = 0;
- cpd.cbData = strlen("字串");
- cpd.lpData = (void*)"字串";
- ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//發送!
- }
接收的時候:
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進程間通訊的方法