Win9x下程式間的資料傳遞 (轉)
下間的資料傳遞
大家知道在Window 9x中一個應用程式不能直接訪問另一個程式的地址,因為WIN9x為每個執行中的程式提供了自己的虛擬空間,這起到了很好的保護作用,然而,它也使得兩個程式間不能輕易的資料,但是這並不是說程式間就一定不能進行資料傳送了,Win9x為我們提供了幾個特殊的方法來實現這個目的,如透過訊息WM_CopyData 和影響等方法。
使用訊息WM_CopyData傳送需要傳遞的資料緩衝區的記憶體地址,前面講過,我們不能從一個應用程式向另一個程式傳送記憶體塊的地址,因為一個虛擬儲存空間中的地址在另一個地址空間中沒有意義。但是WM_CopyData訊息回在後臺一些特殊操作之後在傳遞資料,因此我們能夠在接受方得到正確的地址。該訊息使用時需要傳遞正在傳送訊息的視窗的控制程式碼,及一個指TCopyDataStruct結構的指標。該結構如下:
tagCOPYDATASTRUCT = packed record
dwData: D;
//這是一個附加的32位引數;
cbData: DWORD;
//我們將要傳遞的資料緩衝區的大小;
lpData: Pointer;
//指向資料緩衝區的指標。
end;
TCopyDataStruct=tag COPYDATASTRUCT;
一個例子,SendData程式包含一個文字框,在它的OnChange事件中將文字框中的內容傳送到GetData程式重並顯示出來。
在SendCopyData程式裡,文字框OnChange事件的處理如下:
procedure TForm1.InputEditChange(Sender: T);
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′); //用函式獲取″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_Map記憶體共享技術用於實現程式間資料共享。使用與上例視窗相似的兩個程式來說明
在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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1002568/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS應用之間的跳轉與資料傳遞iOS
- 微信小程式父子元件之間的資料傳遞微信小程式元件
- Vue元件間傳遞資料Vue元件
- vue元件之間的資料傳遞Vue元件
- 不同資料庫間傳遞資料的問題資料庫
- 頁面之間傳遞資料
- react元件與元件之間的資料傳遞React元件
- WinForm登陸:窗體間的資料傳遞ORM
- bundle實現Activity之間的資料傳遞
- 不同順序InBoundHandler之間的資料傳遞
- Ability之間或者程式間資料傳遞之物件(Sequenceable序列化)物件
- Vue.js 元件之間傳遞資料Vue.js元件
- IOS開發筆記之應用間的跳轉和資料傳遞iOS筆記
- Activity跳轉時傳遞資料的騷操作
- chan中傳遞map資料,傳遞的是引用
- postman(五):在不同介面之間傳遞資料Postman
- ASP.NET 頁面間資料傳遞方法ASP.NET
- 微信小程式資料傳遞總結微信小程式
- Python 多程式和資料傳遞的理解Python
- VUE 傳遞資料Vue
- Flutter 中的資料傳遞Flutter
- 父子元件的資料傳遞元件
- Flutter 頁面間資料傳遞(共享)的幾種常用方式Flutter
- Vue學習小札——2.4 父子元件間的資料傳遞Vue元件
- 向上向下傳遞資料
- Vue元件之間的資料傳遞(通訊、互動)詳解Vue元件
- Promise中多個回撥函式之間的資料傳遞Promise函式
- WCF使用資料集(DataSet)、資料表(DataTable)、集合(Collection)傳遞資料 (轉)
- 鴻蒙程式設計江湖:ArkTS中Sendable資料在併發例項間的傳遞鴻蒙程式設計
- Win9x下虛擬光碟機的檢測 (轉)
- AbilitySlice之間的傳遞值
- Flutter學習之Route跳轉及資料傳遞Flutter
- iOS 應用之間跳轉傳輸資料以及跳回源程式iOS
- 如果在C#用WM_COPYDATA訊息來實現兩個程式之間傳遞資料 (轉)C#
- android 中Service 和activity之間的資料傳遞的幾種方法Android
- Acitivity在singleTask載入模式下的資料傳遞處理模式
- 返回Acitivity時傳遞資料
- 在winnt/win9x下用blat發email的示例(轉)AI