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 ....
在DllMain你的收到一个HINSTANCE参数; 这实际上HMODULE就是你的dll,你可以使用它GetModuleFileName来检索dll的完全限定路径.要获得包含它的目录,您只需删除文件名(您可以boost::filesystem使用shell路径功能以及仅使用a strrchr).
您可以使用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)
Unicode您的问题是尝试在控制台输出窗口上查看字符串Ansi。如果你真的想看到结果,你需要将你的字符串转换为Ansi(当然会有一些损失)或者你可以直接使用;
char path[2048];
GetModuleFileNameA(NULL, path, 2048);
cout << path;
Run Code Online (Sandbox Code Playgroud)
如果您想使用Unicode,请使用TCHARand GetModuleFileNameW(或者GetModuleFileName因为您的应用程序处于 unicode 模式),但不要尝试输出到控制台窗口而不转换为Ansi.
| 归档时间: |
|
| 查看次数: |
12314 次 |
| 最近记录: |