在16位Windows時(shí)代,DLL內(nèi)存的處理和32位Win32的處理時(shí)不同的,。在16位的DLL中,,可以在不同應(yīng)用程序之間共享全局內(nèi)存。換句話說(shuō),,如果在16為DLL中聲明了一個(gè)全局變量,,任何調(diào)用該DLL的引用程序都可以修改這個(gè)變量,這種修改回反映到其他應(yīng)用程序中,。
在Win32中不存在這種DLL的全局?jǐn)?shù)據(jù)共享,。由于每個(gè)應(yīng)用程序進(jìn)程把DLL映射到自己的地址空間中,DLL的數(shù)據(jù)也映射到了應(yīng)用程序進(jìn)程空間中,。所以每個(gè)應(yīng)用程序具有自己的DLL數(shù)據(jù)實(shí)例,。一個(gè)應(yīng)用程序?qū)LL中全局?jǐn)?shù)據(jù)的修改不會(huì)影響到其他應(yīng)用程序。
那如何實(shí)現(xiàn)在Win32下DLL數(shù)據(jù)共享呢,,這是可以用內(nèi)存映射文件來(lái)儲(chǔ)存共享數(shù)據(jù),。內(nèi)存映像文件可以映射一個(gè)文件,一個(gè)文件中的指定區(qū)域或者指定的內(nèi)存塊,,其中的數(shù)據(jù)就可以用內(nèi)存讀寫指令來(lái)直接訪問,,而不必頻繁的調(diào)用I/O系統(tǒng)函數(shù),從而提高了文件存取速度和效率,。
映像文件的另一個(gè)重要應(yīng)用就是用來(lái)支持永久命名的共享內(nèi)存,。要在兩個(gè)應(yīng)用程序之間共享內(nèi)存,可以在一個(gè)應(yīng)用程序中創(chuàng)建一個(gè)文件并映射之,,然后另一個(gè)程序可以通過打開和映射該文件,,并把它作為自己進(jìn)程的內(nèi)存來(lái)使用。
創(chuàng)建映像文件
CreateFileMapping( hFile: THandle; lpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD; lpName: PChar ): THandle;
- hFile:是調(diào)用FileOpen或FileCreate函數(shù)后返回的文件句柄,。如果不是共享文件而是共享內(nèi)存區(qū)域,,在這里需要設(shè)為$FFFFFFFF(DWord(-1)).
- lpFileMappingAttributes參數(shù)是文件映像的安全屬性結(jié)構(gòu)(一般設(shè)為nil)。
- flProtect 參數(shù)是文件的保護(hù)類型(PAGE_READ為可讀 PAGE_WRITE為可寫 PAGE_READWRITE為可讀寫)
- dwMaximumSizeHigh 參數(shù)用于指定文件映像的大小的高32位,。
- dwMaximumSizeLow 參數(shù)用于指定文件映像的大小的低32位,。
- lpName 參數(shù)用于指定映像名。
如果函數(shù)調(diào)用成功,,將返回文件映像的句柄,。
打開映像文件
OpenFileMapping( dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: PChar ): THandle;
- dwDesiredAccess 用于指定訪問數(shù)據(jù)的模式(FILE_MAP_READ為可讀 FILE_MAP_WRITE為可寫 FILE_MAP_ALL_ACCESS為可讀寫)
- bInheritHandle 參數(shù)指定OpenFileMapping 函數(shù)返回的句柄在以后新建的子進(jìn)程中是否得到繼承。
- lpName 參數(shù)用于指定映像名,。
如果函數(shù)調(diào)用成功,,將返回文件映像的句柄。
映射到本地進(jìn)程
MapViewOfFile( hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh,dwFileOffsetLow,dwNumberOfBytesToMap:DWORD ): Pointer;
- hFileMappingObject 參數(shù)通過CreateFileMapping 或 OpenFileMapping返回的文件映像句柄,。
- dwDesiredAccess 用于指定訪問數(shù)據(jù)的模式(FILE_MAP_READ為可讀 FILE_MAP_WRITE為可寫 FILE_MAP_ALL_ACCESS為可讀寫)
- dwFileOffsetHigh 參數(shù)用于指定數(shù)據(jù)在映像文件中的起始位置的高32為
- dwFileOffsetLow 參數(shù)用于指定數(shù)據(jù)在映像文件中的起始位置的低32位,。
- dwNumberOfBytesToMap 參數(shù)用于指定需要映射的字節(jié)數(shù),設(shè)為0表示文件或內(nèi)存區(qū)域的全部,。
如果函數(shù)調(diào)用成功將返回?cái)?shù)據(jù)映射的起始地址,,這是本進(jìn)程中可以直接訪問的內(nèi)存地址指針。
關(guān)閉內(nèi)存映射
UnmapViewOfFile( lpBaseAddress: Pointer ): BOOL;
- lpBaseAddress為MapViewoffFile返回的內(nèi)存指針,。