如何查找加载程序 DLL 的路径
How to find path of loader DLL?
我想读取我的DLL的加载器DLL的二进制文件。但是有一个exe和2个DLL,我使用第一个(X DLL)来加载第二个(Y DLL)。当我通过 exe 从 X DLL 加载 Y dll 时,GetModuleFileNameA(NULL, szEXEPath, 2048);
函数只给我 exe 路径。我想获取 X DLL 路径。我可以使用GetModuleFileNameA("X DLL Name", szEXEPath, 2048);
但我不知道X DLL的名称。
当我阅读 MSDN 帮助以获取GetModuleFileName
时,我在下面看到了有关函数的第一个参数的描述。
我正在请求其路径的已加载模块的句柄。如果这个 参数为
NULL
,GetModuleFileName
检索 当前进程的可执行文件。
不想获取可执行文件的路径,我只想确定哪个 DLL 加载我当前的 DLL。有没有办法找到加载程序路径 DLL?
若要获取"父"dll 的名称,可以创建一个函数作为需要调用的 API 的一部分,该函数传入父 dll 的HMODULE
句柄。
将下面的 get_current_module_handle()
函数创建为inline
并将其包装成某种宏将简化客户端代码的过程。
//... control header
inline HMODULE get_current_module_handle() {/*...*/}
#define PARENT_MODULE get_current_module_handle()
void SetControlParent(HMODULE parent);
//... client code to initialise the "parent"
SetControlParent(PARENT_MODULE);
若要获取 dll 名称(在子项中),可以使用 GetModuleFileNameEx
和 GetModuleHandleEx
函数的组合。诀窍在于GetModuleHandleEx
函数,它允许通过指向函数(即 dll 中的函数)的指针获取模块句柄;特别是旗帜的使用GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
.
以下是一些应该可以解决问题的代码片段;
HMODULE get_current_module_handle()
{
HMODULE moduleHandle = NULL;
if (!::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCTSTR)get_current_module_handle, &moduleHandle))
throw std::runtime_error("unable to get the module handle");
return moduleHandle;
}
std::basic_string<TCHAR> get_module_name(HMODULE moduleHandle)
{
std::vector<TCHAR> filename(2048, _T('?')); // allocate some space
DWORD filenameLength = ::GetModuleFileNameEx(::GetCurrentProcess(), moduleHandle, &filename.front(), filename.size());
if (filenameLength && filenameLength < filename.size()) {
return std::basic_string<TCHAR>(&filename.front(), filenameLength);
}
return std::basic_string<TCHAR>(_T("unknown"));
}
//...
std::basic_string<TCHAR> dllname = get_module_name(get_current_module_handle()); // current dll
std::basic_string<TCHAR> parentdllname = get_module_name(parentHModule); // for "parent" dll
请注意,上面复制了一个简化版本(基于 OP 中的 2048 长度)。还介绍了一个递归实现来考虑长文件名(检查编辑)。
dllname
将是模块的完全限定路径,因此要获取基本文件名,例如_splitpath
.或者,您可以直接在上面的代码中使用GetModuleBaseName
。
std::basic_string<TCHAR> get_module_name(HMODULE moduleHandle)
{
std::vector<TCHAR> filename(MAX_PATH, _T('?')); // MAX_PATH is 260
DWORD filenameLength = ::GetModuleBaseName(::GetCurrentProcess(), moduleHandle, &filename.front(), filename.size());
if (filenameLength && filenameLength < filename.size()) {
return std::basic_string<TCHAR>(&filename.front(), filenameLength);
}
return std::basic_string<TCHAR>(_T("unknown"));
}
您可以使用 dllpath 函数定义自己的路径,并将其作为参数传递给链接的路径。
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 程序无法启动,因为缺少 libmpc-3.dll
- C# DLL 从C++应用程序调用 SOAP Web 服务
- 将 c++ 生成器应用程序与外部 dll 结合使用
- DLL Made with CMake 使程序崩溃
- WinDeployqt 不会为调试应用程序部署 Qwindowsd.dll
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 调试 ASP MVC 应用程序中使用的C++ DLL
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 如何使特定程序仅从安装的路径运行以避免DLL劫持
- Qt应用程序找不到第三方DLL并崩溃
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- 名为DLL的C++windows服务程序工作不正常
- visual studio 2010无法启动程序.dll
- 如何查找加载程序 DLL 的路径
- 我可以从程序(DLL)中调用的c++或C编译器
- 凭据提供程序 DLL 在使用调试模式生成时无法正确加载