为什么只要包含头文件,就能调用api

Windows内核调试

为什么只要包含头文件,就能调用api


大饼 2009-09-06, 04:45 上午
我们平时调用系统api的时候,只要包含头文件就行了,比如windows.h,但是系统api是在dll中的呀 ,我们并没有加载这些dll呀,请各位老师指教

Re: 为什么只要包含头文件,就能调用api


格蠹老雷 2009-09-06, 11:05 上午

简单来说,是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。 

这个看似浅显的问题实际上非常好。代表着思维在进入一个更深的层次,开始思考“本来看似不值得”思考的问题,挖掘隐藏在简单表面下的更多道理。

Re: 为什么只要包含头文件,就能调用api


大饼 2009-09-06, 12:03 下午
多谢张老师指点

Powered by Community Server Powered by CnForums.Net