在Delphi中調用VC++創建的動態鏈接庫的實例

 

在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; /*找出x,y,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; /*找出x,y,z中的最大整數*/
}
選擇“File/Save”保存該文件的內容。
第四步:按下運行圖標“!”,即生成了MyDLL.DLL(在當前工程目錄的DEBUG子目錄下)。

2.用Delphi編寫調用MaxMin.DLL的測試程序
調用動態鏈接庫有兩種方法,即隱式調用和顯式調用。
(1)隱式調用
第一步:啓動Delphi,選擇“New Application”,生成一個空的應用程序,在Form的“Name”屬性處輸入“TestVcDLLForm”,Caption屬性處輸入“VC++的DLL隱式調用測試”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”屬性均設爲空):


(表1:所用到的控件及其屬性)


(圖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所示。


圖2:隱式調用DLL運行結果


圖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 (@Max1<>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所示。

以上實例均編譯通過,運行正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章