使用記憶體映象實現程序間全域性變數

2021-03-31 17:41:02 字數 2303 閱讀 2276

程式設計時在同一程式中使用全域性變數給我們帶來了很多方便,大多數程式幾乎都離不開全域性變數。那麼不同的程式之間呢?我們怎樣在不同的程式(程序)之間共享資料呢?事實上,你可能已經注意到在不同的程序間使用全域性變數在有些場合還是很有必要,這是一項相當有用的技術,基於某中特殊情況我們的確需要在我們開發的不同的程式間共享資料。比如有些軟體你會發現安裝後不止乙個可執行檔案,而且在執行時工作列也不止出現乙個程序,但在使用中你發現不同的程序竟向乙個單獨執行程式一樣,效果很好。接下來我們仔細研究一下該技術:

要在不同程序間共享全域性變數,應該首先想到我們可以通過不同的程序在記憶體中的同一塊儲存區域讀取資料,那裡就象乙個公共場合一樣,我們把這樣的區域叫做記憶體映象檔案。通過

windows api

我們可以很容易的在記憶體中建立這麼乙個區域並輕易的讀取它。這裡需要用到兩個關鍵的

api函式:

和mapviewoffile

,前者在記憶體中建立乙個記憶體映象區,它需要一些引數包括這塊區域的讀寫許可權,唯一區域名稱以及資料大小(這些引數將在下面**的注釋中給予說明,更多的引數說明請參看

win sdk

的幫助檔案或檢視

msdn

);後者返回乙個指向這塊區域的指標以便在程式中呼叫。下面我們將通過乙個簡單的例子來說明,這個例子由兩個工程組成,乙個通過乙個按紐負責向記憶體映象區寫入乙個長度為

11個字元的字串(『

how are you

『,通過乙個

edit

讀入,如果

edit

中的字元數大於了

11個程式將可能出錯),另乙個則通過乙個按紐讀出這個字串,寫入乙個

edit

中。下面是部分的**(為了節省篇幅,加上程式很簡單,有些不會影想你閱讀的**沒有貼出):

我們首先在第乙個工程(視窗取名為

setvalue

)的單元的介面部分宣告乙個指向即將建立的記憶體區域的控制代碼和乙個用來向這個區域寫資料的指標變數:

var……

指向記憶體區域的控制代碼

setstring:pchar;//

這裡應該使用標準的

windows

字串而非

delphi

特有的string

型別這樣我們可以在按紐的單擊事件中編寫相應的**:

procedure tform1.button1click(sender: tobject);

begin

//$ffffffff

表示使用虛擬檔案,注意兩個工程中應該使用同乙個唯一的名稱

mapstring

raise exception.create('error creating map file!');

strcopy(setstring,pchar(edit1.text));

//注意這裡應該使用拷貝函式而不是直接賦值

setstring:=pchar(edit1.text)

end;

當然,我們還可以在這個主工程中編寫乙個釋放記憶體映象的過程:

procedure tform1.button2click(sender: tobject);

begin

unmapviewoffile(setstring);

end;

接下來是第

2個工程的按紐單擊事件,它和第乙個工程幾乎沒有什麼不同,只是我們修改了記憶體映象的讀取許可權為唯讀而以:

var……

getstring:pchar;

hmapfilemaping:hwnd;

procedure tform1.button1click(sender: tobject);

begin

//再次注意一定要使用唯一的名稱(

mapstring

)和第乙個工程保持一致

if hmapfilemaping=0 then

raise exception.create('error');

getstring:=mapviewoffile(hmapfilemaping,file_map_read,0,0,11);

edit1.text:=string(getstring);

end;

現在我們便可以測試了,通過下圖你可以看到測試情況:

當然,上面的程式只是乙個例子,沒有任何使用意義,只是為了介紹這種技術,起到拋磚引玉的作用,再實際程式設計中你可以更嚴格的控制共享變數。你還可以使用這種技術實現一些奇特的效果。關於一些

api函式,它們大多都非常複雜,自己也還沒有完全掌握。建議大家在程式設計中多檢視

delphi

中的win sdk

幫助,裡面相當詳細,一定能幫助大家學到更多的東西。

使用DLL在多個程序間共享全域性變數

預設情況下,同乙個程式啟動多個程序,它們各自的變數值是不會相互影響的。第二個例項啟動後,在修改全域性變數的時候,系統會運用記憶體管理系統copy on write的特性來防止修改了第乙個例項的資料,即系統會再分配一些記憶體,並將全域性變數複製到這塊記憶體中,每個例項使用自己的記憶體空間上的資料而互不...

使用DLL在多個程序間共享全域性變數

預設情況下,同乙個程式啟動多個程序,它們各自的變數值是不會相互影響的。第二個例項啟動後,在修改全域性變數的時候,系統會運用記憶體管理系統copy on write的特性來防止修改了第乙個例項的資料,即系統會再分配一些記憶體,並將全域性變數複製到這塊記憶體中,每個例項使用自己的記憶體空間上的資料而互不...

執行緒間通訊 使用全域性變數

import threading from time import sleep s none 臨界資源 defbar print 呼叫foo global s s 天王 deffoo print foo等口令 sleep 2 print foo收到 s s deffun 執行緒bar1被這個fun覆...