




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊
文件映射解釋:(摘抄)內(nèi)存映射文件用來保留一個地址空間,并提交物理存儲器。早期的內(nèi)存映射文件并不是提交物理內(nèi)存供調(diào)用者使用,而是提交永久存儲器(外存)上的文件數(shù)據(jù)。當(dāng)然操作系統(tǒng)會為永久存儲器保留一個讀緩沖區(qū),這樣讀取文件數(shù)據(jù)就快多了。內(nèi)存映射文件的特點使它很適合于加載EXE或DLL文件。這樣可以節(jié)省內(nèi)存又減少了加載所需時間。還可以使用它來映射大容量的文件,這樣就不必在讀取文件數(shù)據(jù)前設(shè)置很大的緩沖區(qū)。另外內(nèi)存映射文件常用于進(jìn)程間通信,也是進(jìn)程間通信的主要手段,其它進(jìn)程之間通信機制都是基于內(nèi)存映射文件來實現(xiàn)。為了更快的在進(jìn)程之間通信,現(xiàn)在的內(nèi)存映射文件也可以提交物理內(nèi)存,這樣內(nèi)存映射文件既可以提交物理內(nèi)存又可以提交文件應(yīng)用文件映射進(jìn)行進(jìn)程間通信原來來內(nèi)存映射文件只映射類似磁盤一類的存儲器上的文件。而為了更快速地在進(jìn)程之間通信,內(nèi)存映射文件還可以提交物理內(nèi)存。實現(xiàn)方法是通過訪問同一個內(nèi)存映射文件對象(映射到物理內(nèi)存),兩個進(jìn)程或多個進(jìn)程就能夠訪問到同一塊物理內(nèi)存設(shè)進(jìn)程。假設(shè)進(jìn)程A和進(jìn)程B需要通信,那么進(jìn)程A需要先創(chuàng)建一個內(nèi)存映射文件(之前不必調(diào)用CreateFileForMapping函數(shù)來創(chuàng)建文件,因為不需要創(chuàng)建文件)。這個內(nèi)存映射文件可以是在永久存儲器中,也可以是在內(nèi)存中。為了減小通信時間,最好提交物理內(nèi)存。1.進(jìn)程A在調(diào)用CreateFileMapping函數(shù)時,參數(shù)1指定為INVALID_HANDLE_VALUE,這表示這個內(nèi)存映射文件對象將要把物理內(nèi)存提交到地址空間中。最后一個參數(shù)一定要指定一個名字。2.進(jìn)程B也同樣調(diào)用CreateFileMapping函數(shù),而且參數(shù)相同。內(nèi)核會根據(jù)名字來判斷是否已經(jīng)存在一個內(nèi)存映射文件對象,如果創(chuàng)建了就返回原來的對象的句柄。3.獲得地址空間指針
MapViewOfFile()
如果需要進(jìn)行文件寫入,
可以通過類型轉(zhuǎn)換直接對于內(nèi)存地址進(jìn)行賦值,
比如:
memcpy(
lpAddress,
lpBuf,
)
如果是讀取操作,
將參數(shù)順序調(diào)整一下
4.卸載內(nèi)存映射文件地址指針
UnmapViewOffFile()
5.關(guān)閉內(nèi)存映射文件
CloseHandle()下面這個例子寫進(jìn)程加載一個位圖并將數(shù)據(jù)寫到內(nèi)存映射文件中,讀進(jìn)程從內(nèi)存映射文件讀取數(shù)據(jù)并生成新位圖。寫進(jìn)程:
#include"stdafx.h"#include<iostream>#include<Windows.h>#include"FileHandler.h"usingnamespacestd;typedefstruct{longsize;longbufferAdd;}SharedData;SharedData*lpData;HANDLEhMemoryMap;voidFreeMemory(){if(lpData){::UnmapViewOfFile(lpData);lpData=NULL;}if(hMemoryMap){CloseHandle(hMemoryMap);hMemoryMap=NULL;}}BYTE*CAlloc(WCHAR*name,longsize){FreeMemory();BYTE*addr;hMemoryMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,size,name);if(hMemoryMap!=NULL){addr=(BYTE*)MapViewOfFile(hMemoryMap,FILE_MAP_WRITE,0,0,0);if(addr==NULL){CloseHandle(hMemoryMap);hMemoryMap=NULL;returnNULL;}if(IsBadWritePtr(addr,size)!=FALSE){::UnmapViewOfFile(addr);addr=NULL;::CloseHandle(hMemoryMap);hMemoryMap=NULL;}}returnaddr;}int_tmain(intargc,_TCHAR*argv[]){hMemoryMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,64,L"DataMap");if(hMemoryMap!=NULL){lpData=(SharedData*)MapViewOfFile(hMemoryMap,FILE_MAP_WRITE,0,0,0);if(lpData==NULL){CloseHandle(hMemoryMap);hMemoryMap=NULL;}}FileHandler*h=newFileHandler;FileInfofile=h->ReadFile("file/Butterfly2.bmp");lpData=(SharedData*)CAlloc(L"DataMap",sizeof(long)*2+file.size);lpData->size=file.size;lpData->bufferAdd=(long)(lpData+sizeof(long)*2);void*dst=(void*)(lpData+sizeof(long)*2);memcpy(dst,file.buffer,file.size);deletefile.buffer;file.buffer=NULL;std::cout<<"\nwaiting";Sleep(-1);return0;}
讀進(jìn)程:
#include"stdafx.h"
#include<iostream>
#include<Windows.h>
#include"FileHandler.h"
usingnamespacestd;
typedefstruct
{
longsize;
longbufferAdd;
}SharedInData;
int_tmain(intargc,_TCHAR*argv[])
{
SharedInData*lpData;
HANDLEhMemoryMap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE|SEC_COMMIT,0,4096,L"DataMap");
if(hMemoryMap!=NULL)
{
lpData=(SharedInData*)MapViewOfFile(hMemoryMap,FILE_MAP_READ,0,0,0);
if(lpData==NULL)
{
CloseHandle(hMemoryMap);
hMemoryMap=NULL;
}
}
FileHandler*file=newFileHandler;
file->WriteFile("bitmap.bmp",(char*)lpData->bufferAdd,lpData->size);
Sleep(-1);
return0;
}
文件處理類#include"stdafx.h"
#include"FileHandler.h"
usingnamespacestd;
/*************************************************************************/
/*ofstream:寫操作(輸出)的文件類(由ostream引申而來)
/*ifstream:讀操作(輸入)的文件類(由istream引申而來)
/*fstream:可同時讀寫操作的文件類(由iostream引申而來)
ios::in為輸入(讀)而打開文件
ios::out為輸出(寫)而打開文件
ios::ate初始位置:文件尾
ios::app所有輸出附加在文件末尾
ios::trunc如果文件已存在則先刪除該文件
ios::binary二進(jìn)制方式
seekg(off_typeoffset,seekdirdirection);
seekp(off_typeoffset,seekdirdirection);
使用這個原型可以指定由參數(shù)direction決定的一個具體的指針開始計算的一個位移(offset)。它可以是:
ios::beg從流開始位置計算的位移
ios::cur從流指針當(dāng)前位置開始計算的位移
ios::end從流末尾處開始計算的位移
/*************************************************************************/
FileHandler::FileHandler()
{
}
FileHandler::~FileHandler()
{
}
FileInfoFileHandler::ReadFile(char*filename)
{
FileInfoinfo;
char*buffer;
longsize;
ifstreamfile(filename,ios::in|ios::binary|ios::ate);
size=file.tellg();
file.seekg(0,ios::beg);
buffer=newchar[size];
file.read(buffer,size);
file.close();
info.size=size;
info.buffer=buffer;
//buffer[size]='\0';
cout<<"thecompletefileisinabuffer:"<<size;
returninfo;
}
boolFileHandler::WriteFile(char*filename,char*buffer,intlength)
{
ofstreamfile(filename,ios::out|ios::binary|ios::trunc);
fil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會場布置合同范本
- 鄉(xiāng)鎮(zhèn)商品房出租合同范本
- pe管材及管件購銷合同范本
- 協(xié)議離婚陰陽合同范本
- 酒店投資合作合同范本
- 燒豬店鋪轉(zhuǎn)讓合同范本
- 櫥柜衣柜制作及其安裝合同范本
- 國際采購合同范本
- 合法用工合同范本
- 教育機構(gòu)培訓(xùn)合同范本
- 部編版三年級語文下冊期中試卷及參考答案
- JT-T-1199.1-2018綠色交通設(shè)施評估技術(shù)要求第1部分:綠色公路
- 酒店能耗分析報告
- 桃花紅杏花紅混聲合唱簡譜
- DL-T995-2016繼電保護(hù)和電網(wǎng)安全自動裝置檢驗規(guī)程
- 2024年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- 2024年江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- 2024年大理農(nóng)林職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- C語言課程思政案例
- 《柔性棚洞防護(hù)結(jié)構(gòu)技術(shù)規(guī)程》
- 現(xiàn)場施工環(huán)境保護(hù)應(yīng)急預(yù)案
評論
0/150
提交評論