`
EJB_wawa
  • 浏览: 107010 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

写调用动态链接库DLL的应用程序

阅读更多
众所周知,Windows的可执行文件可以划分为两种形式:程序和动态链接库(DLL)。而在什么时候需要使用动态链接库呢,动态链接库又有一些什么样的好处呢:
1、一个DLL可以提供给不同的程序使用,而这个DLL只需要在内存中加载一次,这样就节省了系统的内存。
2、我们可以提供DLL的不同版本来更新我们的程序,而不需要重新编译我们的程序。
3、使用了DLL组件包可以大大减小可执行文件的规模。
4、如果应用程序是基于同一个组件包,我们将接生许多内存和代码分配。
从上面看来,DLL是独立于编程语言的;在Windows编程环境下,我们可以在不同的编程语言中调用相互编写的动态链接库,从而满足不同的需要,并且大大的提高了更新效率。
下面我就讲讲使用在Delphi 5.0中如何编写调用动态链接库的应用程序。

首先,我们要创建一个DLL,在Delphi的菜单中选择File->New,选中DLL,然后点击OK。
 
这时可以出现编写环境,请注意那里的英文说明,大概讲述了编写DLL时需要注意的地方,其中有一个非常重要的就是尽量避免使用string类型而采用pchar或者shortstring类型,否则传递的参数将出现乱码。
然后,将第一行的Library Project1;改成Lirbrary MyDLL;,同时保存文件,并编译,这就产生了一个DLL;当然这个DLL现在还什么都没有。现在我们给他加上一些功能。

uses
SysUtils,Windows,Registry,Regstr; 

Function ChkBoolean():Boolean;stdcall;
Begin
Result:True;
End;

procedure WriteReg(UserName:pchar);stdcall;
var
Reg: TRegistry;
begin
Reg:=TRegistry.Create;
errFind:=False;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
If Reg.OpenKey(''SOFTWARE\MyDLL\''+UserName,True) then
Reg.WriteString(''Name'',UserName);
finally
Reg.CloseKey;
Reg.Free;
end;
end;

输入以上的代码,分别是一个函数和一个过程,第一个函数ChkBoolean返回一个真;过程WriteReg读取一个参数并将该参数写入注册表。在程序的最后必须加上一句:
Exports ChkBoolean,WriteReg;
这样表示向外声明可提供给应用程序的函数或过程,也只有在这里声明的函数或过程可以给其他应用程序所调用。
最后,我们编译整个程序,将产生一个MyDll.dll的文件。

现在,让我们创建一个应用程序来调用这个DLL。
点击File->New Application,保存这个工程,记住要和刚才那个DLL工程在同一个目录。
在 implementation 下编写如下代码:
type
TMyProcedure=procedure(UseNam:pchar);stdcall;
function ChkBoolean():Boolean; external MyDLL.DLL'';
第一行定义了一个过程类型,下面会看到这有什么用;
在我们程序的Form上放置一个TEdit和TButton控件,使其如下图所示:
 
双击按钮,编写onClick事件,代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
HInst:Thandle;
FPointer:TFarProc;
MyProc:TMyProcedure;
Begin
If ChkBoolean Then
//直接返回函数值,为真,继续运行……
Begin
HInst:=LoadLibrary(''MyDLL.DLL'');
if HInst>0 then
try
FPointer:=GetProcAddress(Hinst,Pchar(''WriteReg''));
//GetProcAddress API函数用于找到DLL中的函数名,并返回一个指针
if FPointer<>nil then
begin
MyProc:=TMyProcedure(FPointer);
//将该函数指针转换成相应的数据类型并调用它
Try
MyProc(Edit1.Text);
except on E:Exception do
ShowMessage(E.Message);
end;
end
else
ShowMessage(''DLL procedure not found!'');
finally
FreeLibrary(HInst);
end
else
ShowMessage(''Library not found!'');
End;
end;

编写完以上代码,马上运行应用程序。在输入框处输入任意字符,并点击按钮,再打开你的注册表,需要HKEY_LOCAL_MACHINE\ SOFTWARE,看看多了些什么。
很有意思吧,呵呵!通过这样一个简单的例子,你可以更加好的运用DLL的强大优势。同时,用DELPHI编写的DLL还可以提供给其他语言环境调用啊,比如VB,VC等等。还不赶快试试?
分享到:
评论

相关推荐

    C#DLL动态链接库编程

    也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来...

    VC6动态链接库编程示例源代码(含VC和VB调DLL库示例)

    含VC和VB调用VC动态链接库DLL库示例源代码,都作了注释, 所有源代码完整,debug目录已编译生成程序,适合初学编程爱好者。 压缩包内容: plf_DLL工程,VC6 动态链接库编程示例源代码。(数的平方和立方) VB_call...

    VC++动态链接库(dll)编程深入浅出-----PDF和源码

     一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。  (3)VC动态链接库的分类  Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC...

    深入浅出Visual C++动态链接库(DLL)编程(pdf版+doc版)

    第二章:VC++动态链接库编程之非MFC DLL 2.1、一个简单的DLL 2.2、声明导出函数 2.3、DLL的调用方式 2.4、DllMain函数 2.5、__stdcall约定 2.6、DLL导出变量 2.7、DLL导出类 第三章:VC++动态链接库编程之MFC规则DLL...

    MFC共享式动态链接库编写与调试

    详细的介绍了如何编写MFC共享式动态链接库的编写以及调试方法,以及如何在另一个程序中调用该dll中的接口创建动态链接库中定义的窗口

    yolov5_tensorrt_dll c++动态链接库接口

    实际应用中,需要把生成的engine和推理程序给c#,java或者各种调用,可以把它写为一个对外的接口,供给别人使用。

    DLL动态链接库生成和使用(隐式调用、显示调用)

    Windows10 64位系统,VS2013 编程平台。两个工程,工程一为生成DLL的方法,生成dll、lib...两个工程都是控制台应用程序consoleapplication。 对应的文章为 https://blog.csdn.net/u012210613/article/details/88904841

    Dll调用与嵌套调用

    一.Win32动态链接库  1.制作的步骤:  (1)新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型。  (2)MyDll.h的内容如下: 以下是引用片段: extern "C" _declspec(dllexport...

    动态链接库DLL编程篇

    动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的...动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可以被系统中的任何正在运行的应用程序软件所使用,而不必再将DLLs函数的另一拷贝装入内存。

    ASP.NET/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统...DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DL

    pb调用dll实例

    (3)对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又提高了访问速度。(4)DLL丰富了PowerScript语言的编程能力,可以使用PowerScript函数集之外的...

    动态链接库运算器

    在应用程序中用 LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在...

    怎样用VB编写.DLL动态链接库文件

    在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。

    动态库 DLL开发与使用的优秀范例

    应用程序可以调用的DLL函数,在DLL中叫做导出函数,而在应用程序中叫做导入函数。...如果在应用程序中使用Windows API函数直接完成DLL库函数的调用,那么这种做法就叫做DLL的显式方式,当然这不必使用导入库文件了。

    python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。 ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。 一、Python调用DLL里面的...

    打开、修改、调用和编辑dll文件的方法

    在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个...

    浅析C/C++中动态链接库的创建和调用

    下面为你介绍C/C++中动态链接库的创建和调用。 动态连接库的创建步骤: 创建Dll有两种方式。 一、创建Non-MFC DLL动态链接库 1、打开File —&gt; New —&gt; Project选项,选择Win32 Dynamic-Link Library —&gt;sample ...

    LabVIEW与外部程序间DLL文件的调用

    DLL(动态链接库)文件是Dynamic Link Library 的缩写形式,是一种允许程序共享 执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有DLL 扩展名的文 件,但也可能是EXE 或其他扩展名。Windows 提供...

    Windows中DLL文件基本原理及修改方法

    在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL 文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个...

Global site tag (gtag.js) - Google Analytics