亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 用delphi實現程序間的數據傳遞 (2001年5月15日).txt

?? 自己對DELPHI學習的一點體會
?? TXT
字號:
用Delphi實現程序間的數據傳遞 (2001年5月15日) 

本站更新  分類:系統   作者:wangjing  推薦:   閱讀次數:305  
(http://www.codesky.net)  

--------------------------------------------------------------------------------

在實際應用中,我們經常需要多個程序相互配合來完成某些特定功能。例如兩個應用程序間的同步、互斥;應用程序在起第二份實例時的參數自動傳遞…。要實現這些功能,就必須能實現程序間的數據傳遞。

有些特殊的高級技術可在不同的程序間傳遞數據,如剪貼板、動態數據交換以及OLE自動化,但有條件限制并且相對較復雜。這里,我介紹三種有效的底層技術,希望對編程愛好者有所幫助。

利用WM_COPYDATA消息 
 

使用該消息涉及一個TcopyDataStruct結構類型的指針。該結構中有三個成員:

dwData 是一個32位的附加參數

cbData 表示要傳遞的數據區的大小

lpData 表示要傳遞的數據區的指針

下面舉個例子。該例子由兩個程序構成,分別為SendData和GetData。

SendData程序向GetData程序發送消息,并傳遞edit1中的字符串;GetData在收到消息后,把SendData發送的字符串接受下來,并顯示在相應的edit1中。

SendData程序: 
……

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

ds: TCopyDataStruct;

hd: THandle;

begin

ds.cbData := Length (Edit1.Text) + 1;

GetMem (ds.lpData, ds.cbData ); //為傳遞的數據區分配內存

StrCopy (ds.lpData, PChar (Edit1.Text));

Hd := FindWindow (nil, 'Form2'); // 獲得接受窗口的句柄

if Hd <> 0 then

SendMessage (Hd, WM_COPYDATA, Handle,

Cardinal(@ds)) // 發送WM_COPYDATA消息

else

ShowMessage ('目標窗口沒找到!');

FreeMem (ds.lpData); //釋放資源

end;

GetData程序: 
 

TForm2 = class(TForm)

Edit1: TEdit;

private

{ Private declarations }

public

procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;

{ Public declarations }

end;

var

Form2: TForm2;

implementation

procedure TForm2.Mymessage(var t:TWmCopyData);

begin

Edit1.text:=StrPas(t.CopyDataStruct^.lpData);//接受數據并顯示。

end;

使用這種方法是WIN32應用程序進行交互的最簡單的方法。

使用全局原子 
Win32系統中,為了實現信息共享,系統維護了一張全局原子表。每個原子中存放了一些共享數據。關于對原子的操作,有一組專門的API函數:

GlobalAddAtom 在表中增加全局原子

GlobalDeleteAtom 在表中刪除全局原子

GlobalFindAtom 在表中搜索全局原子

GlobalGetAtomName 從表中獲取全局原子

筆者用這種方法實現了避免程序二次啟動,但把第二次啟動所帶的參數傳到第一個實例中以進行相應的處理的程序。基本處理如下:

在工程文件中:

program Pvdde;

uses

Forms,shellapi,Windows,dialogs,dde in 'dde.pas' {Form1};

{$R *.RES}

begin

if GlobalFindAtom(PChar('PDDE_IS_RUNNING')) = 0 then

//避免二次啟動

begin

K:=GlobalAddAtom(PChar('PDDE_IS_RUNNING'));

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end

else

begin

//傳遞二次啟動時的參數到第一個實例

H := FindWindow(PChar('TForm1'), PChar('資料保密 嚴禁外傳'));

if ParamCount > 0 then

begin

L := GlobalAddAtom(PChar(ParamStr(1)));

if H<>0 then

SendMessage(H, WM_MYMESSAGE, 0, L); 

{ 傳遞原子句柄 }

GlobalDeleteAtom(L); { 使用后釋放 }

end;

Application.Terminate;

end;

end.

在相應的窗口單元dde.pas增加對自定義消息WM_MYMESSAGE的處理:

procedure TForm1.MyMessage(var T:TMessage); 

{對 WM_MYMESSAGE消息進行處理 }

var

P:Array [0..255] of char;

begin

GlobalGetAtomName(T.LParam, P,255); { 接受數據到p數組中 }

。。。

end;

使用存儲映象文件 
 

這種方法相對較復雜一些。

當Win95與Winows Nt向內存中裝載文件時,使用了特殊的全局內存區。在該區域內,應用程序的虛擬內存地址和文件中的相應位置一一對應。由于所有進程共享了一個用于存儲映象文件的全局內存區域,因而當兩個進程裝載相同模塊(應用程序或DLL文件)時,它們實際可以在內存中共享其執行代碼。

筆者通過調用一個帶有特殊參數的CreateFileMapping函數,來間接達到程序間共享內存的目的。下面簡要解釋一下該函數。

HANDLE CreateFileMapping(

HANDLE hFile, //文件句柄 

LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可選安全屬性

DWORD flProtect, // 映象文件保護方式 

DWORD dwMaximumSizeHigh, // 映象文件區域的底值 

DWORD dwMaximumSizeLow, // 映象文件區域的頂值 

LPCTSTR lpName // 映象文件的名字

); 

如果hFile是0xFFFFFFFF,在調用程序中必須指定dwMaximumSizeHigh 和dwMaximumSizeLow參數的值以確定映象文件的大小。通過這樣的參數指定,該函數就創建了一個由操作系統頁文件支持的特殊邏輯映象文件,而不是由實際操作系統的文件支持的邏輯映象文件。這個邏輯映象文件可以通過復制、繼承或者按名字來達到共享。至于其它參數的詳細說明,請參看在線幫助。

在建立了映象文件之后,我們可以通過調用另外一個API函數MapViewOfFile來訪問它的內存,該函數會返回一個指向共享內存塊的特定指針。

LPVOID MapViewOfFile(

HANDLE hFileMappingObject, // 映象文件句柄 

DWORD dwDesiredAccess, // 訪問方式 

DWORD dwFileOffsetHigh, // 映象文件區域的底值 

DWORD dwFileOffsetLow, // 映象文件區域的頂值

DWORD dwNumberOfBytesToMap // 映射字節數

);

如果 dwNumberOfBytesToMap 是0,映射整個文件。

以下舉例說明:

private

hMapFile: THandle;

MapFilePointer: Pointer;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

hMapFile := CreateFileMapping (

$FFFFFFFF, // 特殊內存映射句柄

nil, page_ReadWrite, 0,10000, 

'DdhDemoMappedFile'); // 文件名

if hMapFile <> 0 then

MapFilePointer := MapViewOfFile (

hMapFile, // 上面映象文件的句柄

File_Map_All_Access, 

0, 0, 0) // 訪問整個映象文件

else

ShowMessage ('hMapFile = 0');

if MapFilePointer = nil then

ShowMessage ('MapFilePointer = nil');

end;

 

procedure TForm1.BtnWriteClick(Sender: TObject);

begin

StrCopy (PChar (MapFilePointer),

PChar (EditWrite.Text));//把內容寫入共享內存

end;

 

procedure TForm1.BtnReadClick(Sender: TObject);

var

S: string;

begin

S := PChar (MapFilePointer);//從共享內存讀出內容

EditRead.Text := S;

end;

用這種方法,不但可以在不同的程序之間共享數據,還可以在同一程序的不同實例間共享數據。為了及時通知其它進程共享數據的變化,可以自定義一條用戶消息,通過發消息來實現,這里不再贅述。
 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美一区二区不卡| 欧美日韩专区在线| 日本精品一区二区三区高清| 欧美久久高跟鞋激| 精品精品欲导航| 亚洲丝袜制服诱惑| 日本vs亚洲vs韩国一区三区| 成人午夜伦理影院| 91精品国产免费| 国产精品无人区| 日韩电影在线看| 成人一区二区三区| 欧美精品久久99久久在免费线 | 夜夜揉揉日日人人青青一国产精品| 日韩在线一区二区| 成人永久aaa| 欧美一区二区三区视频免费播放| 国产女同互慰高潮91漫画| 日日夜夜免费精品| 91在线观看一区二区| 日韩女优av电影| 亚洲精品视频一区| 国产传媒一区在线| 日韩小视频在线观看专区| 亚洲女与黑人做爰| 国产一区视频在线看| 欧美精品在线观看播放| 中文字幕欧美一| 韩国女主播成人在线| 欧美日韩一级二级三级| 中文字幕日本乱码精品影院| 韩国av一区二区三区在线观看 | 日欧美一区二区| 成人动漫视频在线| 欧美精品一区二区三区蜜桃| 亚洲一区二区精品视频| 波多野结衣中文一区| 久久在线观看免费| 日本不卡一二三区黄网| 欧美性猛片xxxx免费看久爱| 中国av一区二区三区| 国产在线播精品第三| 欧美一级日韩免费不卡| 亚洲图片欧美色图| 日本精品视频一区二区三区| 国产精品免费视频网站| 韩国精品免费视频| 欧美成人猛片aaaaaaa| 午夜一区二区三区视频| 色婷婷久久久综合中文字幕 | 色综合久久中文字幕综合网| 国产欧美精品一区二区色综合| 久久精品国产秦先生| 91精品久久久久久久91蜜桃| 一二三区精品视频| 色美美综合视频| 亚洲靠逼com| 色婷婷亚洲综合| 亚洲精品国产a| 在线欧美日韩精品| 亚洲综合丁香婷婷六月香| 色综合视频在线观看| 亚洲人成网站色在线观看| 99在线热播精品免费| 中文字幕一区二区在线播放| 成人综合婷婷国产精品久久蜜臀| 久久久久国产精品厨房| 国产成人自拍在线| 中文字幕电影一区| 99久久99久久综合| 亚洲色图制服丝袜| 色一情一乱一乱一91av| 亚洲你懂的在线视频| 欧美午夜精品免费| 天天综合色天天| 91麻豆精品国产91久久久更新时间| 五月婷婷另类国产| 91精品在线观看入口| 久久av中文字幕片| 国产午夜精品一区二区三区视频 | 亚洲欧洲三级电影| 色视频一区二区| 亚洲不卡一区二区三区| 91精品国产91久久久久久最新毛片 | 国产精品一区二区果冻传媒| 国产清纯白嫩初高生在线观看91| 成人免费观看av| 亚洲精品福利视频网站| 欧美色欧美亚洲另类二区| 青青草一区二区三区| 欧美sm美女调教| 国产jizzjizz一区二区| 日韩伦理av电影| 欧美日精品一区视频| 青椒成人免费视频| 久久久久久**毛片大全| 91免费观看国产| 视频一区欧美精品| 久久久精品天堂| 97se狠狠狠综合亚洲狠狠| 亚洲精品成a人| 日韩欧美一区二区免费| 成人免费va视频| 亚洲成人你懂的| 欧美精品一区二区三区很污很色的 | 制服.丝袜.亚洲.中文.综合| 韩国精品主播一区二区在线观看| 中文字幕一区二区三区四区| 欧美日韩一区中文字幕| 美女网站在线免费欧美精品| 亚洲国产精品ⅴa在线观看| 91国内精品野花午夜精品| 久久综合综合久久综合| 中文字幕一区免费在线观看| 欧美伦理视频网站| 国产69精品久久久久777| 亚洲一区二区三区视频在线 | 东方aⅴ免费观看久久av| 亚洲线精品一区二区三区| 欧美成人一区二区三区| 91网页版在线| 久久精品国产**网站演员| 国产精品国产三级国产aⅴ入口| 欧美人伦禁忌dvd放荡欲情| 国产成人精品免费网站| 视频一区二区中文字幕| 中文成人综合网| 欧美一级片免费看| 91免费视频网址| 91香蕉国产在线观看软件| 免费久久99精品国产| 亚洲精品免费播放| 久久亚洲精精品中文字幕早川悠里| 91成人在线精品| 国产成人午夜视频| 日韩vs国产vs欧美| 亚洲精品欧美综合四区| 久久久久国产精品人| 正在播放一区二区| 在线视频一区二区三| 国产精品日韩精品欧美在线| 91精品国产麻豆| 在线视频欧美精品| 97se狠狠狠综合亚洲狠狠| 国产伦精品一区二区三区视频青涩 | 成人精品小蝌蚪| 九九视频精品免费| 亚洲成a人片综合在线| 国产精品乱码一区二区三区软件 | 久久精品国产99国产| 亚洲综合视频在线| 亚洲色大成网站www久久九九| 精品免费一区二区三区| 欧美日韩国产综合久久 | 午夜伊人狠狠久久| 一区二区三区在线观看欧美| 中文字幕日韩av资源站| 国产亚洲欧美日韩俺去了| 日韩一区二区三区三四区视频在线观看| 99视频热这里只有精品免费| 国产激情91久久精品导航 | 中文字幕免费不卡在线| 久久九九全国免费| 亚洲精品在线一区二区| 欧美一区二区日韩| 欧美精品久久久久久久多人混战| 欧美性视频一区二区三区| 色乱码一区二区三区88| 91浏览器入口在线观看| 99天天综合性| 成人国产视频在线观看 | 亚洲乱码国产乱码精品精可以看| 日本一区二区免费在线| 国产日韩精品一区二区三区在线| 欧美精品一区二区久久婷婷| 精品入口麻豆88视频| 日韩美女视频在线| 日韩欧美的一区| www日韩大片| 国产欧美日韩麻豆91| 欧美高清在线精品一区| 国产女同互慰高潮91漫画| 中文子幕无线码一区tr| 国产精品美女久久久久aⅴ国产馆| 国产精品久久看| 亚洲天堂免费看| 亚洲美女一区二区三区| 亚洲综合一区二区精品导航| 亚洲图片欧美综合| 日韩精品每日更新| 狠狠狠色丁香婷婷综合久久五月| 国产精品小仙女| 成人黄色片在线观看| 色综合天天综合| 欧美女孩性生活视频| 欧美xxxx老人做受| 欧美激情资源网| 亚洲女同一区二区| 日韩综合小视频| 国产精品18久久久|