delphi 解析Delphi中的LoadLibrary,GetProcAddress,FreeLibrary


本文整理自网络,侵删。

 
GetProcAddress(Hinstance,lpname)用来获取指定的动态连接库函数的地址 
Hinstance为由LoadLibrary返回的模块句柄,lpname为文件名/函数名,返回值,成功返回动态连接库的地址,失败返回NULL, 
FreeLibrary(Hinstance),Hinstance为由LoadLibrary返回的模块句柄,功能是:释放动态连接库! 
动 态引入方式就是使用Windows的两个API即LoadLibrary和GetProcAddress,前者用于获得DLL的句柄,后者用于获得DLL 中例程的地址,这种方式之所以被称为动态的,是因为它不需要在程序的开始处把要引入的例程全部列出,只要在调用前引入,并且LoadLibrary可以指 定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出错,最多是API调用失败,但不会导致程序终止,因此我 们应该在程序中监视DLL的返回值,根据返回值作出相应的处理。程序示例如下:  
Var LibHandel:Thandlel; 
LibHandle:=LoadLibrary(Pchar(DLLname)); 
以上首先声明一个DLL的句柄,然后用LoadLibrary获得DLL的句柄,其中DLLName是DLL的文件名,由于LoadLibrary是Windows的API,因此调用时要强制转换成Pchar类型。 
Var Getcount:Function(Index:integer):Integer;StdCall; 
@Getcount:=GetProcAddress(LibHandle,’’GetCount’’); 
以上声明了一个例程指针,指向一个函数,有一个Integer类型的参数,返回类型也是Integer,调用约定是StdCall方式,然后用GetProcAddress获得DLL中GetCount例程的地址。 
Var MyCount:Integer;  
MyCount:=GetCount(1); 
以上是调用DLL中例程GetCount的例子。 
DLL只能输出例程,虽然DLL中也含有变量(全局变量),但程序不能直接引入这些变量,只能通过接口例程间接地访问这些变量。DLL也不能直接访问调用DLL的程序中的变量。 
注意,不管那种方式,在编译期,编译器不检查DLL是否存在以及要引入的例程是否存在等问题,因此这类错误在编译期是检查不出来的。 
进 程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。如果成功,函数将指定的 DLL 映射到调用进程的地址空间 中并返回此 DLL 的句柄,该句柄可与用于显式链接的其他函数(如 GetProcAddress 和 FreeLibrary)一起使用。 
LoadLibrary 
LoadLibrary 尝 试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返 回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的 引用数。 
如果 DLL 有入口点函数,则操作系统在调用 LoadLibrary 的进程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。 
加 载扩展 DLL 的 MFC 应用程序应使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在调 用 LoadLibrary 之前处理线程同步。AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。 
如果出于某种原因 Windows 无法加载 DLL,进程可以尝试从错误恢复。例如,进程可通知用户所发生的错误,并让用户指定 DLL 的其他路径。 
安全说明 如果代码将在 Windows NT 4 或 Windows 2000 上运行,请务必要指定任何 DLL 的完整路径名。

相关阅读 >>

纯真ip数据库解析Delphi d10.1下正常使用

Delphi图像处理 -- 图像卷积

Delphi中ns和ms时间的获取方法

Delphi跨平台tcp库的封装

Delphi edit右键系统菜单加自定义菜单项

Delphi中将dbgrid中的内容输出到word中

Delphi 选择一张照片,让照片缩略图显示在图片控件中间

Delphi xe7 取得进程占用内存的两个函数

Delphiwindows 下编译 exe 文件时把一个外部 txt 文件编译到 exe 里面

Delphi 自动升级组件autoupgrader简单教程

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...