国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Win9x下程序間的數據傳遞

2019-11-18 18:55:50
字體:
來源:轉載
供稿:網友
大家知道在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);
var
cds: 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;
除了用wm_CopyData消息傳遞數據外,Windows還提供了File_Mapping內存共享技術用于實現程序間數據共享。使用與上例窗口相似的兩個程序來說明
在MapWrite程序中:
Private
HMapFile: Thanale;
MapFilePointer: Pointer;
procedure TForm1.FormCreate(Sender: TObject);
begin
//使用API函數來建立映象文件
hMapFile:=CreateFileMapping(
$FFFFFFFF, //指定共享內存
nil,
Page_ReadWrite, //共享方式
0,
1000, //共享內存大小
′MyMappedFile′); //映象文件的名字
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;
在MapRead程序中使用API函數OpenFileMapping打開MapWrite程序中已建立的映象文件
procedure TForm1.FormCreate(Sender: TObject);
begin
hMapFile:=OpenFileMapping(FILE_MAP_READ,true,′MyMappedFile′); //取得′MyMappedFile′映象文件的句柄
if hMapFile<>0 then
MapFilePointer:=MapViewOfFile(hMapFile,File_Map_All_Access,0,0,0)
else
begin
ShowMessage(′Can not open Mapp File′);
Timer1.Enabled:=false;
end;
end;
//定時從共享內存中讀取數據并顯示出來
procedure TForm1.Timer1Timer(Sender: TObject);
var
ss: String;
begin
ss:=PChar(MapFilePointer);
Edit1.Text:=ss;
end;
當然最后我們要釋放共享內存句柄
UnMapViewOfFile(MapFilePointer);
CloseHandle(hMapFile);
(西安 hszj)

上一篇:提取應用程序中的圖標資源

下一篇:關于拉幕程序的討論和源碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 区。| 景宁| 临沂市| 台北县| 吉木萨尔县| 嘉义市| 巴林左旗| 榆中县| 梨树县| 安陆市| 景德镇市| 台江县| 吕梁市| 乐陵市| 弋阳县| 日喀则市| 高清| 武山县| 昌吉市| 田林县| 庄河市| 谷城县| 手机| 社旗县| 府谷县| 梁山县| 酒泉市| 高碑店市| 高青县| 来安县| 庆云县| 卓尼县| 台北市| 格尔木市| 丰都县| 额济纳旗| 夏河县| 香格里拉县| 都匀市| 西林县| 噶尔县|