如何在C++中获取同一 dll 内的 dll 位置路径

How can I get dll location path inside the same dll in C++?

本文关键字:dll 内的 位置 路径 获取 C++      更新时间:2023-10-16

假设我有一个dll,叫做MyDll.dll

  • 它在 d:\MyWorks\MyDll.dll [它是 directshow dll]

  • 我想从 MyDll 代码中获取其位置的路径。

我为此使用了 boost:文件系统

string path = "";
boost::filesystem::path full_path( boost::filesystem::current_path() );
path =  full_path.string();

但这给了我它的执行路径,即 C:\Windows\system32,而不是它的位置路径 d:\MyWorks\MyDll.dll

如何在同一个 dll 中获取 dll 的位置?

更新:通过获取模块:

TCHAR path[2048];
  GetModuleFileName( NULL, path, 2048 );
  ostringstream file;
  file << path ;
  string const pathString =file.str();
  cout << "Path: " << pathString << endl;

给我一个十六进制的字符串:0049EA95....

DllMain中,您会收到一个 HINSTANCE 参数;该参数实际上是 DLL 的HMODULE,您可以将其与 GetModuleFileName 一起使用以检索 DLL 的完全限定路径。要仅获取包含它的目录,您只需删除文件名(您可以使用 boost::filesystem 、shell 路径函数以及 strrchr 来执行此操作(。

您的问题是尝试在Ansi控制台输出窗口中查看Unicode字符串。如果你真的想看到结果,你需要将你的字符串投射到Ansi(当然会有一些损失(,或者你可以直接使用;

char path[2048];
GetModuleFileNameA(NULL, path, 2048);
cout << path;

如果要使用 Unicode ,请使用 TCHARGetModuleFileNameW(或GetModuleFileName,因为您的应用程序处于 unicode 模式(,但不要尝试输出到控制台窗口而不强制转换为 Ansi

您可以使用GetModule文件名来获取模块的完整路径。

第一个参数是所需模块的句柄。 如果此参数为 NULL,则 GetModule文件名将检索当前进程的可执行文件的路径。

如果你想要其他模块的路径,你可以使用 GetModuleHandle 来获取句柄。例如:

  TCHAR path[_MAX_PATH+1]; 
  GetModuleFileName(GetModuleHandle(_T("MyDll.dll")), path, sizeof(path)/sizeof(path[0])); 
TCHAR s[MAX_PATH+1];
GetModuleFileName(hInstance, s, _countof(s));

其中hInstance是 DllMain 的参数。尽管名称如此,但它返回完整路径。