【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊_第1頁
【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊_第2頁
【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊_第3頁
【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊_第4頁
【移動應(yīng)用開發(fā)技術(shù)】應(yīng)用文件映射進(jìn)行進(jìn)程間通訊_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論