您的位置:首页 > 编程语言 > Delphi

Delphi中怎么调用VC++创建的动态链接库

2014-09-22 10:29 246 查看
Delphi以其独特的面向控件的研发方式、强大的数据库功能、快速的编译技术及简单易学的编程特性,使得他自发布之日起即格外引人注目,许多程式员也因此将他作为最佳选择的研发工具。然而,Delphi在科学计算、低端编程等方面的功能不如VC++。VC++功能强大、齐全,不过整个系统比较复杂、庞大,尤其对于初学者来说比较难学,其用户界面的研发远不如Delphi那样方便、快捷。那么,我们能否将两者的好处结合起来呢?答案是肯定的!具体做法是:将涉及到比较低级的操作、计算等方面的程式用VC++写成函数放在动态链接库中,而涉及到界面及和用户交互的编程则用Delphi来实现,最后只需在Delphi中调用VC++编写的动态链接库即可。

一、动态链接库简介

动态链接库(DLL,即 “Dynamic-Link Library”)是个能够被应用程式和其他的DLL调用的过程和函数的集合体,他里面包含的是公共代码或资源。DLL是视窗系统的基石,所有的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++创建的动态链接库的实例

(一)实验环境

本实例的编程工具及运行环境为:视窗系统 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”属性均设为空):

(表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 (@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语言的编程能力。动态链接库是视窗系统下程式组织的一种重要方式,使用动态链接库能极大地保护用户在不同研发工具、不同时期所做的工作;利用动态链接库,用户能逐步去构筑自己的程式模块库,为今后的工作积累素材。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: