我们为什么需要调用InitCommonControls?
创始人
2024-03-16 20:43:06
0

很多第一次使用外壳通用控件 (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?》

 

相关内容

热门资讯

中国推进生态环境损害赔偿制度改... 中新社北京12月26日电 (记者 阮煜琳)今年是推进生态环境损害赔偿制度改革十周年。中国生态环境部新...
省内首家!镇江市银行业人民调解... 现场 扬子晚报网12月26日讯(通讯员 余建军 钱璐 记者 万凌云 姜天圣)12月25日上午,镇江市...
爱泼斯坦案涂黑文件仅需复制粘贴... 近日,美国司法部网站公布了爱泼斯坦案文件,其中大量文件内容被涂黑。然而,有消息指出,一些被涂黑的文件...
原创 《... 12月26日,电视剧《剥茧》官宣定档,12月29日起,优酷上线开播。这部电视剧由罗云熙、刘雅瑟等演员...
富安娜理财纠纷背后:中信证券拿... 历时三年,家纺龙头富安娜(002327.SZ)与中信证券(600030.SH)的理财委托纠纷,终于有...
保剑锋方发布律师声明!否认“出... 搜狐娱乐讯 26日,保剑锋转发了工作室发布的律师声明,否认“出轨”“妈宝男”等传闻:“近期,部分网络...
带走82岁南博原院长徐湖平 法... 问道者 | 李 百 领导了南京博物院23年的徐湖平终于在退休17年后被带走了,这个声称“三不原则”的...
沪深联手打造首届跨境商事调解大... 近日,首届“和・界”跨境商事调解大赛决赛在上海北外滩圆满收官。作为国内首个聚焦跨境商事调解领域的创新...
博世科(300422)披露累计... 截至2025年12月26日收盘,博世科(300422)报收于4.63元,较前一交易日下跌1.28%,...
外交部:日本从网络防御政策转向... 12月26日,外交部发言人林剑表示,日本大幅扩建网军,新出台的网络法案和战略名为“主动防御”,实则为...