假设我有一个名为 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 ....
答案 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
,请使用TCHAR
和GetModuleFileNameW
(或GetModuleFileName
,因为您的应用程序处于unicode模式),但不要尝试输出到控制台窗口没有强制转换为Ansi
。