**:
記憶體對映檔案是通過兩個或多個程序對映同乙個檔案對映物件的檢視來實現的,這意味著它們將共享物理儲存器的同乙個頁面。
因此,當乙個程序將資料寫入乙個共享檔案對映物件的檢視時,其他程序可以立即看到它們檢視中的資料變更情況。如果多個程序共享單個檔案對映物件,那麼所有程序必須使用相同的名字來表示該檔案對映物件。
(1)資料傳送
最後使用unmapviewoffile()函式解除當前應用程式的記憶體位址空間對檔案對映核心物件的對映,傳入引數為lpbuffer
實現**如下:
#include #include #include void main()
else
return;
} //對映到本程序的位址空間
if (null == plocalmem)
//寫入到記憶體中
strcpy(plocalmem, "i love china! -bai yonghui");
//取消本程序位址空間的對映
unmapviewoffile(plocalmem);
plocalmem = null;
}
(2)資料接收
最後呼叫unmapviewoffile()函式來解除檢視對映,傳入引數為plocalmem;
**實現如下:
#include #include #include void main()
//獲得共享記憶體控制代碼
if (null == plocalmem)
printf("檔案對映中的內容為%s\n", plocalmem);
//取消本程序位址空間的對映;
unmapviewoffile(plocalmem);
plocalmem=null;
//關閉檔案對映核心檔案
}
補充函式:
幾個主要的函式:
函式功能:
建立檔案對映核心物件;
函式原型:
handle hfile,
dword flprotect,
dword dwmaximumsizehigh,
dword dwmaximumsizelow,
lpctstr lpname
); 引數:
1> hfile
忽略,必須取值為null;
3> flprotect
檔案對映所需的訪問許可權,可以取值如下:
page_readonly:賦予唯讀許可權。如果進行寫入或執行操作,會導致非法訪問;
注意:hfile所指定的檔案必須在建立時具有generic_read許可權;
page_readwrite:賦予讀寫許可權,hfile所指定的檔案必須在建立時具有generic_read and generic_write許可權;
page_writecopy:不支援
4> dwmaximumsizehigh 指明檔案對映的最大長度的高32位
5> dwmaximumsizelow 指明檔案對映的最大長度的低32位。
如果該引數和dwmaximumsizehigh都是0,則檔案對映核心物件最大可以取hfile所指明檔案的現有大小;
6> lpname
指定檔案對映物件的名字。如存在這個名字的乙個對映,函式會用flprotect許可權試圖去開啟它。
返回值:
如果成功,則返回乙個檔案對映核心物件控制代碼;(如果該控制代碼已經存在,則返回已存在的控制代碼,並且getlasterror()返回 error_already_exists錯誤)
如果失敗,則返回null,可以呼叫getlasterror()獲取更詳細的錯誤資訊;
函式功能:
開啟乙個現有的檔案對映物件。
函式原型:
__in dword dwdesiredaccess,
__in bool binherithandle,
__in lpctstr lpname
);引數:
2> binherithandle 如果取值為true,則這個函式返回的控制代碼能由當前程序啟動的新程序繼承;否則返回的控制代碼不能被子程序繼承;
3> lpname 要開啟的檔案對映核心物件的名字。如果該名字對應的檔案對映核心物件已經被開啟,而且 dwdesiredaccess指定的安全許可權不衝突的話,可以成功開啟
返回值:
如果成功,則返回乙個開啟的檔案對映控制代碼;
失敗則返回null,可以呼叫getlasterror()獲取詳細的錯誤資訊;
3. mapviewoffile()
函式功能:
將乙個檔案對映核心物件 對映到呼叫程序的位址空間中,並返回對映到程序位址中的起始位址;
函式原型如下:
lpvoid mapviewoffile(引數:dword dwdesiredaccess,
dword dwfileoffsethigh,
dword dwfileoffsetlow,
dword dwnumberofbytestomap
);
2> dwdesiredaccess 指明訪問檔案對映核心物件的許可權,可以取如下值:
file_map_write 既可讀,亦可寫(檔案對映核心物件必須有page_readwrite保護許可權)
file_map_read 唯讀性的訪問(檔案對映核心物件必須有page_readwrite保護許可權)
file_map_all_access same as file_map_write
3> dwfileoffsethigh 指明檔案中對映起點的高32位位址
4> dwfileoffsetlow 指明檔案中對映起點的低32位位址
高32位和低32位的結合指明乙個基位址,從而可使檔案對映核心物件對映到以該位址為起點的程序空間中;
5> dwnumberofbytestomap 指定將檔案對映核心物件的多少位元組對映到程序位址中;如果取值為0,則整個檔案對映物件被對映進來。
返回值:
如果成功,則返回對映到程序空間的起始位址;
失敗則返回null,可以呼叫getlasterror()來獲取詳細的錯誤資訊;
4. unmapviewoffile()
函式功能:
在當前應用程式的記憶體位址空間解除對乙個檔案對映物件的對映。
函式原型:
bool unmapviewoffile(引數:lpcvoid lpbaseaddress
);
返回值:
如果成功,則返回非零值(即true);
如果失敗,則返回0(即false);
windows程序間通訊
摘 要 隨著人們對應用程式的要求越來越高,單程序應用在許多場合已不能滿足人們的要求。編寫多程序 多執行緒程式成為現代程式設計的乙個重要特點,在多程序程式設計中,程序間的通訊是不可避免的。microsoft win32 api 提供了多種程序間通訊的方法,全面地闡述了這些方法的特點,並加以比較和分析,...
Windows下程序間通訊
1 程序與程序通訊 2 程序通訊方法 2.1 檔案對映 win32 api中共享記憶體 shared memory 實際就是檔案對映的一種特殊情況。程序在建立檔案對映物件時用0xffffffff來代替檔案控制代碼 handle 就表示了對應的檔案對映物件是從作業系統頁面檔案訪問記憶體,其它程序開啟該...
Windows程序間通訊方式
align center windows程序間通訊方式 align 1 檔案對映 win32 api允許多個程序訪問同一檔案對映物件,各個程序在它自己的位址空間裡接收記憶體的指標。通過使用這些指標,不同程序就可以讀或修改檔案的內容,實現了對檔案中資料的共享。應用程式有三種方法來使多個程序共享乙個檔案...