简单来说,是IDE和编译器/链接器暗中帮的忙。
首先,在使用IDE创建一个新的项目时,IDE就会根据程序类型自动把常用库文件的.lib文件加入到链接选项中。打开项目属性对话框的链接页,就可以看到IDE默认加入到链接选项中的.lib文件:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
前三个lib文件(kernel32.lib user32.lib gdi32.lib)和advapi32.lib 基本囊括了大多数API的链接信息。
链接器会根据.lib信息产生合适的导入表(IAT),在程序运行时,NTDLL中的Loader会遍历IAT把需要的DLL加载进来,这就是通常所谓的隐式加载DLL。
这个看似浅显的问题实际上非常好。代表着思维在进入一个更深的层次,开始思考“本来看似不值得”思考的问题,挖掘隐藏在简单表面下的更多道理。