文章編號: 125713 - 上次校閱: 2006年11月21日 - 版次: 3.1 常見的檔案對應問題] 和 [平台差異
在此頁中結論本文將說明使用檔案對應時所發生的一些常見問題。它也會指出檔案的對應實作某些平台的差異。 本文不會說明程序,以執行檔案對應。 如需使用檔案對應資訊,請參閱檔案對應概觀 Microsoft Win32 程式設計人員參考 》 中。也請參閱 CreateFileMapping()、 OpenFileMapping()、 MapViewOfFile()、 MapViewOfFileEx()、 UnmapViewOfFile(),和 FlushViewOfFile() 描述。 其他相關資訊名稱空間衝突事件、 號誌、 Mutex 和檔案對應物件的名稱共用相同的命名空間,因此不可能有相同名稱的兩個不同的物件型別。它是以嘗試建立或開啟一個使用已經正由另一個型別的物件的名稱的型別物件錯誤。如果它們指定正由另一個型別的物件使用中的物件名稱,將會失敗 CreateFileMapping() 和 OpenFileMapping()。在這兩種情況下 GetLastError() 會傳回 ERROR_INVALID_HANDLE (6)。 若要避免物件型別之間的衝突,一個解決方案是在名稱中包含的物件類型。比方說用於 EV_myapp_block_ready 」 的事件物件名稱和 FM_myapp_missile_data"檔案對應物件名稱。 necessity 的 unmapping 對應檔案的所有檢視是否 MapViewOfFile() 或 MapViewOfFileEx() 所建立的 Windows 就會維護該物件中的每一個檢視的檔案對應物件的內部控制代碼。這個內部的控制代碼是另外保持 CreateFileMapping() 所傳回的控制代碼。內部控制代碼不被封閉的直到由呼叫 UnmapViewOfFile() unmapped 與控制代碼相關聯的檢視。若要完全關閉檔案對應物件會需要先關閉所有的控點,用於該物件包括內部控點。因此,以關閉 [檔案對應物件的該物件的所有檢視必須都是未對應,而且必須關閉控點由 CreateFileMapping() 傳回。現存的檔案對應物件的未對應的檢視不會導致一個 CloseHandle() 上物件的控制碼失敗。亦即成功關閉物件的控制代碼時, 它不一定真所有檢視都已未對應,所以檔案對應物件已不一定是都被釋放。 正確 unmap 物件的所有檢視,及關閉物件控制代碼失敗會造成遺漏 (Memory Leak) 應用程式的分頁集區、 未分頁集區、 虛擬位元組,而且也在系統中廣泛認可的位元組。 檔案對應物件的大小限制由系統分頁檔支援的檔案對應物件的大小受限於可用的系統虛擬記憶體 (這表示可能是 VirtualAlloc()) 的呼叫與認可的記憶體數量。在 Windows NT 上具名的磁碟檔案備份的檔案對應物件的大小會受到可用的磁碟空間限制。物件的對應檢視的大小是限制為執行對應 (至多減去已經處理序所保留的虛擬記憶體 2 GB) 處理序中未保留的虛擬記憶體的最大的連續區塊。 上 Win32s,具名的磁碟檔案備份的檔案對應物件的大小受限於可用的系統虛擬記憶體限於 Win32s 的虛擬記憶體管理實作。Win32s 會定期的虛擬記憶體配置記憶體的對應的區段即使它並不需要交換空間而由 Windows 所設定的 VM 的量太小而無法用於對應大型檔案。如同 Windows NT 可用磁碟空間也強加限制。 在 Windows 95 上具名的磁碟檔案備份的檔案對應物件的大小受限於可用的磁碟空間。物件的對應檢視的大小是限制為共用虛擬競技場中未保留的虛擬記憶體的最大的連續區塊。這個區塊會最多 1 GB 減去使用中的其他元件的 Windows 95 用 (例如 16 位元 Windows 架構應用程式) 共用虛擬競技場任何記憶體。每個對應的檢視將會從這個競技場使用記憶體,所以這項限制適用於所有非重疊的對應檢視所有系統上執行的應用程式的總大小。 對應的檔案可能不會自動成長如果指定的檔案對應物件大小備份由具名磁碟 CreateFileMapping() 的呼叫中的檔案是大於用來備份對應檔案的大小,檔案通常將會被指定的大小由 CreateFileMapping() 呼叫增長。上僅使用 Windows NT,如果 PAGE_WRITECOPY 指定 fdwProtect] 參數檔案將不會自動被成長。這會導致失敗,CreateFileMapping() 並且 GetLastError() 會傳回 ERROR_NOT_ENOUGH_MEMORY (8)。若要呼叫 CreateFileMapping() 之前先設定檔案的大小,使用 [SetFilePointer() 和 SetEndOfFile()]。 MapViewOfFileEx() 和 lpvBase 的有效範圍在 Windows NT 上在 0-2 的位址範圍中對應的檔案對應物件檢視 GB。傳遞此範圍之外的位址作為 lpvBase MapViewOfFileEx() 的參數會使它失敗,並且 GetLastError() 會傳回 ERROR_INVALID_PARAMETER (87)。在 Windows 95 上檢視檔案對應物件會對應 2-3 GB (共用虛擬競技場) 位址範圍中。傳遞此範圍之外的位址會導致失敗,MapViewOfFileEx() 並且 GetLastError() 會傳回 ERROR_INVALID_ADDRESS (487)。注意 Windows 95 的未來更新可能會將對應範圍變更為 0 2 GB,為 Windows NT 上。 lpvBase MapViewOfFileEx() 與配置狀態如果地址指定給 lpvBase 參數的 MapViewOfFileEx(),而且不該位址不夠大,無法滿足 cbMap 參數中指定的位元組數目的未保留的虛擬位址空間區塊,然後 MapViewOfFileEx() 將會失敗,並且 GetLastError() 會傳回 ERROR_NOT_ENOUGH_MEMORY (8)。這並不表示系統記憶體不足,或處理程序無法配置更多的記憶體。它只是表示所要求的虛擬位址範圍已經已保留在該處理序中。之前要呼叫 MapViewOfFileEx() VirtualQuery() 可用來判斷適當的範圍,未保留的虛擬位址空間。 MapViewOfFileEx() 和 lpvBase 細微性針對 MapViewOfFileEx() 的呼叫中指定參數 lpvBase,您應該使用系統的配置資料粒度的整數倍。在 Windows NT 上未指定這類的值將導致 MapViewOfFileEx() 失敗,並返回 ERROR_MAPPED_ALIGNMENT GetLastError() (1132)。在 Windows 95 上地址會捨去小數,而系統的配置資料粒度最接近的整數倍數。若要判斷系統的配置資料粒度,呼叫 GetSystemInfo()。 對應的檢視表的地址對應檔案 (或共用的記憶體) 的檢視,時可能可以讓作業系統決定在檢視的位址,或做為 lpvBase 參數 MapViewOfFileEx() 函式的指定位址。如果檔案對應要在多個處理程序之間共用,建議的方法就是使用 MapViewOfFile(),讓選取對應位址為您的作業系統。這樣的好理由有:
當檢視表會對應至不同的地址在 Windows NT 下時,發生困難度儲存對應本身內對應的指標。這是因為在一個處理序中的指標未指向相同的位置內對應的另一個處理程序。若要克服此問題、 將位移,而不是指標儲存在對應並藉由將對應的基底位址加入位移計算每個處理程序中的實際位址。它也有可能使用的基底指標,並因此 [執行基底] + [隱含位移轉換]。簡短的 SDK 範例呼叫 BPOINTER 示範這項技術。 其他平台差異執行時的額外限制檔案在 Windows 95 下的對應:
這篇文章中的資訊適用於:
機器翻譯重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。 按一下這裡查看此文章的英文版本:125713?
(http://support.microsoft.com/kb/125713/en-us/
)
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。 | 其他資源 其他支援網站社群文章翻譯 |






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email


回此頁最上方