Windows API 是如何工作的?

How does Windows API work?

看来我们可以自由使用 Windows API 只需包含所需的头文件即可。但是,我无法让自己理解这是怎么可能的,因为头文件没有函数定义,只有声明,这应该被认为是一个错误,因为它缺少实现细节。编译器以什么方式定位实现细节并将其映射到内存中?

它的工作原理与任何其他库相同,例如 C stdlib - 您的程序只需要 'know' 函数的原型(以及底层符号名称)。编译后进行链接 - 那是缺少的符号(函数定义)得到 'linked' 正确库的时候。

Windows API 在安装 Windows 时安装的 DLL 中实现。这些 DLL 位于系统目录中,名称如 User32.dll、Kernel32.dll 等

正如您正确指出的那样,编译器随附的 Windows API 头文件仅包含声明。当您的 C 程序调用其中一个函数(或在头文件中标识但实际上未与您的项目一起编译的任何其他函数)时,编译器会在生成的目标文件中放置一条记录,实际上是 "I need to call a function called GetWindowRect (or whatever the name of the function you called)."

链接器 是真正解析名称的。如果您查看链接器选项,您会发现它正在链接一些库,例如 User32.lib、Kernel32.lib 等。这些库包含的编译函数只不过是存根——导致相应的代码加载DLL,然后调用DLL中的函数。

它比这复杂一点,但这是一般的想法。总结:

  1. 您包含 Windows API 头文件。
  2. 您的代码调用了这些头文件中声明的一个或多个 Windows API 函数。
  3. 编译器为链接器做注释以解析那些 API 函数调用。
  4. 链接器通过查找您在链接器命令行上指定的库中的存根函数来解析调用。
  5. 在运行时,对其中一个函数的调用会导致加载相应的 DLL,然后控制转移到 DLL 中的函数。