【问题标题】:Get path where DLL resides获取DLL所在的路径
【发布时间】: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 提到的规则(还有更多,但不包括搜索所有连接的驱动器)。

标签: c++ dll


【解决方案1】:

使用原始名称(如 user32.dll 或 DLL 的名称)调用 GetModuleHandle()。获得句柄后,调用 GetModuleFileName() 以获取包含路径的完全限定名称。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多