运行时获取DLL路径
我想从代码中得到一个dll的目录(或文件)路径。 (不是程序的.exe文件路径)
我已经尝试了一些我发现的方法:
GetCurrentDir
- 获取当前目录路径。
GetModuleFileName
- 获取可执行文件的路径。
那么我如何才能找出哪些dll代码在?
我正在寻找类似于C#的Assembly.GetExecutingAssembly
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
....
WCHAR DllPath[MAX_PATH] = {0};
GetModuleFileNameW((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));
我将使用GetModuleHandleEx
函数并获取DLL中的静态函数的句柄。 你可以在这里找到更多的信息。
之后,您可以使用GetModuleFileName
从刚获得的句柄中获取路径。 更多信息在这里。
一个完整的例子:
char path[MAX_PARAM];
HMODULE hm = NULL;
if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCSTR) &localFunc,
&hm))
{
int ret = GetLastError();
fprintf(stderr, "GetModuleHandle returned %dn", ret);
}
GetModuleFileNameA(hm, path, sizeof(path));
// path variable should now contain the full filepath to localFunc
GetModuleFileName()
可以在DLL代码中正常工作。 只要确保不要将第一个参数设置为NULL
,因为这将获得调用进程的文件名。 您需要改为指定DLL的实际模块实例。 您可以将它作为DLL的DllEntryPoint()
函数中的输入参数,只需将其保存到某个变量中,以备日后使用时使用。
下一篇: Providing path to externals assembly native dll dependecy