Get DLL path at runtime
You can use the GetModuleHandleEx
function and get the handle to a static function in your DLL. You'll find more information here.
After that you can use GetModuleFileName
to get the path from the handle you just obtained. More information on that call is here.
A complete example:
char path[MAX_PATH];
HMODULE hm = NULL;
if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCSTR) &functionInThisDll, &hm) == 0)
{
int ret = GetLastError();
fprintf(stderr, "GetModuleHandle failed, error = %d\n", ret);
// Return or however you want to handle an error.
}
if (GetModuleFileName(hm, path, sizeof(path)) == 0)
{
int ret = GetLastError();
fprintf(stderr, "GetModuleFileName failed, error = %d\n", ret);
// Return or however you want to handle an error.
}
// The path variable should now contain the full filepath for this DLL.
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
....
TCHAR DllPath[MAX_PATH] = {0};
GetModuleFileName((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));
GetModuleFileName()
works fine from inside the DLL's codes. Just be sure NOT to set the first parameter to NULL
, as that will get the filename of the calling process. You need to specify the DLL's actual module instance instead. You get that as an input parameter in the DLL's DllEntryPoint()
function, just save it to a variable somewhere for later use when needed.