【问题标题】:How to link a DLL for LoadLibrary() use (in C++ on Windows ) and do import of variables from the calling exe如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变量
【发布时间】:2019-03-03 19:33:28
【问题描述】:

在 Windows 上,我有一个程序可执行文件,它是通过 Windows 挂钩进行 DLL 注入的目标。该钩子通过强制执行 LoadLibrary() 将我的 DLL 注入目标的程序空间。我想将特定变量从 exe 导出到 DLL,以便 DLL 可以读取该变量的内容。

由于这是动态链接,因此链接器不会将 exe 和 DLL 链接在一起。我无法构建 DLL,因为我在尝试从 exe 导入的变量上收到链接器错误 2001 - unresolved external - 。我尝试在 DLL 中使用它: extern "C" __declspec(dllimport) EGL_UINT8 *ssFrameDataBlock[];

但这并不能解决链接错误。显然我错过了一些步骤。如何从 exe 导出符号并将其导入 DLL 以进行动态链接?导出和导入每一侧的正确语法是什么?

【问题讨论】:

  • 你应该在你的DLL中定义一个SetFramePtr作为例子,然后从你的应用程序中调用它,以便将共享指针传递给你的DLL。
  • 是的,如果可以的话,我会这样做 - 让 .exe 通过函数调用将共享变量的地址传递给 DLL。

标签: c++ windows dll dynamic-linking


【解决方案1】:

你还记得用 __declspec(dllexport) 修饰可执行文件的变量定义吗?然后,您需要提供 exe 的 .lib 文件作为 DLL 构建的一部分。

如果您没有导出至少一个符号(无论是通过 dllexport,还是 def 文件或命令行中的 EXPORTS 语句),则不会生成 .lib 文件。

如果您无法为 DLL 构建提供 .lib,您也可以在 DLL 代码中使用 GetProcAddress()(尽管它可以获取任何导出的地址,而不仅仅是函数)。

【讨论】:

  • 我认为 GetProcAddress() 方法是我所需要的。许多目标可执行文件将包括我正在处理的 src/obj。我要 dllexport 的变量的确切名称将始终相同。而且我不想每次另一个 exe 想要与我的 DLL 共享该变量时都构建 DLL。所以从这个意义上说,DLL 需要是“通用的”。我假设通过构建一个 exe 生成的特定 DLL 导入库不会普遍工作。由于这是一个钩子 DLL 注入方案,因此 exe 不会显式调用 LoadLibrary()。我正在努力寻找如何做到这一点的示例代码。
猜你喜欢
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多