在运行时获取 DLL 路径

新手上路,请多包涵

我想从其代码中获取 dll 的 目录(或文件)路径。 (不是程序的 .exe 文件路径)

我尝试了一些我发现的方法:

GetCurrentDir - 获取当前目录路径。

GetModuleFileName - 获取可执行文件的路径。

那么我怎样才能找出代码在哪个dll中呢?

我正在寻找类似于 C# 的东西 Assembly.GetExecutingAssembly

原文由 Yochai Timmer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

您可以使用 GetModuleHandleEx 函数并获取 DLL 中静态函数的句柄。您将 在此处 找到更多信息。

之后,您可以使用 GetModuleFileName 从刚刚获得的句柄中获取路径。有关该电话的更多信息,请 点击此处

一个完整的例子:

 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.

原文由 mkaes 发布,翻译遵循 CC BY-SA 4.0 许可协议

我(就我而言)正在模仿那些揭示了简单的 DllMain 方法的人。工作是找出在 dll 中运行的当前线程的机器位数是多少。绝对确定我还想要运行 dll 和 exe 的名称。调用者的名称由 NULL 参数找到:

char exePat[MAX_PATH] = { 0 }; GetModuleFileName(NULL, exePat, MAX_PATH);

使用 DllMain 的 hModule 是查找 dll 名称和机器位数的最完整和最可靠的方法。找到了代码,因此只需要获取“机器”模块。这也是出于调试目的而提出名称的部分。

 BOOL APIENTRY DllMain(HMODULE hModule, DWORD  reason,LPVOID lpReserved ) {

     char  path[MAX_PATH] = { 0 };
     GetModuleFileNameA(hModule, path, MAX_PATH);
     PIMAGE_DOS_HEADER startPoint = (PIMAGE_DOS_HEADER)hModule;
     PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)startPoint + startPoint->e_lfanew);
     PIMAGE_FILE_HEADER fileHeader = &pNtHeaders->FileHeader;
     short machine = fileHeader->Machine;
     ////0x8664 is 64bit  0x14c is 32bit.
     int stop = 0;
     return TRUE;
 }

原文由 Tonecops 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题