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

Nov*_*lis 0 c++ windows dll boost visual-c++

假设我有一个名为MyDll.dll的dll

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

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

我使用了boost: FileSystem

string path = "";
boost::filesystem::path full_path( boost::filesystem::current_path() );
path =  full_path.string();
Run Code Online (Sandbox Code Playgroud)

但这给了我它的执行路径,即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;
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*lia 5

DllMain你的收到一个HINSTANCE参数; 这实际上HMODULE就是你的dll,你可以使用它GetModuleFileName来检索dll的完全限定路径.要获得包含它的目录,您只需删除文件名(您可以boost::filesystem使用shell路径功能以及仅使用a strrchr).


J. *_*eja 5

您可以使用GetModuleFileName来获取模块的完整路径。

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

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

  TCHAR path[_MAX_PATH+1]; 
  GetModuleFileName(GetModuleHandle(_T("MyDll.dll")), path, sizeof(path)/sizeof(path[0])); 
Run Code Online (Sandbox Code Playgroud)


Emi*_*dın 5

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

char path[2048];
GetModuleFileNameA(NULL, path, 2048);
cout << path;
Run Code Online (Sandbox Code Playgroud)

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

  • 将 NULL 传递给 `GetModuleFileName()` 将返回可执行文件的路径。您需要传递DLL的hInstance来获取DLL的路径。此外,转换为 ANSI 也无济于事。您需要实际将字符串转换为 ANSI(可能使用 MultiByteToWideChar() 或 ATL 转换例程)。或者,您可以将其发送到“std::wcout”。 (4认同)