公司法
当前位置: 首页 法律大全

动态链接库的建立与调用实验分析(14.动态链接库编程)

时间:2023-05-30 作者: 小编 阅读量: 1 栏目名: 法律大全

如果指定的dll文件出错,不会导致程序终止运行。如果应用程序中使用LoadLibrary调用某一模块前,其他应用程序已经把该模块装入内存,则LoadLibrary并不会装载该模块的另一实例,而是使该模块的“引用计数”加1。如果将module设置为nil,则表示要引用当前模块。ProcName是指向含有函数名的以nil结尾的字符串指针,该字符串指针中所含有的函数名的拼写必须与动态链接库文件exports中的对应拼写一致,否则会出错。如果引用计数为0,则卸载该模块。

4.动态链接库的动态调用

动态调用也称为显式加载方式,动态调用不需要在单元体 Interface 部分把需要调用的所有 dll 过程全部列出,只要在调用前引用,并且使用 LoadLibrary 函数指定需要加载的 dll 文件,使用 GetProcAddress 函数指定所调用的过程或函数,并返回该过程或函数的入口地址,使用 FreeLibrary 函数实现将该函数从内存中移除。

如果指定的 dll 文件出错,不会导致程序终止运行。

动态调用 dll 主要用到三个 Win32 API 函数:

1.LoadLibrary() - 把指定库模块装入内存,语法:

function LoadLibrary(LibFileName: PChar): THandle;

LibFileName 指定了要装载 dll 的文件名,如果 LibFileName 没有包含一个路径,则 Windows 按如下顺序进行查找:

  • 当前目录
  • Windows 目录
  • Windows 系统目录
  • 当前可执行文件所在目录
  • PATH 环境变量中的目录以及网络的映像目录列表

如果函数执行成功,则返回装载库的实例句柄。否则,返回一个小于 HINSTANCE_ERROR 的错误代码以指明错误的种类。

如果应用程序中使用 LoadLibrary 调用某一模块前,其他应用程序已经把该模块装入内存,则 LoadLibrary 并不会装载该模块的另一实例,而是使该模块的“引用计数”加 1 。这样就能够保证在内存中只加载一次,所有应用程序都共享这个单一的拷贝。

2.GetProcAddress() - 获取给定模块中函数的地址,语法:

function GetProcAddress(Module: THandle; ProcName: PChar): TFarChar;

Module 包含被调用的函数库模块的句柄,该值由 LoadLibrary 返回。如果将 module 设置为 nil,则表示要引用当前模块。

ProcName 是指向含有函数名的以 nil 结尾的字符串指针,该字符串指针中所含有的函数名的拼写必须与动态链接库文件 exports 中的对应拼写一致,否则会出错。

如果该函数执行成功,则返回模块中函数入口处的地址,否则返回 nil。

3.FreeLibrary() - 从内存中移出库模块,语法:

procedure FreeLibrary(Module: THandle);

Module 为库模块的句柄,由 LoadLibrary 返回。由于库模块在内存中只装载一次,因而调用该过程首先库模块的引用计数减 1。如果引用计数为 0,则卸载该模块。

示例:使用上一节中的角度转换弧度的动态链接库,实现输入角度,输出弧度。界面如下:

代码如下:

unit Unit1;{$mode objfpc}{$H }interfaceusesClasses, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin, Windows;type{ TForm1 }TForm1 = class(TForm)AngFloatSpinEdit: TFloatSpinEdit;Button1: TButton;Label1: TLabel;Label2: TLabel;ArcLabel: TLabel;procedure Button1Click(Sender: TObject);privatepublicend;varForm1: TForm1;implementationtype// 照着DLL(在源文件中)所使用的定义的方式,定义将要调用的子程序TFunAngToArc=function (a: double):double; stdcall;{$R *.lfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);var// 为DLL子程序创建一个合适的变量(数据字段)pfunc: TFunAngToArc;// 为DLL创建一个处理程序/句柄hdl: THandle;begin// 获取将要使用的库的处理程序/句柄hdl:=LoadLibrary(PChar('laz1401.dll'));// 检查是否成功加载DLL文件if hdl>32 thenbegin// 分配子程序调用的存储器地址给变量Pointer(pfunc):=GetProcAddress(hdl, 'FunAngToArc');// 检查是否已经返回一个有限的存储器内存地址if @pfunc <> nil thenArcLabel.Caption:=floattostr(pfunc(AngFloatSpinEdit.Value));end;// 释放存储器内存pfunc:=nil;FreeLibrary(hdl);end;end.

    推荐阅读
  • lol新英雄技能介绍(LOL新英雄的易碎buff有多强)

    易碎,30%的控制延长艾希水晶箭易碎=4.5秒控制艾希的魔法水晶箭最远距离的眩晕控制时间在3.5秒,配合上奥恩的易碎加持增加30%,可以最多达到4.55秒的眩晕控制时间。不过大部分LOL英雄的控制技能都是可以配合的,减速,眩晕等等。新英雄奥恩不仅仅是能够帮助队友强化装备,破墙延长控制时间,这些对于团队来说都是非常重要的能力。而且这个易碎buff一级就带有10%的最大生命值伤害,相当夸张的能力。

  • 川崎忍者400有什么颜色的(白忍回归黑忍涨价)

    22款KRT版画相较于21款,主要在侧护板上的图案以及发动机下整流罩的颜色变化。21款KRT版的侧护板是黑色的,下导流罩采用白色涂装;而22款增加了绿色的比例。可能是因为版画上加入了川崎的绿色查克拉,22款金属火花黑涨了1000元。可能红色没有办法完美的搭配川崎绿色的版画,作为这次版画中的“异类”,价格最低,售价49800元。看来川崎现在也学到了版画王的精髓。

  • 文人画的特征是什么(文人画的三大特点)

    这样的人画出画来,不叫“文人画”也会文气十足。这和画家的人品有一定的关系,但不是全部,更重要的是画家接受的教育和所处的环境。

  • 谷歌gmail新版(Google新计划客制化)

    不过,Google已经证实了一项测试计划,未来将让Gmail用户可在域名规则的管制范围内,客制化自己的电子邮件地址。目前付费使用GoogleAppsforWork服务时,可参考公司名称来自订电子邮件地址。Google发言人向国外媒体ZDNet表示,用户对于电子邮件地址的首选通常不是如同yourname@gmail.com,这也就是为什么Google欲尝试其他的Gmail方案,给予用户更多的弹性。不过,这项计划目前仍在测试阶段,还没有作出任何长远规划。

  • 酸梅汤好处(酸梅汤的功效与作用)

    酸梅汤好处酸梅汤是夏季的时候很常见的一种饮品,它能够生津止渴,提神解暑。临床上常用酸梅汤来治疗由于暑热所导致的恶心、呕吐、头晕、头痛等一系列症状。除此之外,酸梅汤还能够有一定抗疲劳的作用,因为酸梅汤能够有效地抑制乳酸,并能够去除血管当中的有害物质,使肌肉和血管恢复活力。酸梅汤当中含有非常丰富的维生素,特别是维生素b2,具有很好的健脾、开胃的功能。另外,还有一定的平肝、降火、保肝、护肝的作用。

  • 谁都不要站在道德的高度指责别人(永远不要站在道德制高点指责他人)

    本以为会被公众所理解,却没想到连续遭到两个男生的拒绝,最后是两个女生为其换了座位。这并不是道德的维护者,而是道德的亵渎者。两人发生了争执,甚至踢倒了女生。虽然男子的出发点是好的,但也不该成为伤害他人的借口。道德是约束自己的真正的道德是用来约束自己,让其成为自己生活的一部分,而并非去管制他人的生活。道德是一个人与动物的最大区别,也是人类进入现代文明的最大象征。

  • 爱丽丝的花语(爱丽丝的花语含义)

    跟着小编一起来看一看吧!爱丽丝的花语爱丽丝就是鸢尾花,它的花语为好消息,优美,使者,易变的,想念你,爱的留言。它的花色为蓝紫色,花形类似起舞的蝴蝶,花开在春季,开花时就像蝴蝶在绿叶之间飞舞,感觉想把春的消息带到远方。它是谐音为爱死你,因此寓意爱情,深受情侣的喜爱。它还是法国的国花。

  • (九集中学开展保护环境)

    本次活动以“保护环境,爱护生物”为主题,由生物老师组织七八年级的学生积极参与。活动是在国庆长假时安排的,学生可以利用网络查找相关的保护环境的资料,可以和家长一起完成,也可以和同班同学合作完成。通过制作手抄报让学生带动家长成为环境保护的宣传者、实践者、推动者。10月9日,生物组对所有手抄报进行认真评选,其中熊思颖、谢咏仪等同学的作品让师生赞叹不已。

  • 香油煎鸡蛋怎么做(香油煎鸡蛋怎么操作?)

    跟着小编一起来看一看吧!香油煎鸡蛋怎么做准备好两个鸡蛋。把鸡蛋打到碗里,加入适量的葱花搅拌均匀。锅内加入少许芝麻油烧热,油不需太多只要刷到锅面有油即可。把搅拌好的鸡蛋液下锅煎至定型。如果喜欢吃溏心鸡蛋,可以只煎一面不翻面。出锅装盘,制作完成。

  • 工装裤搭配什么上衣(3种搭配总有一种适合你)

    我们一起去了解并探讨一下这个问题吧!如果不想把衬衫穿出太干练呆板的感觉,搭配工装裤可以凸显出一种文艺感,显得随性又自然。工装裤搭配立领夹克,夹克本身和工装裤就是同一个风格的单品,有着挺括硬朗的版型。穿在身上不仅可以修饰身材,显得整个人也会更加精神一点,选择立领版型更能增加造型感。工装裤搭配黑T恤,对于与颜色不太敏感又不想太复杂。那么简单且经典百搭的黑色T恤搭配工装裤,可以让整个人更加清爽通透。