易语言 / 随手记

动态加载dll所需API(LoadLibraryA/GetProcAddress/FreeLibrary)

奶瓶 · 8月14日 · 2020年 · 38次已读

LoadLibraryA

Dll命令名:LoadLibraryA
指定的可执行模块映射到调用进程的地址空间
所处动态链接库的文件名:kernel32
在所处动态链接库中的命令名:LoadLibraryA
返回值类型:整数型
参数<1>的名称为“lpLibFileName”,类型为“文本型”。注明:一个空终止字符串名称可执行模块的指针(一个DLL或EXE文件。。)。指定的名称是模块的文件名不是存储在库模块的名字本身相关,通过在模块定义图书馆关键字指定(DEF文件。)。

GetProcAddress

Dll命令名:GetProcAddress
从指定的动态链接库中检索一个导出的函数或变量的地址
所处动态链接库的文件名:kernel32
在所处动态链接库中的命令名:GetProcAddress
返回值类型:整数型
参数<1>的名称为“模块句柄”,类型为“整数型”。注明:用LoadLibrary或getmodulehandle函数返回的句柄。
参数<2>的名称为“函数名称”,类型为“文本型”。注明:函数名称。

FreeLibrary

Dll命令名:FreeLibrary
释放指定的动态链接库,它们早先是用LoadLibrary API函数装载的,真 表示成功,假 表示失败。
所处动态链接库的文件名:kernel32.dll
在所处动态链接库中的命令名:FreeLibrary
返回值类型:逻辑型
参数<1>的名称为“hLibModule”,类型为“整数型”。注明:要释放的一个库句柄。

注意事项:

  1. GetProcAddress获取到的函数地址可用易语言的【调用子程序】来调用。
  2. FreeLibrary释放时如果dll有正在运行的代码或线程会等待他运行完毕后再释放,但如果是线程死循环将会导致释放失败(因为会一直等待)。
  3. 上面的问题可以在dll中声明一个释放dll的方法来退出线程循环。
0 条回应