大家知道在window 9x中乙個應用程式不能直接訪問另乙個程式的記憶體位址,因為win9x為每個執行中的程序提供了自己的虛擬空間,這起到了很好的保護作用,然而,它也使得兩個程式間不能輕易的交換資料,但是這並不是說程式間就一定不能進行資料傳送了,win9x為我們提供了幾個特殊的方法來實現這個目的,如通過windows訊息wm_copydata 和儲存影響檔案等方法。
使用訊息wm_copydata傳送需要傳遞的資料緩衝區的記憶體位址,前面講過,我們不能從乙個應用程式向另乙個程式傳送記憶體塊的位址,因為乙個虛擬儲存空間中的位址在另乙個位址空間中沒有意義。但是wm_copydata訊息回在後台執行一些特殊操作之後在傳遞資料,因此我們能夠在接受方得到正確的位址。該訊息使用時需要傳遞正在傳送訊息的視窗的控制代碼,及乙個指tcopydatastruct結構的指標。該結構如下:
tagcopydatastruct = packed record
dwdata: dword;
//這是乙個附加的32位引數;
cbdata: dword;
//我們將要傳遞的資料緩衝區的大小;
lpdata: pointer;
//指向資料緩衝區的指標。
end;
tcopydatastruct=tag copydatastruct;
乙個例子,senddata程式包含乙個文字框,在它的onchange事件中將文字框中的內容傳送到getdata程式重併顯示出來。
在sendcopydata程式裡,文字框onchange事件的處理函式如下:
procedure tform1.inputeditchange(sender: tobject);
varcds: tcopydatastruct;
ss: pchar;
targethandle: thandle;
begin
cds.cbdata:=length(inputedit.text)+1;
getmem(ss,cds.cbdata); //申請cbdata大小的緩衝區,並把指標賦給ss;
strcopy(ss,pchar(inputedit.text));
cds.lpdata:=ss; //設定緩衝區指標
targethandle:=findwindow(′tform1′,′getcopydata′); //用api函式獲取″getcopydata″視窗控制代碼
if targethandle=0 then
begin
showmessage(′don′'t find target window′);
exit;
end;
sendmessage(targethandle,wm_copydata,handle,integer((@cds)));//將cds結構指標傳送個目標視窗;
//targethandle使目標視窗控制代碼;
//handle 傳送訊息的視窗控制代碼;
freemem(ss);
end;
在getcopydata程式中,通過乙個定製的訊息處理程式接受wm_copydata訊息:
public
procedure getcopydata(var msg: twmcopydata); message wm_copydata;
procedure tform1.getcopydata(var msg: twmcopydata);
begin
with msg.copydatastruct^ do
begin
form1.edit1.text:=pchar(lpdata);
end;
end;
其中twmcopydata結構定義如下:
twmcopydata = record
msg: cardinal;
from: hwnd; //傳送該訊息的視窗的控制代碼
copydatastruct: pcopydatastruct; //即sendcopydata程式中cds結構的指標
result: longint;
end;
在mapwrite程式中:
private
hmapfile: thanale;
mapfilepointer: pointer;
procedure tform1.formcreate(sender: tobject);
begin
//使用api函式來建立映象檔案
$ffffffff, //指定共享記憶體
nil,
page_readwrite, //共享方式
0,1000, //共享記憶體大小
if hmapfile<>0 then //如果映象檔案建立成功
//mapviewoffile函式返回乙個指向共享記憶體塊的在該程式記憶體空間中有效的指標
mapfilepointer:=mapview offile(hmapfile,file-map-all-access,0,0,0)
else
showmessage(′can′'t create mapfile′);
if mapfilepointer=nil then
showmessage(′mapfilepointer=nil′);
end;
procedure tform1.edit1change(sender: tobject);
begin
strcopy(pchar(mapfilepointer),pchar(edit1.text));//將文字框中的字串copy到共享記憶體中
end;
procedure tform1.formcreate(sender: tobject);
begin
if hmapfile<>0 then
mapfilepointer:=mapviewoffile(hmapfile,file_map_all_access,0,0,0)
else
begin
timer1.enabled:=false;
end;
end;
//定時從共享記憶體中讀取資料並顯示出來
procedure tform1.timer1timer(sender: tobject);
varss: string;
begin
ss:=pchar(mapfilepointer);
edit1.text:=ss;
end;
當然最後我們要釋放共享記憶體控制代碼
unmapviewoffile(mapfilepointer);
closehandle(hmapfile);
(西安 hszj)
MDI窗體間的資料傳遞
mdi窗體間的資料傳遞與普通窗體間的傳遞略有不同。普通的窗體可以用以下的方式實現,t2 t3分別是f2,f3下的text控制項 b2是f2下的按鈕 f2下 public class f2 public b as string 定義乙個全域性變數 private sub b2 click byval ...
父子元件間的資料傳遞
vue當中有個單向資料流的概念,也就是 父元件可以向子元件傳遞 修改引數 通過屬性的方式傳 但子元件不可以反過來修改父元件傳遞過來的引數!因為怕子元件改了父元件引用型別的資料,可能會影響到其他元件 那怎樣解決這個問題?可以複製給子元件自己的變數,然後子元件修改自己的變數啊!這是父元件向子元件傳遞資料...
微信小程式頁間遠端資料傳遞
列表頁和詳情頁之間傳參 列表頁布局如下 pages demo demo.wxml 列表頁js如下 pages demo demo.js page getlistdata function todetail function e 生命週期函式 監聽頁面載入 onload function option...