共享內存的疑惑html
代碼是前輩寫的,可能擅長c++,繼續上一篇的文章,我把c++的代碼貼出來:
c++
static ShareDataRW() { Handle = CreateFileMappingA(new IntPtr(-1), IntPtr.Zero, 0x04, 0, 1024, "Local\\NoteFirstShare_Memory"); if (Handle == IntPtr.Zero) return; ShareDataMemoryPoint = MapViewOfFile(Handle, SECTION_ALL_ACCESS, 0, 0, 1024); ShareDataType = typeof(ShareData); if (OfficeAddinServicesPort == 0) OfficeAddinServicesPort = 4211; }
[DllImport("kernel32.dll")] public static extern IntPtr CreateFileMappingA( IntPtr hFile, IntPtr lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName); [DllImport("kernel32.dll")] public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);
CreateFileMappingA方法: 爲指定文件建立或打開命名或未命名的文件映射對象
MapViewOfFile方法:將一個文件映射對象映射到當前應用程序的地址空間
文件映射這些概念涉及到操做系統裏面的東西,不太好理解。這些能夠慢慢學習的。 CreateFileMappingA函數的最後一個參數,是共享內存名稱,若是我修改了這個參數值後,讀寫共享內存的數據就一致了。因而我去查這個參數的含義:
lpName
若是此參數與現有映射對象的名稱匹配,則該函數請求具備flProtect指定的保護的對象的訪問權限。app
若是此參數爲NULL,則建立沒有名稱的文件映射對象。函數
若是lpName與現有事件,信號量,互斥鎖,等待計時器或做業對象的名稱匹配,則該函數將失敗,而且GetLastError 函數將返回ERROR_INVALID_HANDLE。這是由於這些對象共享相同的命名空間。post
該名稱能夠具備「全局」或「本地」前綴,以在全局或會話命名空間中顯式建立對象。名稱的其他部分能夠包含除反斜槓字符()以外的任何字符。從會話零之外的會話在全局命名空間中建立文件映射對象須要 SeCreateGlobalPrivilege 特權。有關更多信息,請參閱 內核對象命名空間。學習
經過使用終端服務會話實現快速用戶切換。第一個登陸用戶使用會話0(零),下一個登陸用戶使用會話1(一),依此類推。內核對象名稱必須遵循爲終端服務概述的準則,以便應用程序能夠支持多個用戶。spa
這一段摘自微軟官網上面,讀的不甚明白。這個參數的值設置應該沒什麼問題,由於它沒有報任何錯誤,能夠正常讀寫內存。那麼問題,究竟出哪呢?操作系統