【问题标题】:How can I get dll location path inside the same dll in C++?如何在 C++ 中的同一个 dll 中获取 dll 位置路径?
【发布时间】:2012-01-26 04:46:32
【问题描述】:

假设我有一个名为 MyDll.dll

的 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....

【问题讨论】:

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


【解决方案1】:

在您的DllMain 中,您会收到一个HINSTANCE 参数;这实际上是您的 dll 的 HMODULE,您可以使用它与 GetModuleFileName 检索您的 dll 的完全限定路径。要仅获取包含它的目录,您只需删除文件名(您可以使用 boost::filesystem、shell 路径函数以及 strrchr 来做到这一点)。

【讨论】:

  • 我更喜欢 boost...但是我无法获取它的位置...它给了我执行路径...如何在 boost 中做到这一点?有代码示例吗?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    如果您想使用Unicode,请使用TCHARGetModuleFileNameW(或GetModuleFileName,因为您的应用程序处于Unicode 模式),但不要尝试在不转换为Ansi 的情况下输出到控制台窗口。

    【讨论】:

    • 将 NULL 传递给 GetModuleFileName() 将返回可执行文件的路径。您需要通过 DLL 的 hInstance 来获取 DLL 的路径。此外,转换为 ANSI 也无济于事。您需要将字符串实际转换为 ANSI(可能使用 MultiByteToWideChar() 或 ATL 转换例程)。或者,您可以将其发送至std::wcout
    【解决方案4】:
    TCHAR s[MAX_PATH+1];
    GetModuleFileName(hInstance, s, _countof(s));
    

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

    【讨论】:

    • 我想补充一点...如果您的 DllMain 函数定义如下所示:BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID) 那么您将在此特定示例中引用变量 hInst。根据这个答案,检查作为HINSTANCE 传入的参数的名称并使用它:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多