記憶體對映檔案與SendMessage程序間通訊寫寫

2021-05-23 18:16:35 字數 2578 閱讀 7144

才寫完了作業,碰到了一些問題,也學會了很多,寫出來總結下,也讓碰到此問題的人有個答案。在寫之前剛剛看打了《2010中國大學創業富豪榜》,有的才26,突然覺得很失落。好了,不管那了,進正題。

此次的作業主要是利用記憶體對映檔案技術,實現如顯示,寫入,程序間共享等。先解釋記憶體對映檔案,如果說的不那麼專業的話,就是將磁碟上的檔案對映到物理記憶體中(可以是檔案的一部分,可控制對映的大小),一方面可以解決大檔案的處理,另一方面可以程序間共享資料(類似於命名管道,但對映的檔案是磁碟中現實的檔案)。優勢以及專業解釋再搜一搜了。

這裡主要介紹遇到的兩個問題。一是想在記憶體對映檔案實際的大小後追加內容,而不是固定的寫入很多無用位元組。另乙個問題不算問題,但是要提一下,就是程序間(或者兩個程式)使用sendmessage()時,收不到訊息的問題。

問題一:要使用記憶體對映檔案,主要有下面幾個步驟,請看參考學習的網頁上:

// 步驟1 開啟檔案file_flag_write_through

handle hfile = createfile()

if (hfile != invalid_handle_value)// 檔案開啟失敗返回控制代碼為-1

// 步驟3:將檔案資料對映到程序的位址空間

pvoid pvfile = mapviewoffile( )//pvfile就是得到的指標,用它來直接操作檔案,

if (pvfile != null)

// 步驟4: 像操作記憶體一樣操作檔案,演示功能把整個檔案倒序

char *p = (char*)pvfile;

printf("%s/n", p);

// 步驟5: 相關的釋放工作

unmapviewoffile(pvfile); // 釋放記憶體對映檔案的頭指標

closehandle(hfilemap);   // 記憶體對映檔案控制代碼

closehandle(hfile);    // 關閉檔案

一般的使用也就這麼幾個步驟,除了顯示,還可以進行寫入,主要利用pvfile這個指標,可以(char*)pvfile[i]= 這樣寫入,但要注意的是i不能超過原來檔案的位元組數或者說上面獲得的dwfilesize(檔案大小),否則寫回的時候是不會寫到檔案裡的。如果上面的引數中,你設定了檔案對映到記憶體中的大小,那麼即使你沒有寫夠,在檔案從記憶體中釋放後也會寫入你設定的大小數量的內容,你沒寫的就預設補/0了。

那麼我想在檔案開啟後,在原來檔案末尾追加我要的字元,而後又將實際的檔案大小寫回呢(即使設定了對映的檔案大小)?其實對於程式設計經常操作檔案的人來說很簡單,可是我不常用,只好學習了,主要利用了幾個函式如下:

在記憶體對映檔案操作完成後,先釋放資源

::unmapviewoffile(pvfile);

::closehandle(hfilemap);

再設定檔案大小為正確的大小

::setfilepointer(hfile, dwfilesize, null, file_begin); //主要函式:將檔案的指標指到你所寫的內容結尾

::setendoffile(hfile);//主要函式:設定檔案結束。具體的可查msdn,如果使用flushmapviewoffile(將記憶體中的內容寫回磁碟)也可以達到效果

::closehandle(hfile);

問題二:vc 程序間通訊,有很多方法,參考中提到了11種,我沒試驗過。我這裡用了一種最簡便的方法也就是直接使用sendmessage();和在窗體(我是在對話方塊)中過載了wm_copydata訊息,來接收sendmessage()傳送來的訊息。需要注意的是:

sendmessage(),有兩種,msdn上如下:

lresult sendmessage(

uint message,

wparam wparam = 0,

lparam lparam = 0

) throw();

static lresult sendmessage(

hwnd hwnd,     //你說要傳送的窗體的控制代碼,可以通過::findwindow(null,窗體名(不確定可以從任務管理器看));

uint message,  //要傳送的訊息,我這裡使用的是wm_copydata

wparam wparam, //附加訊息,可以為null

lparam lparam  //千萬注意了不要想的自己沒必要傳遞資料而設為null,必須把其中的copydatastruct填滿,不然就會莫名其妙的收不到訊息了,就是這個害得我好慘!注意,千萬注意!

) throw();

顯然,如果我們是程序間通訊,要用第二種,在程式中就是::sendmessage();就可以了。

好了,就寫這麼多了,有問題了請提醒我,不夠專業,見諒。

記憶體對映檔案

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的位址空間中去,在此之後程序操作文 件,就像操作程序空間裡的位址一樣了,比如使用 memcpy 等記憶體操作的函式。這種方法能 夠很好的應用在需要頻繁處理乙個檔案或者是乙個大檔案的場合,這種方式處理 io效率比 普通 io效率要高。另外,unix 把它做...

記憶體對映檔案

記憶體對映檔案有三種,第一種是可執行檔案的對映,第二種是資料檔案的對映,第三種是借助頁面交換檔案的記憶體對映.應用程式本身可以使用後兩種記憶體對映.1.可執行檔案對映 windows在執行乙個win32應用程式時使用的是記憶體對映檔案技術.系統先在程序位址空間的0x00400000以上保留乙個足夠大...

記憶體檔案對映

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...