readprocessmemoty 또는 writeprocessmemory가 부분적으로만 완료됨
두 가지 점을 강조해야 합니다: 1. 프로세스를 열 때 가상 메모리는 작동 가능, 쓰기 가능, 읽기 가능으로 설정되어야 합니다. 쓰기만 가능하면 ReadProcessMemory가 잘못 읽혀집니다. 2. 이 메모리는 해제되어야 합니다.
다음은 프로그램의 일부입니다. CLIENT 프로그램: #define WM_COMPAREIMAGE WM_USER 100 void CTestCompareDlg::OnBnClickedButton1() { HANDLE hProcess = NULL; HWND hServerWnd =::FindWindow(NULL, "CompareServer"); hServerWnd == NULL) { //프로세스 생성 필요 return;: GetWindowThreadProcessId(hServerWnd, & dwProcessId); hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, dwProcessId) return; * pMyInfo = NULL; pMyInfo = (MyInfo *)VirtualAllocEx(hProcess, NULL, sizeof(MyInfo), MEM_COMMIT, PAGE_READWRITE) if(pMyInfo == NULL) myInfo myInfo.red = 3333 ; WriteProcessMemory(hProcess, pMyInfo, & myInfo, sizeof(MyInfo), NULL); ::SendMessage(hServerWnd, WM_COMPAREIMAGE, sizeof(MyInfo), (LPARAM)pMyInfo) BOOL bRet = :: ReadProcessMemory(hProcess, pMyInfo, & myInfo2, sizeof(MyInfo), & dwRead); dwRead = GetLastError(); m_log.Format("red =.2f, blue=.2f", myInfo2.blue, myInfo2.red); (m_log); VirtualFreeEx(hProcess, pMyInfo, 0, MEM_RELEASE); UpdateData(FALSE); } SERVER 절차: LRESULT CMyWindow::OnCompareImage(HWND hWnd, WPARAM wParam, LPARAM lParam) { if(wParam lt; sizeof(MyInfo) ) 반환 -1; MyInfo * pMyInfo = (MyIn
fo *)lParam; sprintf(m_strLog, "클라이언트: 빨간색=.2f, 파란색=.2f", pMyInfo-gt; 빨간색, pMyInfo-gt; 파란색) :: TextOut(GetDC(hWnd), 0, 50, m_strLog , strlen(m_strLog)); pMyInfo-gt; red = 2.0; } 소스 코드 다운로드: /windcsn/archive/2006/04/ 20/5981.aspx