Delphi中怎么調(diào)用VC++創(chuàng)建的動(dòng)態(tài)鏈接庫
發(fā)表時(shí)間:2023-07-29 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Delphi以其獨(dú)特的面向控件的開發(fā)方式、強(qiáng)大的數(shù)據(jù)庫功能、快速的編譯技術(shù)以及簡(jiǎn)單易學(xué)的編程特性,使得它自發(fā)布之日起即格外引人注目,許多程序員也因此將它作為首選的開發(fā)工具。然而,Delphi在科學(xué)計(jì)...
Delphi以其獨(dú)特的面向控件的開發(fā)方式、強(qiáng)大的數(shù)據(jù)庫功能、快速的編譯技術(shù)以及簡(jiǎn)單易學(xué)的編程特性,使得它自發(fā)布之日起即格外引人注目,許多程序員也因此將它作為首選的開發(fā)工具。然而,Delphi在科學(xué)計(jì)算、低端編程等方面的功能不如VC++。VC++功能強(qiáng)大、齊全,但是整個(gè)系統(tǒng)比較復(fù)雜、龐大,尤其對(duì)于初學(xué)者來說比較難學(xué),其用戶界面的開發(fā)遠(yuǎn)不如Delphi那樣方便、快捷。那么,我們能否將兩者的優(yōu)點(diǎn)結(jié)合起來呢?答案是肯定的!具體做法是:將涉及到比較低級(jí)的操作、計(jì)算等方面的程序用VC++寫成函數(shù)放在動(dòng)態(tài)鏈接庫中,而涉及到界面及與用戶交互的編程則用Delphi來實(shí)現(xiàn),最后只需在Delphi中調(diào)用VC++編寫的動(dòng)態(tài)鏈接庫即可。
一、動(dòng)態(tài)鏈接庫簡(jiǎn)介
動(dòng)態(tài)鏈接庫(DLL,即 “Dynamic-Link Library”)是一個(gè)能夠被應(yīng)用程序和其它的DLL調(diào)用的過程和函數(shù)的集合體,它里面包含的是公共代碼或資源。DLL是Windows的基石,所有的Win32 API函數(shù)都包含在DLL中。
使用DLL有許多優(yōu)點(diǎn):
1、一個(gè)DLL可以提供給不同的程序使用,如果有多個(gè)程序使用相同的DLL,也只需將DLL在內(nèi)存中裝載一次,這樣就節(jié)省了內(nèi)存開銷。
2、DLL可以使我們的編程更加模塊化,將功能相對(duì)獨(dú)立的模塊編成一個(gè)動(dòng)態(tài)鏈接庫,這樣改動(dòng)程序時(shí)不需將整個(gè)程序重新編譯,只需重新編譯所改動(dòng)的模塊。
3、使用了DLL組件包可以大大減小可執(zhí)行文件的規(guī)模。
4、對(duì)于一個(gè)大型的、不斷更新的應(yīng)用程序,可以將許多重復(fù)的功能寫成DLL,用主程序調(diào)用,這樣既減少了開發(fā)的工作量,又提高了訪問速度。
5、DLL獨(dú)立于編程語言,大多數(shù)WINDOWS編程環(huán)境都允許主程序調(diào)用DLL中的函數(shù)。即可以用VC++、VB、PowerBuilder、Delphi、匯編語言等建立DLL,然后在不同語言編制的應(yīng)用程序中調(diào)用它。這樣就給多人使用不同的編程語言開發(fā)項(xiàng)目提供了極大的方便。
二、在Delphi中調(diào)用VC++創(chuàng)建的動(dòng)態(tài)鏈接庫的實(shí)例
(一)實(shí)驗(yàn)環(huán)境
本實(shí)例的編程工具及運(yùn)行環(huán)境為:Windows 98,VC++6.0,Delphi 5.0 。
(二)實(shí)驗(yàn)內(nèi)容
1.用VC++6.0建立一個(gè)動(dòng)態(tài)鏈接庫MaxMin.DLL,該庫中包含有兩個(gè)函數(shù):返回三個(gè)整數(shù)中最大整數(shù)的函數(shù)Max1( )和返回三個(gè)整數(shù)中最小整數(shù)的函數(shù)Min1( )。
2.用Delphi編寫測(cè)試程序調(diào)用動(dòng)態(tài)鏈接庫MaxMin.DLL中的兩個(gè)函數(shù)。
(三)實(shí)驗(yàn)步驟
1.用VC++6.0建立動(dòng)態(tài)鏈接庫MaxMin.DLL
第一步:?jiǎn)?dòng)VC++6.0,選擇“File/New/MFC AppWizzard(Dll)”,工程名設(shè)為“MaxMin”,按“確定”鈕后,選擇“Regular DLL Using shared MFC DLL”,按“Finish”鈕后,即創(chuàng)造了一個(gè)DLL的框架工程。
第二步:選擇“File/New”,在出現(xiàn)的對(duì)話框中選擇“C/C++ Header File”,在文件名處輸入“MyDLL”,按“確定”鈕,即創(chuàng)建了一個(gè)空的頭文件“MyDLL.h”。在該文件中輸入以下兩行內(nèi)容:
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”保存該文件的內(nèi)容。
第三步:選擇“File/New”,在出現(xiàn)的對(duì)話框中選擇“C/C++ Source File”, 在文件名處輸入“MyDLL”,按“確定”鈕,即創(chuàng)建了一個(gè)空的源文件“MyDLL.cpp”。在該文件中輸入以下內(nèi)容:
#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; /*找出x,y,z中的最小整數(shù)*/
}
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; /*找出x,y,z中的最大整數(shù)*/
}
選擇“File/Save”保存該文件的內(nèi)容。
第四步:按下運(yùn)行圖標(biāo)“!”,即生成了MyDLL.DLL(在當(dāng)前工程目錄的DEBUG子目錄下)。
2.用Delphi編寫調(diào)用MaxMin.DLL的測(cè)試程序
調(diào)用動(dòng)態(tài)鏈接庫有兩種方法,即隱式調(diào)用和顯式調(diào)用。
(1)隱式調(diào)用
第一步:?jiǎn)?dòng)Delphi,選擇“New Application”,生成一個(gè)空的應(yīng)用程序,在Form的“Name”屬性處輸入“TestVcDLLForm”,Caption屬性處輸入“VC++的DLL隱式調(diào)用測(cè)試”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”屬性均設(shè)為空):
(表1:所用到的控件及其屬性)
(圖1:應(yīng)用程序屏幕效果)
最后設(shè)計(jì)的Form的屏幕效果如圖1所示。選擇“File/Save all”,在“Save unit1 as”對(duì)話框中將源文件名設(shè)為“main.pas”,按“保存”鈕;在“Save Project1 as”對(duì)話框中將工程名設(shè)為“TestVcDLL”,按“保存”鈕。
第二步:選擇“File/New…”,在出現(xiàn)的“New Item”對(duì)話框中選擇“unit”,按“OK”鈕,生成一個(gè)空的源文件,在該文件中輸入以下內(nèi)容:
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上雙擊“運(yùn)行”按鈕對(duì)該按鈕的“Click”事件編程,代碼如下:
procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
begin
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)Max1
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)Min1
end;
保存該文件。
第五步:將上述1.中VC++6所建立的動(dòng)態(tài)鏈接庫“MaxMin.DLL”拷入Delphi的當(dāng)前工作目錄中。
第六步:運(yùn)行。結(jié)果如圖2所示。
圖2:隱式調(diào)用DLL運(yùn)行結(jié)果
圖3:顯式調(diào)用DLL運(yùn)行結(jié)果
(2)顯示調(diào)用
第一步:同隱式調(diào)用。只是將Form的“Caption”屬性改為“VC++的DLL顯式調(diào)用測(cè)試”。
第二步:選擇“File/New…”,在出現(xiàn)的“New Item”對(duì)話框中選擇“unit”,按“OK”鈕,生成一個(gè)空的源文件,在該文件中輸入以下內(nèi)容:
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上雙擊“運(yùn)行”按鈕對(duì)該按鈕的“Click”事件編程,代碼如下:
procedure TTestVcDLLForm.btnRunClick(Sender: TObject);
var
Handle:THandle;
Min1:TMin1;
Max1:TMax1;
begin
Handle:=LoadLibrary('MaxMin.dll'); //將“MaxMin.dll”的文件映象映射進(jìn)調(diào)用進(jìn)程的地址空間
if Handle<>0 then
begin
@Min1:=GetProcAddress(Handle,'Min1'); //取得DLL中函數(shù)Min1( )的地址
@Max1:=GetProcAddress(Handle,'Max1'); //取得DLL中函數(shù)Max1( )的地址
if (@Min1<>nil) and (@Min1<>nil) then
begin
edtMin.Text:=IntToStr(Min1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)Min1
edtMax.Text:=IntToStr(Max1(StrToInt(edtInt1.Text),
StrToInt(edtInt2.Text),StrToInt(edtInt3.Text))); //調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)Max1
end else ShowMessage('調(diào)用函數(shù)“GetProcAddress”時(shí)出錯(cuò)!');
FreeLibrary(Handle); //從進(jìn)程的地址空間中解除“MaxMin.dll”文件的映射
end;
end;
保存該文件。
第五步:將上述1.中VC++6所建立的動(dòng)態(tài)鏈接庫“MaxMin.DLL”拷入Delphi的當(dāng)前工作目錄中。
第六步:運(yùn)行。結(jié)果如圖3所示。
以上實(shí)例均編譯通過,運(yùn)行正確。
三、結(jié)束語
動(dòng)態(tài)鏈接庫為不同編程環(huán)境下的應(yīng)用程序之間的連接提供了方便,節(jié)省了內(nèi)存,提高了速度,同時(shí)也豐富了PowerScript語言的編程能力。動(dòng)態(tài)鏈接庫是Windows下程序組織的一種重要方式,使用動(dòng)態(tài)鏈接庫可以極大地保護(hù)用戶在不同開發(fā)工具、不同時(shí)期所做的工作;利用動(dòng)態(tài)鏈接庫,用戶可以逐步去構(gòu)筑自己的程序模塊庫,為今后的工作積累素材。