【发布时间】:2021-10-28 02:30:37
【问题描述】:
我找到了Get DLL path at runtime,但我不确定 localFunc 变量应该使用什么。我尝试了 DLL 的文件名,我尝试了 null 和其他一些东西,但返回的状态始终是“找不到文件”。 来自 MSDN:
lpModuleName [输入,可选] 加载模块的名称(.dll 或 .exe 文件),或模块中的地址(如果 dwFlags 为 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)。
所以我假设它们只是指普通文件名,例如“MyControl.dll”,而不是文件路径,因为我不知道路径。 编辑:添加实际代码:
char localFunc[MAX_PATH]
sprintf_s(localFunc, 52, "MyActiveXComponent.dll");
if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR) &localFunc, &hm))
{
int ret = GetLastError();
OutFile << L"GetModuleHandle returned " << ret << std::endl;
} else {
GetModuleFileNameA(hm, path, sizeof(path));
OutFile << L"Path of dll is:" << path << L"<" << std::endl;
}
这就是我最终得到的结果(双向执行)
LPCWSTR anotherFunc = L"MyActiveXComponents.dll";
HMODULE hm2 = GetModuleHandle(anotherFunc); // get the handle to the module
LPWSTR anotherPath = new WCHAR[MAX_PATH];
GetModuleFileName(hm2, anotherPath, MAX_PATH); // get the full path
OutFile << L"Path of dll is:" << anotherPath << L"<" << std::endl;
这是另一种方式。
char path[MAX_PATH];
HMODULE hm = NULL;
char localFunc[MAX_PATH] = {"MyActiveXComponents.dll"};
if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, LPCSTR) &localFunc, &hm))
{
int ret = GetLastError();
OutFile << L"GetModuleHandle returned " << ret << std::endl;
} else {
GetModuleFileNameA(hm, path, sizeof(path));
OutFile << L"Path of dll is:" << path << L"<" << std::endl;
}
谢谢。我确定这是一个简单的问题。
【问题讨论】:
-
如果 DLL 与可执行文件位于同一路径中,则可执行文件应该能够在没有完整路径的情况下找到它。否则,除非已知 DLL 是系统范围的(除非您使用 Windows DLL,否则可能不会),您的应用程序将需要完整路径或相对路径才能找到它。
-
因为它说“或模块中的地址”让我相信它可以是模块中任何函数的地址。所以make void Foo() { } 然后传递&Foo,并在dwFlags参数中加入GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS。
-
@DavidPeterson 所以我需要知道 DLL 的路径才能调用告诉我 DLL 路径的函数?看起来有点奇怪,所以它可能只适用于 Windows DLL 而不是用户创建的 DLL。
-
您是要获取您创建的 DLL 的路径,还是第 3 方 DLL 的路径?
-
您不需要确切知道 DLL 的位置来加载它或解析它的路径,只要该位置可以通过遵循 dynamic library search order 来解析,其中包括 David 提到的规则(还有更多,但不包括搜索所有连接的驱动器)。