MFH*_*MFH 2 c c++ loadlibrary dlopen
我需要从我自己的应用程序中调用导出的符号 - 因此我需要知道调用dlopen/ LoadLibrary打开"自己" 是否安全.
一个例子是:
LoadLibrary("test.exe");
Run Code Online (Sandbox Code Playgroud)
在一个叫做的程序中test.exe.
我测试了它似乎工作,但我不太确定它是否真的支持行为.
从这里的MSDN文档......
系统在所有已加载的模块上维护每个进程的引用计数.调用LoadLibrary会增加引用计数.调用FreeLibrary或FreeLibraryAndExitThread函数会减少引用计数.系统在其引用计数达到零或进程终止时(无论引用计数如何)卸载模块.
它会起作用,只需记住通过调用FreeLibrary来清理自己,如上所述.
你可能真正想要的是GetModuleHandle.
检索指定模块的模块句柄.该模块必须已由调用进程加载.
事实上,你想要做的甚至是一个特例.
lpModuleName [in,optional]
...
如果此参数为NULL,则GetModuleHandle返回用于创建调用进程(.exe文件)的文件的句柄.
所以,试试这个......
#include <stdio.h>
#include <windows.h>
__declspec(dllexport) void print(void) {
puts("OK");
}
main() {
HMODULE mod = GetModuleHandle(0);
FARPROC proc = GetProcAddress(mod, "print");
proc();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
......似乎有效:
C:\dev\scrap>gcc -oprint print.c
C:\dev\scrap>print
OK
Run Code Online (Sandbox Code Playgroud)
对于dlopen来说,它看起来非常相似.
如果filename是NULL指针,则返回的句柄用于主程序.当给予dlsym()时,此句柄会导致在主程序中搜索符号,然后搜索程序启动时加载的所有共享库,然后由dlopen()加载标记为RTLD_GLOBAL的所有共享库.