在Windows上,几个参数传递给DllMain构造函数:

BOOL WINAPI DllMain(
  __in  HINSTANCE hinstDLL,
  __in  DWORD fdwReason,
  __in  LPVOID lpvReserved
);

从hinstDLL,我可以使用GetModuleFileName()获得DLL本身的完全限定文件名:
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;

在上面的示例中,str现在包含刚加载的DLL的全名,例如C:\Windows\System32\MyFile.dll。

在Linux上,没有参数传递给共享对象构造函数:
void `__attribute__` ((constructor)) on_load(void);

在这种情况下,如何获取DLL的全名?如果您的解决方案也可在Mac上使用,则可额外获得信用。 :-)

最佳答案

我认为dladdr函数可能会满足您的要求。从手册页:



因此,您只给它一个函数指针(如构造函数本身的地址),它将给您文件名和其他信息。这是一些示例代码:

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>

__attribute__((constructor))
void on_load(void) {
    Dl_info dl_info;
    dladdr(on_load, &dl_info);
    fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}

编辑:看起来这个函数也存在于OS X上,具有相同的语义。

07-28 01:26
查看更多