為了便于開發(fā)數(shù)據(jù)庫應(yīng)用程序,在Delphi集成開發(fā)環(huán)境中,提供了大量的數(shù)據(jù)庫工具軟件用于幫助應(yīng)用程序開發(fā)人員設(shè)計(jì)、編程、測(cè)試和發(fā)行數(shù)據(jù)庫應(yīng)用程序。所有這些工具構(gòu)成了Delphi數(shù)據(jù)庫應(yīng)用程序開發(fā)環(huán)境。其各個(gè)工具軟件及其相互間的關(guān)系。
整個(gè)Delphi數(shù)據(jù)庫應(yīng)用程序開發(fā)環(huán)境由數(shù)據(jù)庫引擎(BDE)、數(shù)據(jù)庫引擎管理程序(BDE Ad—ministrator)、數(shù)據(jù)庫桌面(DataBase Desktop)、SQL瀏覽器(SQL Explorere)、SQL驅(qū)動(dòng)程序(SQL Links)和ODBC驅(qū)動(dòng)程序等組成。
數(shù)據(jù)庫引擎是Delphi數(shù)據(jù)庫開發(fā)環(huán)境的核心,它由兩種類型的動(dòng)態(tài)鏈接庫組成:一種用于提供核心服務(wù),另一種用于連接本地或網(wǎng)絡(luò)數(shù)據(jù)庫。所有這些文件被安裝在操作系統(tǒng)的System和用戶所指定驅(qū)動(dòng)器\Programe Files\Common Files\Borland\Bde\目錄下。數(shù)據(jù)庫引擎的主要 功能是將數(shù)據(jù)庫應(yīng)用程序和物理的數(shù)據(jù)庫分隔開來,在數(shù)據(jù)庫引擎中通過數(shù)據(jù)庫別名(Database Aliases)來標(biāo)識(shí)本地或遠(yuǎn)程的數(shù)據(jù)庫,數(shù)據(jù)庫應(yīng)用程序僅需要此數(shù)據(jù)庫別名就可以透明地對(duì)數(shù)據(jù)庫進(jìn)行訪問。
數(shù)據(jù)庫引擎管理程序(B DE Administrator)主要用于對(duì)本地的Paradox、dBASE數(shù)據(jù)表和遠(yuǎn)程的SQL數(shù)據(jù)庫進(jìn)行創(chuàng)建表、創(chuàng)建索引、查詢、存取和編輯等操作。
通過SQL瀏覽器可以對(duì)本地或遠(yuǎn)程的數(shù)據(jù)庫進(jìn)行各種SQL查詢操作。
SQL驅(qū)動(dòng)程序(SQL Links)是Inprise公司在Delphi客戶/服務(wù)器版本中提供的遠(yuǎn)程數(shù)據(jù)庫的訪問驅(qū)動(dòng)程序,ODBC是微軟公司在Windows 95/98或NT操作系統(tǒng)提供數(shù)據(jù)庫訪問驅(qū)動(dòng)程序。
Delphi中進(jìn)程間的數(shù)據(jù)共享三信網(wǎng)絡(luò)
//以上代碼在DELPHI6中編譯通過。
DLL是創(chuàng)建Windows應(yīng)用程序,實(shí)現(xiàn)代碼重用的重要手段。那么當(dāng)我們需要在進(jìn)程間共享數(shù)據(jù)時(shí),怎樣做才能快捷方便地實(shí)現(xiàn)呢?在32位應(yīng)用系統(tǒng)中,每個(gè)應(yīng)用程序會(huì)將DLL映射到自己的地址空間,同時(shí)DLL中的數(shù)據(jù)也就隨之被映射了。這樣,每個(gè)應(yīng)用程序都有自己的數(shù)據(jù)實(shí)例,在一個(gè)應(yīng)用程序中修改DLL中的全局變量,不會(huì)影響其它的應(yīng)用程序。DLL的使用似乎與我們的目的相背離,那么如何才能實(shí)現(xiàn)我們想要的東東呢?這里給大家介紹一種特殊的技術(shù),那就是內(nèi)存映射文件。
內(nèi)存映射文件提供了一種方法,就是在WIN32系統(tǒng)的地址空間保留一塊內(nèi)存區(qū)域,物理存儲(chǔ)可以向其中提交。并且內(nèi)存映射文件不只是磁盤文件,也可以是WIN32的頁面文件,而且后者比前者要好,因?yàn)檫@意味著可以像訪問一個(gè)磁盤文件那樣訪問內(nèi)存中的一個(gè)區(qū)域,而不用創(chuàng)建臨時(shí)文件,用完后還得刪除它。WIN32有自己的管理頁面調(diào)度文件,當(dāng)不需要頁面調(diào)度文件時(shí),系統(tǒng)會(huì)自動(dòng)將有關(guān)區(qū)域釋放。以下是具體的實(shí)現(xiàn)代碼:
library Project1;
uses
shareMem,
windows,
SysUtils,
Classes;
const
MFileName: Pchar = ’ShareData’;
//定義一個(gè)記錄類型,你所需要共享的數(shù)據(jù)就保存在這里。
//當(dāng)在進(jìn)程中調(diào)用GetDllData時(shí),進(jìn)程中也應(yīng)該定義一個(gè)與這個(gè)一樣的記錄類型。
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = record
s: string[50];
i: integer;
end;
var
GlobalData: PGlobalDllData; //這是一個(gè)全局變量,指向創(chuàng)建的內(nèi)存映射文件。
MapHandle: THandle;
//給外部進(jìn)程調(diào)用的過程,當(dāng)外部進(jìn)程調(diào)用這個(gè)過程后,形參AGlobalData就指向了我//們創(chuàng)建的內(nèi)存映射文件. 我們可以創(chuàng)建兩個(gè)進(jìn)程, 同時(shí)調(diào)用這個(gè)過程, 那么在其中一個(gè)進(jìn) //程中修改數(shù)據(jù)后, 在另外一個(gè)進(jìn)程中既可反應(yīng)出來, 實(shí)現(xiàn)了我們需要的共享.
procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
AGlobalData := GlobalData;
end;
procedure OpenThisData;
var
size: integer;
begin
size := sizeof(TGlobalDllData);
//創(chuàng)建一個(gè)內(nèi)存文件映射對(duì)象//www.sunsin.net/,MfileName保存的值就是該對(duì)象的名字。
mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName);
if mapHandle = 0 then
RaiseLastWin32Error;
//把文件的視圖映射到調(diào)用進(jìn)程的地址空間,該函數(shù)的返回值就是該對(duì)象的首地址。注//意,這是調(diào)用進(jìn)程的地址,兩個(gè)應(yīng)用程序調(diào)用該DLL,返回值是不一樣的。
GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size);
Globaldata^.s := ’TEST’;
GlobalData^.i := 5;
if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end;
//DLL從進(jìn)程中分離出來時(shí),應(yīng)該釋放相應(yīng)的空間
procedure CloseThisData;
begin
unmapViewOfFile(GlobalData);
closeHandle(MapHandle);
end;
procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
Dll_Process_Attach: OpenThisData; //調(diào)用DLL時(shí)傳入的參數(shù),由系統(tǒng)自動(dòng)傳入
![]() | ![]() .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 |
![]() | ![]() .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書籍 |