zoukankan      html  css  js  c++  java
  • 解析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 的完整路径名。

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
    HTTP协议详解(真的很经典)
    C# 读取EXCEL文件的三种经典方法
    第一范式,第二范式,第三范式
    数据库设计三大范式
    SQL 第一范式、第二范式、第三范式、BCNF
    日期选择器:jquery datepicker的使用
    copy sqlserver中DATE类型的数据转化 CONVERT
    HDU2033 人见人爱A+B 分类: ACM 2015-06-21 23:05 13人阅读 评论(0) 收藏
    SCU 4440 分类: ACM 2015-06-20 23:58 16人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/jijm123/p/14259221.html
Copyright © 2011-2022 走看看