程序間通訊——記憶體對映/檔案對映形式
阿新 • • 發佈:2019-02-06
記憶體對映/檔案對映形式下的程序交通訊不分32位還是64位,是因為本質上使用的是系統物理頁面(系統位數)。
主要是三個函式:CreateFileMapping;MapViewOfFile(對映記憶體),OpenFileMapping。
// FileSend.cpp : 定義控制檯應用程式的入口點。 // #include <stdio.h> #include<Windows.h> int main() { HANDLE MappingHandle = NULL; PVOID BaseAddres = NULL; MappingHandle=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0X1000,L"HelloWorld"); if (MappingHandle == NULL) { return 0; } BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS,0, 0, 0); __try { memcpy(BaseAddres, "HelloClient", strlen("HelloClient") + 1); printf("%s\r\n", BaseAddres); printf("Input AnyKey To Continue\r\n"); getchar(); printf("%s\r\n", BaseAddres); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("異常\r\n"); goto Exit; } Exit: if (MappingHandle != NULL) { CloseHandle(MappingHandle); MappingHandle = NULL; } printf("Input AnyKey To Exit\r\n"); getchar(); return 0; }
// FileRecv.cpp : 定義控制檯應用程式的入口點。 // #include <stdio.h> #include<windows.h> int main() { HANDLE MappingHandle = NULL; PVOID BaseAddres = NULL; MappingHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"HelloWorld"); if (MappingHandle == NULL) { return 0; } BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0); __try { printf("%s\r\n", BaseAddres); memcpy(BaseAddres, "HelloServer", strlen("HelloServer") + 1); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("異常\r\n"); goto Exit; } Exit: if (MappingHandle != NULL) { CloseHandle(MappingHandle); MappingHandle = NULL; } printf("Input AnyKey To Exit\r\n"); getchar(); return 0; }
Send:建立控制代碼-對映虛擬記憶體-將“HelloClient”寫入虛擬記憶體-等待-讀虛擬記憶體
Recv:開啟控制代碼-對映虛擬記憶體-讀虛擬記憶體-將“HelloServer”寫入虛擬記憶體-等待
(執行的時候先啟動Send再Recv)。
遇到的問題:
1.記憶體對映的方式較簡單,主要就是三個函式的使用問題。