我想从其代码中获取 dll 的 目录(或文件)路径。 (不是程序的 .exe 文件路径)
我尝试了一些我发现的方法:
GetCurrentDir
- 获取当前目录路径。
GetModuleFileName
- 获取可执行文件的路径。
那么我怎样才能找出代码在哪个dll中呢?
我正在寻找类似于 C# 的东西 Assembly.GetExecutingAssembly
原文由 Yochai Timmer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想从其代码中获取 dll 的 目录(或文件)路径。 (不是程序的 .exe 文件路径)
我尝试了一些我发现的方法:
GetCurrentDir
- 获取当前目录路径。
GetModuleFileName
- 获取可执行文件的路径。
那么我怎样才能找出代码在哪个dll中呢?
我正在寻找类似于 C# 的东西 Assembly.GetExecutingAssembly
原文由 Yochai Timmer 发布,翻译遵循 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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
您可以使用
GetModuleHandleEx
函数并获取 DLL 中静态函数的句柄。您将 在此处 找到更多信息。之后,您可以使用
GetModuleFileName
从刚刚获得的句柄中获取路径。有关该电话的更多信息,请 点击此处。一个完整的例子: