【问题标题】:Whats the correct way to read a file in a dynamic link library [duplicate]在动态链接库中读取文件的正确方法是什么[重复]
【发布时间】:2021-10-10 17:42:53
【问题描述】:

我正在编译一个 c++ dll(以及 Linux 上的一个共享对象)。 dll 代码从 dll 本身所在的当前目录(与 dll 相同的目录)中的二进制文件中读取数据。用户可以将此 dll 连同二进制文件复制到任何位置。

从运行在同一个 DLL 中的代码获取 DLL 的绝对路径的 c++ 函数/API 是什么?

恐怕“.\”将与我的 dll 稍后将链接到的第 3 方可执行文件(而不是 dll)相关。这就是我试图在运行时找出 dll 路径的原因。这是正确的方法吗?我在问,因为我只看到了从编译时解析的路径读取的代码。

【问题讨论】:

  • 当您说“文件相对于 DLL 的绝对路径”时,我认为您的意思只是“文件的绝对路径”。我这样说是因为“文件相对于 DLL 的路径”定义为 .

标签: c++ visual-studio dll g++ shared-libraries


【解决方案1】:

在 Windows 上,DLL 的模块句柄被传递给DllMain

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    ...

然后您可以将该句柄传递给 GetModuleFileName 以获取 DLL 的完整路径名:

TCHAR filename [MAX_PATH];
GetModuleFileName (hinstDLL, filename, MAX_PATH);

然后您可以去掉文件名部分,留下包含您的 DLL 的目录名称(供读者练习)。

我不知道在 Linux 下有什么方法可以做到这一点,但也许其他人可以提供答案。

【讨论】:

  • 是的,正确的。但是文件路径可以长于MAX_PATH(最多MAXSHORT 字符),而不是hinstDLL,如果使用link.exe 构建,我们可以使用&__ImageBase
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 2015-08-08
相关资源
最近更新 更多