软盟收藏
 用户中心
 加盟指南
 网上订购
软件联盟 商业源码 名企管理 策划方案 募捐会馆 会员服务 源码下载 开发文档 SAP教程 房地产策划 商业图库
软件联盟现时:2010年9月8日 星期三 位于: 源码文档- 开发文档 → 开发技术(Delphi技术)
Delphi中如何调用VC++创建的动态链接库?
2004年4月5日  作者:  商业源码:策划管理,名企内参,咨询顾问  浏览选项:    本文已被浏览 4589 次
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; /*找出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”属性均设为空): 

最后设计的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)显示调用 
第一步:同隐式调用。只是将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下程序组织的一种重要方式,使用动态链接库可以极大地保护用户在不同开发工具、不同时期所做的工作;利用动态链接库,用户可以逐步去构筑自己的程序模块库,为今后的工作积累素材。
 发布人:baobao
 [ → 我要发表文章 ]
上篇文章:DBGridEH所有欄位自動寬度的實現
下篇文章:天降神兵---十倍速开发工具VD3
→ 主题所属分类:  开发技术 → Delphi技术 → 『关闭窗口』
 热门文章
 穿透防火墙的数据传输源码 (4614)
 Delphi中如何调用VC++创建的动态链接库? (4590)
 使用Delphi和WebServices技术开发短信应用 (4384)
 把.NET部署到没有安装Fram的机器上 (4327)
 用DELPHI实现的黑客程序技巧集锦 (4181)
 最短路径算法源码(VB源码教程) (4135)
 ASP.NET添加客户端代码的几种方法 (4112)
 提高ASP.NET性能的若干方法 (4079)
 利用随机数加密字串的算法(vb) (3941)
 Java常见问题大全集 (3941)
 最近更新
 Google店大欺客:伪开源Android危机四伏 (2月3日)
 从各大软件公司笔试压轴题学习SQL语句 (12月31日)
 Oracle并行查询发挥多CPU的威力 (7月8日)
 SQL Server 2008企业视频讲座 (12月5日)
 一个完美的中文大写日期转换函数 (8月1日)
 海量数据库的查询优化及分页算法方案 (8月1日)
 用友ERP-NC精华实用SQL脚本之:快速复制公司的... (2月21日)
 IC卡写卡操作的源码(深圳达实公司) (3月16日)
 专家分享Oracle数据库业务优化心得 (1月15日)
 多线程验证DoubleCheckedLocking (11月3日)
 文章搜索
搜索选项:            
  → 评论内容 (点击查看)
(没有相关评论)
  → 发表我的评论
您的姓名:  您的E-mail:

评论内容:
发表评论:  
关于我们咨询反馈合作媒体免费金币行业管理名企内参矢量图库素材模板客户名录快乐淘宝广告合作网站地图
本站总访问量: 19762491 人次 ┋ 围观高峰 948 人在线 ┋ 现时围观 41 人
商业源码:策划管理,名企内参,咨询顾问 [节能型] ┋联系邮件 服务QQ:308071592
软件创业联盟 ©2002-2018 版权所有 浙ICP备09028508号 电话:0571-8590-3599