Windows API如何工作?

use*_*351 2 c winapi

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

Jim*_*hel 5

Windows API在安装Windows时安装的DLL中实现.这些DLL位于System目录中,其名称类似于User32.dll,Kernel32.dll等.

正如您所正确指出的那样,随编译器提供的Windows API头文件仅包含声明.当您的C程序调用其中一个函数(或在头文件中标识但未实际使用您的项目编译的任何其他函数)时,编译器会在生成的目标文件中放置一条记录,该记录实际上是"我需要调用一个叫做的函数GetWindowRect(或者你调用的函数名称)."

连接器是实际解析名称.如果你查看你的链接器选项,你会发现它链接了一些像User32.lib,Kernel32.lib等库.这些库包含的编译函数只是存根 - 代码导致相应的DLL被加载,然后调用DLL中的函数.

它比这更复杂,但这是一般的想法.综上所述:

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