昨天,一位同事在处理某产品软件时,碰到此类状况:某控件自带的进度提示窗体上的TLabel背景不透明,而查看源码,实际上TransParent是为True的。
问题看起来很奇怪,因为同样控件在其它类产品软件,使用状况良好。
后来,我通过debug dcu跟踪VCL源码,发现:此软件在加载控件阶段,处理TLabel.Transparent相关设定(ControlStyle - [csOpaque])时,判断ThemeServices.ThemesEnabled为False;而其他软件则为True。
进一步查探,发现ThemeServices中的成员FNewComCtrls为False,代码如下:
FNewComCtrls := GetFileVersion(comctl32) >= ComCtlVersionIE6
很显然,GetFileVersion结果不同——也就是程序所加载的ComCtl32.dll版本不同导致。
搜索整个磁盘,ComCtl32.dll只在system32和winSxS文件夹下才有。程序如何会调用到不同版本的ComCtl32.dll?这里不得不提到windows xp引入的dll版本控制——side-by-side assembly。
如果程序在呼叫LoadLibrary时,只传入程序集(assembly)名称,没有指定