很多第一次使用外壳通用控件 (Shell common controls) 的新手碰到的问题之一是:他们经常忘记调用 InitCommonControls 。 但是如果你有机会查看这个函数的反汇编代码,则你会发现:这个函数实际上不做任何事情,就像另外一个函数 FlushInstructionCache 一样。
既然这个函数什么都不做,那我们为什么要调用它呢?这不是多此一举吗?
就像 FlushInstructionCache,重要的不是它会执行什么操作,而是你调用过它。此话怎讲?
回想一下,仅在依赖项中列出 lib 文件实际上并不会导致程序绑定到相应的 DLL。你必须在该 DLL 中调用一个函数,才能为该 DLL 提供导入条目。而 InitCommonControls 就是这个函数。
如果没有 InitCommonControls 函数,想要使用外壳通用控件库的程序将在其导入表中没有对 COMCTL32.DLL 的引用。这意味着当程序加载时,不会加载 COMCTL32.DLL,因此不会初始化。这意味着它不会注册其窗口类。这意味着对 CreateWindow 函数的调用失败,因为窗口类尚未注册。
这就是为什么你必须调用一个什么都不做的函数。这完全是为了你好。
(当然,还有新的 InitCommonControlsEx 函数,它允许你指定要注册的类。加载 COMCTL32.DLL 时,仅注册经典的 Windows 95 类。对于其他所有内容,你必须明确要求要注册它们。)
总结
嗯,这个理由确实 make sense。
我个人认为:要有鸡蛋(Shell common controls),就得先有鸡(InitCommonControls)。
亲爱的猿友:勿杠,杠就是你赢。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《If InitCommonControls doesn’t do anything, why do you have to call it?》