天天看點

Delphi中如何調用VC++建立的動态連結庫

Delphi中如何調用VC++建立的動态連結庫

Delphi以其獨特的面向控件的開發方式、強大的資料庫功能、快速的編譯技術以及簡單易學的程式設計特性,使得它自釋出之日起即格外引人注目,許多程式員也是以将它作為首選的開發工具。然而,Delphi在科學計算、低端程式設計等方面的功能不如VC++。VC++功能強大、齊全,但是整個系統比較複雜、龐大,尤其對于初學者來說比較難學,其使用者界面的開發遠不如Delphi那樣友善、快捷。那麼,我們能否将兩者的優點結合起來呢?答案是肯定的!具體做法是:将涉及到比較低級的操作、計算等方面的程式用VC++寫成函數放在動态連結庫中,而涉及到界面及與使用者互動的程式設計則用Delphi來實作,最後隻需在Delphi中調用VC++編寫的動态連結庫即可。
一、動态連結庫簡介
動态連結庫(DLL,即 “Dynamic-Link Library”)是一個能夠被應用程式和其它的DLL調用的過程和函數的集合體,它裡面包含的是公共代碼或資源。DLL是Windows的基石,所有的Win32 API函數都包含在DLL中。
使用DLL有許多優點:
1、一個DLL可以提供給不同的程式使用,如果有多個程式使用相同的DLL,也隻需将DLL在記憶體中裝載一次,這樣就節省了記憶體開銷。
2、DLL可以使我們的程式設計更加子產品化,将功能相對獨立的子產品編成一個動态連結庫,這樣改動程式時不需将整個程式重新編譯,隻需重新編譯所改動的子產品。
3、使用了DLL元件包可以大大減小可執行檔案的規模。
4、對于一個大型的、不斷更新的應用程式,可以将許多重複的功能寫成DLL,用主程式調用,這樣既減少了開發的工作量,又提高了通路速度。
5、DLL獨立于程式設計語言,大多數WINDOWS程式設計環境都允許主程式調用DLL中的函數。即可以用VC++、VB、PowerBuilder、Delphi、彙編語言等建立DLL,然後在不同語言編制的應用程式中調用它。這樣就給多人使用不同的程式設計語言開發項目提供了極大的友善。
二、在Delphi中調用VC++建立的動态連結庫的執行個體
(一)實驗環境
本執行個體的程式設計工具及運作環境為:Windows 98,VC++6.0,Delphi 5.0 。
(二)實驗内容
1.用VC++6.0建立一個動态連結庫MaxMin.DLL,該庫中包含有兩個函數:傳回三個整數中最大整數的函數Max1( )和傳回三個整數中最小整數的函數Min1( )。
2.用Delphi編寫測試程式調用動态連結庫MaxMin.DLL中的兩個函數。
(三)實驗步驟
1.用VC++6.0建立動态連結庫MaxMin.DLL
第一步:啟動VC++6.0,選擇“File/New/MFC AppWizzard(Dll)”,工程名設為“MaxMin”,按“确定”鈕後,選擇“Regular DLL Using shared MFC DLL”,按“Finish”鈕後,即創造了一個DLL的架構工程。
第二步:選擇“File/New”,在出現的對話框中選擇“C/C++ Header File”,在檔案名處輸入“MyDLL”,按“确定”鈕,即建立了一個空的頭檔案“MyDLL.h”。在該檔案中輸入以下兩行内容:
extern "C" _declspec(dllexport) int Min1(int x,int y,int z);
extern "C" _declspec(dllexport) int Max1(int x,int y,int z);
選擇“File/Save”儲存該檔案的内容。
第三步:選擇“File/New”,在出現的對話框中選擇“C/C++ Source File”, 在檔案名處輸入“MyDLL”,按“确定”鈕,即建立了一個空的源檔案“MyDLL.cpp”。在該檔案中輸入以下内容:
#include "stdafx.h"
#include "MyDll.h"
extern "C" __declspec(dllexport) int Min1(int x,int y,int z)
{
if ((x<=y) & (x<=z)) return x;
else if ((y<=x) & (y<=z)) return y;
else return z;
}
extern "C" __declspec(dllexport) int Max1(int x,int y,int z)
{
if ((x>=y) & (x>=z)) return x;
else if ((y>=x) & (y>=z)) return y;
else return z;
}
選擇“File/Save”儲存該檔案的内容。
第四步:按下運作圖示“!”,即生成了MyDLL.DLL(在目前工程目錄的DEBUG子目錄下)。
2.用Delphi編寫調用MaxMin.DLL的測試程式
調用動态連結庫有兩種方法,即隐式調用和顯式調用。
(1)隐式調用
第一步:啟動Delphi,選擇“New Application”,生成一個空的應用程式,在Form的“Name”屬性處輸入“TestVcDLLForm”,Caption屬性處輸入“VC++的DLL隐式調用測試”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”屬性均設為空):
Delphi中如何調用VC++建立的動态連結庫
(表1:所用到的控件及其屬性) 
Delphi中如何調用VC++建立的動态連結庫
(圖1:應用程式螢幕效果)
最後設計的Form的螢幕效果如圖1所示。選擇“File/Save all”,在“Save unit1 as”對話框中将源檔案名設為“main.pas”,按“儲存”鈕;在“Save Project1 as”對話框中将工程名設為“TestVcDLL”,按“儲存”鈕。
第二步:選擇“File/New…”,在出現的“New Item”對話框中選擇“unit”,按“OK”鈕,生成一個空的源檔案,在該檔案中輸入以下内容:
unit MaxMin;
interface
function Min1(x,y,z:Integer):Integer; stdcall;
function Max1(x,y,z:Integer):Integer; stdcall;
implementation
function Min1;external 'MaxMin.DLL' name 'Min1';
function Max1;external Max'Min.DLL' name 'Max1';
end.
選擇“File/Save As…”,将上述檔案存為“MaxMin.pas”。
第三步:在Main.pas檔案中,在“implementation”語句後加入:
uses
MaxMin;
第四步:在Form上輕按兩下“運作”按鈕對該按鈕的“Click”事件程式設計,代碼如下:
procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
begin
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調用動态連結庫中的函數Max1
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調用動态連結庫中的函數Min1
end;
儲存該檔案。
第五步:将上述1.中VC++6所建立的動态連結庫“MaxMin.DLL”拷入Delphi的目前工作目錄中。
第六步:運作。結果如圖2所示。
Delphi中如何調用VC++建立的動态連結庫
圖2:隐式調用DLL運作結果
Delphi中如何調用VC++建立的動态連結庫
圖3:顯式調用DLL運作結果
(2)顯示調用
第一步:同隐式調用。隻是将Form的“Caption”屬性改為“VC++的DLL顯式調用測試”。
第二步:選擇“File/New…”,在出現的“New Item”對話框中選擇“unit”,按“OK”鈕,生成一個空的源檔案,在該檔案中輸入以下内容:
unit Unit1;
interface
type
TMin1=function(x,y,z:Integer):Integer; stdcall;
TMax1=function(x,y,z:Integer):Integer; stdcall;
THandle=Integer;
implementation
end.
選擇“File/Save As…”,将上述檔案存為“MaxMin.pas”。
第三步:在Main.pas檔案中,在“implementation”語句後加入:
uses
MaxMin;
第四步:在Form上輕按兩下“運作”按鈕對該按鈕的“Click”事件程式設計,代碼如下:
procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
var
Handle:THandle;
Min1:TMin1;
Max1:TMax1;
begin
Handle:=LoadLibrary('MaxMin.dll'); //将“MaxMin.dll”的檔案映象映射進調用程序的位址空間
if Handle<>0 then
begin
@Min1:=GetProcAddress(Handle,'Min1'); //取得DLL中函數Min1( )的位址
@Max1:=GetProcAddress(Handle,'Max1'); //取得DLL中函數Max1( )的位址
if (@Min1<>nil) and (@Min1<>nil) then
begin
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調用動态連結庫中的函數Min1
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調用動态連結庫中的函數Max1
end else ShowMessage('調用函數“GetProcAddress”時出錯!');
FreeLibrary(Handle); //從程序的位址空間中解除“MaxMin.dll”檔案的映射
end;
end;
儲存該檔案。
第五步:将上述1.中VC++6所建立的動态連結庫“MaxMin.DLL”拷入Delphi的目前工作目錄中。
第六步:運作。結果如圖3所示。
以上執行個體均編譯通過,運作正确。
三、結束語
動态連結庫為不同程式設計環境下的應用程式之間的連接配接提供了友善,節省了記憶體,提高了速度,同時也豐富了PowerScript語言的程式設計能力。動态連結庫是Windows下程式組織的一種重要方式,使用動态連結庫可以極大地保護使用者在不同開發工具、不同時期所做的工作;利用動态連結庫,使用者可以逐漸去構築自己的程式子產品庫,為今後的工作積累素材。

繼續閱讀