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

时间:2011-12-22 14:58:03

标签: c++ windows visual-c++ dll boost

假设我有一个名为 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();

但是这给了我执行路径,它是 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 ....

4 个答案:

答案 0 :(得分:5)

DllMain中,您收到了HINSTANCE个参数;这实际上是您的dll的HMODULE,您可以使用GetModuleFileName来检索您的dll的完全限定路径。要获得包含它的目录,您只需删除文件名(您可以使用boost::filesystem,使用shell路径函数以及strrchr)来执行此操作。

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:3)

TCHAR s[MAX_PATH+1];
GetModuleFileName(hInstance, s, _countof(s));

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

答案 3 :(得分:3)

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

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

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