dlopen/LoadLibrary在同一个应用程序上

MFH*_*MFH 2 c c++ loadlibrary dlopen

我需要从我自己的应用程序中调用导出的符号 - 因此我需要知道调用dlopen/ LoadLibrary打开"自己" 是否安全.

一个例子是:

LoadLibrary("test.exe");
Run Code Online (Sandbox Code Playgroud)

在一个叫做的程序中test.exe.

我测试了它似乎工作,但我不太确定它是否真的支持行为.

old*_*inb 5

这里的MSDN文档......

系统在所有已加载的模块上维护每个进程的引用计数.调用LoadLibrary会增加引用计数.调用FreeLibraryFreeLibraryAndExitThread函数会减少引用计数.系统在其引用计数达到零或进程终止时(无论引用计数如何)卸载模块.

它会起作用,只需记住通过调用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的所有共享库.