【问题标题】:How does the compiler knows the function which is imported by dll?编译器如何知道 dll 导入的函数?
【发布时间】:2017-07-27 12:45:24
【问题描述】:

我对 C++ 中的头文件有疑问。 ntdll.dll 中的函数无法正常调用。 (当我们包含它的头文件时我们可以调用函数,但是 nt API 的 总是由 GetProcAddress(GetModuleHandle("ntdll.dll"), "FuncName") 调用。

于是我搜索了nt函数,有人说官方没有关于ntdll.dll的头文件,所以我必须使用GetProcAddress来调用它们。

什么是头文件? 编译器如何知道链接到头文件的dll函数? (对于 EX,如果我们使用 MessageBox() ,那么编译器知道它在 kernel32.dll 中) 也许我猜..头文件中有dll导入上下文(语法), 例如... windows.h 具有导入“kernel32.dll”上下文,所以编译器 可以知道。是真的吗?

【问题讨论】:

  • 问题是 - 编译器不知道这一点。 .dll 的全部性质是,它们是动态 链接库。您调用的过程的地址在运行时解析。
  • 您要么需要声明(通常在 API 标头中)和 lib 文件,要么需要使用 GetProcAddress 并从文档中“了解”您需要什么。 lib 文件知道函数所在的 DLL,而不是头文件。
  • 非常感谢@AlgirdasPreidžius
  • @crashmstr 非常感谢~

标签: c++ dll compiler-construction


【解决方案1】:

您也需要.lib 文件。它包含函数地址。 dll .h 不需要 .lib 的文件只能尝试找到这些地址自我声明(就像你在谈论的那样)

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多