很多第一次使用外壳通用控件 (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?》
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧