繁体   English   中英

Windows API如何工作?

[英]How does Windows API work?

似乎我们可以自由地通过包含所需的头文件来自由使用Windows API。 但是,鉴于头文件没有函数定义而是声明,因此我无法理解这一点,因为缺少实现细节,应该将其视为错误。 编译器以什么方式定位实现细节并将其映射到内存中?

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中的函数。

它的工作方式与任何其他库(例如C stdlib -您的程序仅需要“知道”函数的原型(并因此知道底层的符号名称)。 编译后出现链接-就是在丢失的符号(函数定义)与正确的库“链接”时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM