Delphi中如何调用VC++创建的动态链接库
肖运勇 |
01-10-29 下午 02:06:09
|
Delphi以其独特的面向控件的开发方式、强大的数 据库功能、快速的编译技术以及简单易学的编程特性,使得它自发布之日起即格外引人注目,许多程序员也因此将它作为首选的开发工具。然而,Delphi在科 学计算、低端编程等方面的功能不如VC++。VC++功能强大、齐全,但是整个系统比较复杂、庞大,尤其对于初学者来说比较难学,其用户界面的开发远不如 Delphi那样方便、快捷。那么,我们能否将两者的优点结合起来呢?答案是肯定的!具体做法是:将涉及到比较低级的操作、计算等方面的程序用VC++写 成函数放在动态链接库中,而涉及到界面及与用户交互的编程则用Delphi来实现,最后只需在Delphi中调用VC++编写的动态链接库即可。 |
动态链接库(DLL,即 “Dynamic-Link Library”)是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。DLL是Windows的基石,所有的Win32 API函数都包含在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/New”,在出现的对话框中选择“C/C++ Source File”, 在文件名处输入“MyDLL”,按“确定”钮,即创建了一个空的源文件“MyDLL.cpp”。在该文件中输入以下内容: |
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中的最大整数*/ |
第四步:按下运行图标“!”,即生成了MyDLL.DLL(在当前工程目录的DEBUG子目录下)。 |
2.用Delphi编写调用MaxMin.DLL的测试程序 |
第一步:启动Delphi,选择“New Application”,生成一个空的应用程序,在Form的“Name”属性处输入“TestVcDLLForm”,Caption属性处输入“VC ++的DLL隐式调用测试”,在Form中放入控件如表1所示(其中所有的Edit控件的“Text”属性均设为空): |
|
(表1:所用到的控件及其属性)
|
|
最后设计的Form的屏幕效果如图1所示。选择“File/Save all”,在“Save unit1 as”对话框中将源文件名设为“main.pas”,按“保存”钮;在“Save Project1 as”对话框中将工程名设为“TestVcDLL”,按“保存”钮。 |
第二步:选择“File/New…”,在出现的“New Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容: |
function Min1(x,y,z:Integer):Integer; stdcall; |
function Max1(x,y,z:Integer):Integer; stdcall; |
function Min1;external 'MaxMin.DLL' name 'Min1'; |
function Max1;external Max'Min.DLL' name 'Max1'; |
选择“File/Save As…”,将上述文件存为“MaxMin.pas”。 |
第三步:在Main.pas文件中,在“implementation”语句后加入: |
第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下: |
procedure TTestVcDLLForm.btnRunClick(Sender: TObject); |
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 |
第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。 |
第一步:同隐式调用。只是将Form的“Caption”属性改为“VC++的DLL显式调用测试”。 |
第二步:选择“File/New…”,在出现的“New Item”对话框中选择“unit”,按“OK”钮,生成一个空的源文件,在该文件中输入以下内容: |
TMin1=function(x,y,z:Integer):Integer; stdcall; |
TMax1=function(x,y,z:Integer):Integer; stdcall; |
选择“File/Save As…”,将上述文件存为“MaxMin.pas”。 |
第三步:在Main.pas文件中,在“implementation”语句后加入: |
第四步:在Form上双击“运行”按钮对该按钮的“Click”事件编程,代码如下: |
procedure TTestVcDLLForm.btnRunClick(Sender: TObject); |
Handle:=LoadLibrary('MaxMin.dll'); //将“MaxMin.dll”的文件映象映射进调用进程的地址空间 |
@Min1:=GetProcAddress(Handle,'Min1'); //取得DLL中函数Min1( )的地址 |
@Max1:=GetProcAddress(Handle,'Max1'); //取得DLL中函数Max1( )的地址 |
if (@Min1<>nil) and (@Min1<>nil) then |
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”文件的映射 |
第五步:将上述1.中VC++6所建立的动态链接库“MaxMin.DLL”拷入Delphi的当前工作目录中。 |
动态链接库为不同编程环境下的应用程序之间的连接提供了方便,节省了内存,提高了速度,同时也丰富了PowerScript语言的编程能力。动态链接库是 Windows下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作;利用动态链接库,用户可以逐步去构筑自 己的程序模块库,为今后的工作积累素材。
分享到:
相关推荐
总结来说,调用VC++创建的动态链接库在Delphi中是一个涉及DLL加载、函数指针获取、跨语言兼容性以及错误处理的过程。熟练掌握这一技能,能极大地拓宽Delphi应用的功能边界,实现与C++组件的无缝集成。
【VC++动态链接库】是Windows平台上的一种代码共享机制,允许不同程序之间共享函数和数据。动态链接库(DLL)可以被多个应用程序同时调用,从而节省内存资源,提高程序运行效率。DLL文件包含了可执行文件(EXE)运行...
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的...
动态链接库(DLL,Dynamic Link Library)是Windows操作系统中一种重要的共享代码库,它包含了一系列可执行代码和数据,可供多个程序同时调用。在VC++2010中创建和使用DLL,不仅可以节省内存资源,还能实现代码重用...
### VC++动态链接库(DLL)编程:原理与实践 #### 概述 动态链接库(Dynamic Linkable Library,简称DLL)是微软Windows操作系统中的一种关键组件,它允许多个应用程序共享相同的代码和数据,从而提高了资源利用效率...
### VC++动态链接库(DLL)编程深入浅出 #### 概念理解 **动态链接库(DLL)**,即Dynamic Linkable Library,是Windows操作系统中的一种共享代码库,允许多个应用程序共享相同的代码和数据。它是一种软件组件,能够...
- 在动态链接库中还可以包含其他的动态或静态链接库。 - **优点**: - 减少内存占用。 - 提高资源利用率。 - 方便更新和维护。 #### 三、动态链接库的特点与应用场景 1. **跨语言兼容性**:DLL的编制与具体的...
本文将深入探讨Delphi动态链接库的创建、使用和与VC++(Visual C++)的交互。 一、Delphi动态链接库的创建 1. **项目设置**:在Delphi中,选择“新建”->“工程”->“动态链接库(DLL)”。这将创建一个基础的DLL...
【VC++动态链接库(DLL)编程】是关于利用Microsoft Visual C++开发DLL应用程序的教程。DLL,全称为Dynamic Linkable Library,是一种Windows操作系统中的共享代码库,它封装了可供其他程序使用的函数、变量和类。这篇...
【VC++动态链接库(DLL)编程深入浅出】这篇文档深入探讨了VC++中动态链接库(DLL)的编程技术。DLL是一种可共享代码的仓库,它包含可供其他程序使用的函数、变量或类。与静态链接库不同,DLL不包含在最终的EXE文件中...
本问题聚焦于在BCB和Delphi中调用由Visual Studio 2015创建的动态链接库(DLL)时遇到的问题,以及如何解决这个问题。 标题“BCB&Delphi调用vs2015动态库报错解决”表明了一个典型的问题:当尝试从BCB或Delphi应用...
本篇将深入探讨如何使用Delphi调用由VC(Visual C++)编写的DLL(动态链接库)文件,重点在于参数传递的过程。首先,理解DLL的基本概念是必要的。DLL是一种共享代码的机制,允许多个程序同时使用同一段代码,从而...
在本示例中,我们将探讨如何在Delphi 7环境下通过调用动态链接库(DLL)来实现HMAC-SHA1算法,这是一种用于消息认证的安全技术。该DLL是由VC++基于OpenSSL库编写的,OpenSSL是一个强大的安全套接字层密码库,包含...
另外,静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 三、动态链接库的分类 VC 支持三种 DLL,它们分别是 Non-MFC DLL(非 MFC 动态库)、MFC ...
### 动态链接库(DLL)编程深入浅出 #### 1. 概述 动态链接库(Dynamic Linkable Library,简称DLL)是一种共享代码的形式,它可以被多个应用程序同时使用,提高了代码的重用性和效率。DLL本质上可以视为一个代码...