CreateFileMapping使用方法

來源:互聯網
上載者:User

標籤:des   io   os   使用   ar   for   檔案   資料   sp   

CreateFileMapping的MSDN翻譯和使用心得
 
測試建立和開啟檔案對應的時候老是得到"控制代碼無效"的錯誤, 細緻看了MSDN以後才發覺是函數認識不透, 這裡把相關的解釋翻譯出來

HANDLE CreateFileMapping(
  HANDLE hFile,                       //物理檔案控制代碼
  LPSECURITY_ATTRIBUTES lpAttributes, //安全設定
  DWORD flProtect,                    //保護設定
  DWORD dwMaximumSizeHigh,            //高位檔案大小
  DWORD dwMaximumSizeLow,             //低位檔案大小
  LPCTSTR lpName                      //共用記憶體名稱
);

1) 物理檔案控制代碼
   不論什麼能夠獲得的物理檔案控制代碼, 假設你須要建立一個物理檔案無關的記憶體映射也無妨, 將它設定成為 0xFFFFFFFF(INVALID_HANDLE_VALUE)就能夠了.

   假設須要和物理檔案關聯, 要確保你的物理檔案建立的時候的訪問模式和"保護設定"匹配, 比方: 物理檔案僅僅讀, 記憶體映射須要讀寫就會錯誤發生. 推薦你的物理檔案使用獨佔方式建立.

   假設使用 INVALID_HANDLE_VALUE, 也須要設定須要申請的記憶體空間的大小, 不管物理檔案控制代碼參數是否有效, 這樣 CreateFileMapping 就能夠建立一個和物理檔案大小無關的記憶體空間給你, 甚至超過實際檔案大小, 假設你的物理檔案有效, 而大小參數為0, 則返回給你的是一個和物理檔案大小一樣的記憶體空間位址範圍.  返回給你的檔案對應地址空間是能夠通過複製, 整合或者命名得到, 初始內容為0.

2) 保護設定
   就是安全設定, 只是一般設定NULL就能夠了, 使用預設的安全配置. 在win2k下假設須要進行限制, 這是針對那些將記憶體檔案對應共用給整個網路上面的應用進程使用是, 能夠考慮進行限制.

3) 高位檔案大小
   弟兄們, 我想眼下我們的機器都是32位的東東, 不可能得到超過32位進程所能定址的私人32位地址空間, 一般還是設定0吧, 我沒有也不想嘗試將它設定超過0的情況.
4) 低位檔案大小
   這個還是能夠進行設定的, 只是為了讓其它共用使用者知道你申請的檔案對應的相關資訊, 我使用的時候是在獲得的地址空間頭部加入?一個結構化描寫敘述資訊, 記錄記憶體映射的大小, 名稱等, 這樣實際申請的空間就比輸入的添加?了一個頭資訊結構大小了, 我覺得這樣類似BSTR的方式應該是比較合理的.

5) 共用記憶體名稱
   這個就是我今天測試的時候碰壁的禍根, 由於為了對於記憶體進行相互排斥訪問, 我設定了一個相互排斥控制代碼, 而名稱我選擇和命名共用記憶體同名, 之下就是由於他們使用共同的namespace導致了錯誤, 呵呵.

7) 調用CreateFileMapping的時候GetLastError的相應錯誤
   ERROR_FILE_INVALID     假設企圖建立一個零長度的檔案對應, 應有此報
   ERROR_INVALID_HANDLE   假設發現你的命名記憶體空間和現有的記憶體映射, 相互排斥量, 訊號量, 臨界區同名就麻煩了
   ERROR_ALREADY_EXISTS   表示記憶體空間命名已經存在

8) 相關服務或者平台的命名保留
   Terminal Services:
   命名能夠包括 "Global\" 或者 "Local\" 首碼在全域或者會話名空間0基礎檔案對應. 其它部分能夠包括不論什麼除了(\)以外的字元, 能夠參考 Kernel Object Name Spaces.

   Windows 2000 or later:
   假設 Terminal Services 沒有執行 "Global\" 和 "Local\" 首碼的特殊含義就被忽略了

 
CreateFileMapping 函數(轉載)
記憶體映射API函數CreateFileMapping建立一個有名的共用記憶體:
HANDLE CreateFileMapping(
HANDLE hFile,                                    // 對應檔的控制代碼,
                                                 //設為0xFFFFFFFF以建立一個進程間共用的對象
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,   // 安全屬性
DWORD flProtect,                                 // 保護方式
DWORD dwMaximumSizeHigh,                         //對象的大小
DWORD dwMaximumSizeLow,
LPCTSTR lpName                                   // 必須為對應檔命名
);

與虛擬記憶體類似,保護方式能夠是PAGE_READONLY或是PAGE_READWRITE。假設多進程都對同一共用記憶體進行寫訪問,則必須保持相互間同步。對應檔還能夠指定PAGE_WRITECOPY標誌,能夠保證其未經處理資料不會遭到破壞,同一時候同意其它進程在必要時自由的操作資料的拷貝。

在建立檔案對應物件後使用能夠調用MapViewOfFile函數映射到本進程的地址空間內。

以下說明建立一個名為MySharedMem的長度為4096位元組的有名對應檔:
HANDLE hMySharedMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF),
NULL,PAGE_READWRITE,0,0x1000,"MySharedMem");
並映射緩衝區視圖:
LPSTR pszMySharedMapView=(LPSTR)MapViewOfFile(hMySharedMapFile,
FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

其它進程訪問共用對象,須要獲得對象名並調用OpenFileMapping函數。
HANDLE hMySharedMapFile=OpenFileMapping(FILE_MAP_WRITE,
FALSE,"MySharedMem");

一旦其它進程獲得映射對象的控制代碼,能夠象建立進程那樣調用MapViewOfFile函數來映射物件檢視。使用者能夠使用該物件檢視來進行資料讀寫操作,以達到資料通訊的目的。

當使用者進程結束使用共用記憶體後,調用UnmapViewOfFile函數以取消其地址空間內的視圖:
if (!UnmapViewOfFile(pszMySharedMapView))
{

         AfxMessageBox("could not unmap view of file");

 }
 
建立檔案視圖

    要將檔案裡的資料對應到進程的虛擬記憶體中,你必須建立一個檔案的視圖。
    MapViewOfFile和MapViewOfFileEx函數使用CreateFileMapping返回的檔案對應物件控制代碼來在進程的虛擬位址空間裡建立檔案的視圖,或者檔案的某個部分。假設這些函數指定的許可權標誌和CreateFileMapping中的許可權標誌不一致,則會運行失敗。
    MapViewOfFile函數返回一個指向檔案視圖的指標。利用MapViewOfFile中聲明的地址指標,程式就能夠從檔案裡讀以及向檔案裡寫入資料。向檔案視圖中寫入資料會導致檔案對應物件改變。真正將資料寫入到磁碟上的檔案,由系統負責處理。資料並非立即就別寫到磁碟上,非常多檔案的輸入輸出都被緩衝起來,以改善系統的效能。程式能夠調用FlushViewOfFile函數來越過這個方式,強迫系統立即將資料寫入到磁碟中去。
    MapViewOfFileEx函數和MapViewOfFile函數作的工作是一模一樣的,僅僅只是能夠利用MapViewOfFileEx函數的lpvBase參數,來指定檔案視圖在進程虛擬位址空間中的基礎地址。假設在指定的地址處沒有足夠的空間,則調用失敗。
    1、lpvBase參數必須是系統記憶體最小單位的整數倍,否則調用會失敗。要得到系統記憶體的最小單位,使用GetSystemInfo函數,他將資訊寫到SYSTEM_INFO結構的成員中。
    程式能夠從同一個檔案對應物件中建立多個檔案視圖。檔案視圖能夠是不同的大小,但他們必須小於檔案對應物件。MapViewOfFile函數的dwOffsetHigh和dwOffsetLow參數必須是系統記憶體最小單位的整數倍。


檔案對應問題
記憶體對應檔並非簡單的檔案I/O操作,實際用到了Windows的核心編程技術--記憶體管理。所以,假設想對記憶體對應檔有更深刻的認識,必須對Windows作業系統的記憶體管理機制有清楚的認識,記憶體管理的相關知識很複雜,超出了本文的討論範疇,在此就不再贅述,感興趣的讀者能夠參閱其它相關書籍。以下給出使用記憶體對應檔的一般方法:  
   
    首先要通過CreateFile()函數來建立或開啟一個檔案核心對象,這個對象標識了磁碟上將要用作記憶體對應檔的檔案。在用CreateFile()將檔案映像在實體儲存體器的位置通告給作業系統後,僅僅指定了映像檔案的路徑,映像的長度還沒有指定。為了指定檔案對應物件須要多大的實體儲存體空間還須要通過CreateFileMapping()函數來建立一個檔案對應核心對象以告訴系統檔案的尺寸以及訪問檔案的方式。在建立了檔案對應物件後,還必須為檔案資料保留一個地址空間地區,並把檔案資料作為映射到該地區的實體儲存體器進行提交。由MapViewOfFile()函數負責通過系統的管理而將檔案對應物件的所有或部分映射到進程地址空間。此時,對記憶體對應檔的使用和處理同通常載入到記憶體中的檔案資料的處理方式基本一樣,在完畢了對記憶體對應檔的使用時,還要通過一系列的操作完畢對其的清除和使用過資源的釋放。這部分相對照較簡單,能夠通過UnmapViewOfFile()完畢從進程的地址空間恢復檔案資料的映像、通過CloseHandle()關閉前面建立的檔案對應物件和檔案對象。

記憶體對應檔相關函數  
   
    在使用記憶體對應檔時,所使用的API函數主要就是前面提到過的那幾個函數,以下分別對其進行介紹:  
   
  HANDLE   CreateFile(LPCTSTR   lpFileName,  
  DWORD   dwDesiredAccess,  
  DWORD   dwShareMode,  
  LPSECURITY_ATTRIBUTES   lpSecurityAttributes,  
  DWORD   dwCreationDisposition,  
  DWORD   dwFlagsAndAttributes,    
  HANDLE   hTemplateFile);      
   
    函數CreateFile()即使是在普通的檔案操作時也經經常使用來建立、開啟檔案,在處理記憶體對應檔時,該函數來建立/開啟一個檔案核心對象,並將其控制代碼返回,在調用該函數時須要依據是否須要資料讀寫和檔案的共用方式來設定參數dwDesiredAccess和dwShareMode,錯誤的參數設定將會導致對應操作時的失敗。  
   
  HANDLE   CreateFileMapping(HANDLE   hFile,  
  LPSECURITY_ATTRIBUTES   lpFileMappingAttributes,  
  DWORD   flProtect,  
  DWORD   dwMaximumSizeHigh,  
  DWORD   dwMaximumSizeLow,  
  LPCTSTR   lpName);      
   
    CreateFileMapping()函數建立一個檔案對應核心對象,通過參數hFile指定待映射到進程地址空間的檔案控制代碼(該控制代碼由CreateFile()函數的返回值擷取)。因為記憶體對應檔的實體儲存體器實際是儲存於磁碟上的一個檔案,而不是從系統的頁檔案裡分配的記憶體,所以系統不會主動為其保留地址空間地區,也不會自己主動將檔案的儲存空間映射到該地區,為了讓系統能夠確定對頁面採取何種保護屬性,須要通過參數flProtect來設定,保護屬性PAGE_READONLY、PAGE_READWRITE和PAGE_WRITECOPY分別表示檔案對應物件被映射後,能夠讀取、讀寫檔案資料。在使用PAGE_READONLY時,必須確保CreateFile()採用的是GENERIC_READ參數;PAGE_READWRITE則要求CreateFile()採用的是GENERIC_READ|GENERIC_WRITE參數;至於屬性PAGE_WRITECOPY則僅僅須要確保CreateFile()採用了GENERIC_READ和GENERIC_WRITE當中之中的一個就可以。DWORD型的參數dwMaximumSizeHigh和dwMaximumSizeLow也是相當重要的,指定了檔案的最大位元組數,因為這兩個參數共64位,因此所支援的最大檔案長度為16EB,差點兒能夠滿足不論什麼大資料量檔案處理場合的要求。  
   
  LPVOID   MapViewOfFile(HANDLE   hFileMappingObject,  
  DWORD   dwDesiredAccess,  
  DWORD   dwFileOffsetHigh,  
  DWORD   dwFileOffsetLow,  
  DWORD   dwNumberOfBytesToMap);    
   
    MapViewOfFile()函數負責把檔案資料對應到進程的地址空間,參數hFileMappingObject為CreateFileMapping()返回的檔案映像物件控點。參數dwDesiredAccess則再次指定了對檔案資料的訪問方式,並且相同要與CreateFileMapping()函數所設定的保護屬性相匹配。儘管這裡一再對保護屬性進行反覆設定看似多餘,但卻能夠使應用程式能很多其它的對資料的保護屬性實行有效控制。MapViewOfFile()函數同意所有或部分對應檔,在映射時,須要指定資料檔案的位移地址以及待映射的長度。當中,檔案的位移地址由DWORD型的參數dwFileOffsetHigh和dwFileOffsetLow組成的64位值來指定,並且必須是作業系統的分配粒度的整數倍,對於Windows作業系統,分配粒度固定為64KB。當然,也能夠通過例如以下代碼來動態擷取當前作業系統的分配粒度:  
   
  SYSTEM_INFO   sinf;  
  GetSystemInfo(&sinf);  
  DWORD   dwAllocationGranularity   =   sinf.dwAllocationGranularity;    
   
    參數dwNumberOfBytesToMap指定了資料檔案的映射長度,這裡須要特別指出的是,對於Windows   9x作業系統,假設MapViewOfFile()無法找到足夠大的地區來存放整個檔案對應物件,將返回空值(NULL);可是在Windows   2000下,MapViewOfFile()僅僅須要為必要的視圖找到足夠大的一個地區就可以,而無須考慮整個檔案對應物件的大小。  
   
    在完畢對映射到進程地址空間地區的檔案處理後,須要通過函數UnmapViewOfFile()完畢對檔案資料映像的釋放,該函數原型聲明例如以下:  
   
  BOOL   UnmapViewOfFile(LPCVOID   lpBaseAddress);    
   
    唯一的參數lpBaseAddress指定了返回地區的基地址,必須將其設定為MapViewOfFile()的返回值。在使用了函數MapViewOfFile()之後,必需要有相應的UnmapViewOfFile()調用,否則在進程終止之前,保留的地區將無法釋放。除此之外,前面還曾由CreateFile()和CreateFileMapping()函數建立過檔案核心對象和檔案對應核心對象,在進程終止之前有必要通過CloseHandle()將其釋放,否則將會出現資源泄漏的問題。  
   
    除了前面這些必須的API函數之外,在使用記憶體對應檔時還要依據情況來選用其它一些輔助函數。比如,在使用記憶體對應檔時,為了提快速度,系統將檔案的資料頁面進行快速緩衝,並且在處理檔案對應視圖時不馬上更新檔案的磁碟映像。為解決問題能夠考慮使用FlushViewOfFile()函數,該函數強制系統將改動過的資料部分或所有又一次寫入磁碟映像,從而能夠確保所有的資料更新能及時儲存到磁碟。  

共用記憶體對象方法(MapViewOfFile)
共用記憶體對象方法通常,將分頁檔支援的記憶體對應檔作為在使用者進程之間共用記憶體的技術。可是,能夠使用同樣的技術在使用者進程與裝置驅動程式之間共用記憶體。使用這樣的技術有兩種方法。

第一種方法中,通過使用 OpenFileMapping,然後調用 MapViewOfFile 函數以擷取指向某個地區或全部共用記憶體的指標,驅動程式能夠建立命名記憶體對象(稱為“地區對象”),而且一個或多個使用者應用程式能夠開啟同樣的對象。通過向地區對象指定保護屬性,能夠定義進程操縱記憶體的方式。

另外一種方法中,應用程式能夠用 CreateFileMapping 在使用者模式下建立命名記憶體對象。驅動程式通過使用 ZwOpenSection 並調用 ZwMapViewOfSection 擷取指向它的指標,能夠開啟同樣的記憶體對象。始終用例外處理常式在核心模式下訪問此記憶體位址。

由於該對象始終映射在進程的使用者地址空間(小於 0x80000000,不管對象是在核心模式還是在使用者模式中建立的)中,因此僅僅在進程上下文中訪問地址時,地址才有效。每次在同樣記憶體對象上調用 MapViewOfFile 或 ZwMapViewOfSection 時,都將返回不同的記憶體位址(即使是同樣的進程,也是如此)。建議不要使用這樣的方法(尤其是低級裝置驅動程式),正如前面所述,這是由於位址範圍限定於進行對象映射的進程,而且不能在 DPC 或 ISR 中對地址進行訪問。另外,在 DDK 中沒有記載在核心模式下建立記憶體對象的 API。

可是,要在提高的 IRQL(如 DPC 或 ISR 中)上使用該地址,必須查明並鎖定緩衝區頁面,並擷取系統虛擬位址 MmGetSystemAddressForMdl(正如本文前面 IOCTL 方法中所述)。

僅當要在兩個(或很多其它)使用者進程與一個(或多個)裝置驅動程式之間共用記憶體的情況下,這樣的方法才比較簡便。否則,使用 IOCTL 技術在使用者進程與裝置驅動程式之間共用記憶體更加簡單高效。
 

記憶體對應檔技術
1. 用途和基本操作
用於不同進程之間的記憶體共用操作, 能夠將一個物理檔案對應到記憶體其中然後直接利用分配到的或者開啟的命名共用記憶體的地址空間實現資源共用訪問

2. 相關流程
1) 建立命名共用記憶體
首先利用CreateFile或者CreateFileForMapping獲得一個用於映射的物理檔案控制代碼, 然後利用該檔案控制代碼結合CreateFileMapping得到一個命名的共用記憶體對應檔控制代碼。
//CreateFileMapping 為指定檔案建立一個有名或無名的檔案映象;
HANDLE CreateFileMapping(
  HANDLE hFile,              // 對應檔的控制代碼
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 安全描寫敘述符指標
  DWORD flProtect,           // 對映射對象的保護
  DWORD dwMaximumSizeHigh,   // 對象最大長度的高32位
  DWORD dwMaximumSizeLow,    // 對象最大長度的低32位
  LPCTSTR lpName             // 檔案記憶體映射對象的名字
);

注意:
hFile:對應檔的控制代碼,檔案的開啟模式必須與flProtect參數指定的相一致;假設這個參數值為0xFFFFFFFF,那麼必須在dwMaximumSizeHigh和dwMaximumSizeLow參數中指定映射對象的大小。而且將在作業系統虛擬記憶體頁面替換檔案裡建立檔案對應物件,而不是使用磁碟檔案,同一時候必須給出這個映射對象的大小。檔案對應物件通過副本,遺傳或名字來共用。
lpFileMappingAttributes:安全描寫敘述符指標,決定返回控制代碼能否被子進程繼承,假設是NULL,那麼子進程不能繼承。WinNt中,假設是NULL,那麼檔案對應物件得到一個預設的安全描寫敘述符。
flProtect:為得到的檔案試圖指定保護模式,能夠被設定為下列值:
 PAGE_READONLY :僅僅讀屬性,而且hFile相應的檔案必須以GENERIC_READ形式開啟。
 PAGE_READWRITE:可讀可寫屬性,而且hFile相應的檔案必須以GENERIC_READ 和 GENERIC_WRITE形式開啟。
 PAGE_WRITECOPY:對可寫地區複製後操作,而且hFile相應的檔案必須以GENERIC_READ 和 GENERIC_WRITE形式開啟。
dwMaximumSizeHigh,dwMaximumSizeLow:假設這兩個參數為0,則檔案對應物件的最大長度等於hFile指定的檔案長度。
lpName:檔案對應物件的名字,假設這個名字已存在,則依照flProtect指定的來處理映射對象。假設此參數為空白,則建立一個無名字的檔案對應物件。假設此參數的名字與系統事件的名字同樣,則函數運行失敗,GetLastError返回 ERROR_INVALID_HANDLE;

返回值:函數調用成功返迴文件映射對象的控制代碼,假設檔案對應物件已經存在則返回原有映射對象的控制代碼,GetLastError返回ERROR_ALREADY_EXISTS。函數運行失敗返回Null。

2) 開啟命名共用記憶體
假設須要共用已經存在的命名共用記憶體對應檔, 使用OpenFileMapping函數。
//OpenFileMapping 開啟一個已命名的檔案對應物件
HANDLE OpenFileMapping(
  DWORD dwDesiredAccess,  // 訪問模式
  BOOL bInheritHandle,    // 繼承標誌
  LPCTSTR lpName          // 檔案對應物件名指標
);
注意:
dwDesiredAccess:訪問模式與MapViewOfFile中的訪問模式同樣。
bInheritHandle:繼承標誌,能否夠被一個新的進程繼承使用,假設為TRUE,就能夠被一個新進程繼承控制代碼。
返回值:
 成功返回一個已命名的檔案對應物件,失敗返回NULL。

3) 獲得地址空間指標
進行記憶體對應檔的讀寫和一般的檔案讀寫不同, 是直接面對你申請的地址空間, 為此須要使用MapViewOfFile得到相關的地址LPVOID類型的指標。假設須要進行檔案寫入, 能夠通過類型轉換直接對於記憶體位址進行賦值, 比方:
memcpy( lpAddress, lpBuf, ....)
這裡自然須要防止記憶體溢出的情況。
假設是讀取操作,將參數順序調整一下就能夠了。

MapViewOfFile 在調用進程的地址空間映射一個檔案視圖
LPVOID MapViewOfFile(
  HANDLE hFileMappingObject,  // 已建立的檔案對應物件控制代碼
  DWORD dwDesiredAccess,      // 訪問模式
  DWORD dwFileOffsetHigh,     // 檔案位移的高32位
  DWORD dwFileOffsetLow,      // 檔案位移的低32位
  DWORD dwNumberOfBytesToMap  // 映射視圖的大小
);
注意:
hFileMappingObject: 由CreateFileMapping 或 OpenFileMapping 返回的檔案對應物件控制代碼。
dwDesiredAccess:映射視圖的訪問模式,與建立檔案對應物件的保護模式flProtect有關,能夠被設定為下列值:
 FILE_MAP_WRITE:一個可讀寫屬性的檔案視圖被建立,保護模式為PAGE_READWRITE
 FILE_MAP_READ :一個僅僅讀屬性的檔案視圖被建立,保護模式為PAGE_READWRITE 或 PAGE_READONLY
 FILE_MAP_ALL_ACCESS:與FILE_MAP_WRITE模式同樣
 FILE_MAP_COPY:保護模式為PAGE_WRITECOPY時,得到一個視圖檔案,當你對視圖檔案寫操作時,頁面自己主動交換,而且你所做的改動不會損壞未經處理資料資料。
dwNumberOfBytesToMap:對應檔部分的大小,假設為0,則映射整個檔案。
返回值:
假設成功返回返回映射視圖的起始地址,假設失敗返回NULL。

4)MapViewOfFileEx 在調用進程的地址空間映射一個檔案視圖,而且同意調用進程為映射視圖指定特殊的記憶體位址
LPVOID MapViewOfFileEx(
  HANDLE hFileMappingObject,  // 檔案對應物件的控制代碼
  DWORD dwDesiredAccess,      // 訪問模式
  DWORD dwFileOffsetHigh,     // 檔案位移的高32位
  DWORD dwFileOffsetLow,      // 檔案位移的低32位
  DWORD dwNumberOfBytesToMap, // 映射視圖的大小
  LPVOID lpBaseAddress        // 指定映射視圖的事實上記憶體位址
);
注意:
與MapViewOfFile使用方法同樣,可是假設指定的記憶體位址空間大小不夠,則函數運行失敗。


5) 將記憶體拷貝到所映射的物理檔案上面
FlushMapViewOfFile函數能夠將記憶體裡面的內容DUMP到物理磁碟上面
FlushViewOfFile 把檔案對應視圖中的改動的內容或所有寫回到磁碟檔案裡
BOOL FlushViewOfFile(
  LPCVOID lpBaseAddress,       // 改動內容的起始地址
  DWORD dwNumberOfBytesToFlush // 改動的位元組數目
);
函數運行成功返回非零。

6) 卸載記憶體對應檔地址指標
UnmapViewOffFile函數就是卸載
UnmapViewOfFile 刪除檔案的映射視圖
BOOL UnmapViewOfFile(
  LPCVOID lpBaseAddress   // 映射視圖起始地址
);
注意:
lpBaseAddress:映射視圖起始地址,由 MapViewOfFile 函數 MapViewOfFileEx產生。
返回值:
假設調用成功返回非零,而且全部指定地址內的髒頁面會被寫入硬碟。調用失敗返回零。

7) 關閉記憶體對應檔
太簡單了, CloseHandle搞定

CreateFileMapping使用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.