真奇怪,我的windows 7在windows\system32和windows\syswow64下面的2个comctl32.dll都是
5.82版本,我查找全盘在windows\winsxs\....的子目录下面发现了6.1版本的comctl32.dll有
amd64版和x86两个版本,分别有1.6MB和1.9MB多字节。我把这2个版本分别拷贝到
windows\system32和windows\syswow64子目录下面,替换掉5.82的老版本。怪事出来了。
我的syswow64下面的已经替换了,文件长度是1.9M多了,版本信息也显示6.1版,而system32
下面的comctl32.dll明明已经替换了,文件长度是1.6M多,可是版本信息仍然显示5.82版,怪事啊
,明明是1.6M多的6.1版本,版本信息却死命的仍然显示5.82版。这不是最重要的。
我要运行的程序有一个API是TASKDIALOG,这个API要6.0版本以上的comctl32.dll支持,5.8的不支持。
我现在明明已经替换了5.8为6.1版本了,可显示文件属性仍然是5.8版本,文件长度明明是1.6M是
高版本了。我还用ida分析了新版的comctl32.dll,里面显示了有TASKDIALOG的函数,而分析5.8版本
的时候是没有TASKDIALOG函数的。我就奇怪了,明明6.1版本的1.6M多字节长的comctl32.dll,却仍然
显示5.8版本,而且仍然不支持TASKDIALOG函数,我不禁想砸了电脑,这是怎么搞的?

解决方案 »

  1.   

    WinSXS的功能就是处理同名的不同版本dll,根据你加载时指定的版本进行。一般来说现在的MFC、.Net程序默认链接的都是6版本的,你链接的是那个版本,加载时就会加载相应的版本。这种设定是为了兼容那些只有VB6之类的才用5版本的。所以你根本不应该操心这个东西。
    你这样复制回去反而会破坏系统的结构。用SFC /SCANNOW修复系统文件吧。
      

  2.   

    那么如何在编译,连接,和运行连接好的exe文件的时候,指定版本6的comctl32.dll运行呢?
    我在编译VC的时候,显示“连接错误,未找到_imp_taskdialog”,这个表明,编译还是通过了,
    只是连接未找到连接库。而我用汇编语言测试了一下调用taskdialog,汇编通过了,然后我指定了
    comctl32.lib进行连接,连接也通过了,生成了.exe文件,然后运行.exe的时候,出现错误:“无法定位序数344于动态链接COMCTL32.dll上”
    所以,如何指定使用版本6的comctl32.dll呢?