问题说明:
1、我所使用的一个程序是用VB6开发的,该程序主要作用是连接SQL Server并进行各类表格操作;程序在Windows XP、2003系统上使用正常;
2、最近把操作系统更换为Windows Server 2008 R2 SP1(内核与Windows 7 x64 SP1类似),安装此程序后,可以打开,界面显示正常,但是执行查询等操作时就会报错,主要是报MSADODC.OCX控件注册的问题,解决了这个问题之后,又会报MSDatGrd.ocx的错误;
3、为了省事,我找了一个网友打包的常用ocx安装包,直接安装上了,这样程序工作基本正常了,但是出现一个新问题:程序的工具栏上原先可以正常显示的图标,现在均无法显示了;
如下图所示:上图为正常显示的程序界面,下图为无法显示按钮图标的界面
补充说明:
1、以前在Windows Server 2008 R2上(非SP1),安装此程序,运行也会报错,主要是datagrid不能初始化数据绑定等一系列错误,安装上述控件包,即解决问题,但是使用了一段时间之后(大致是几个月),就出现了按钮图标无法显示的问题,我当时认为是Windows升级导致的某些dll或者ocx工作不正常所致,没有继续研究;2、上述ocx安装包的作者有一个说明如下:==========以下内容为转发==========
[转]使用DATAGRID控件后软件提示“cannot initialize data bindings”的解决
2007/09/26 02:28 P.M.
以前用DATAGRID控件都好好的,这次做了一个小程序后却出现这样的问题:   我用InstallShield把MSDATGRD.OCX打包进安装程序,然后在我的XP虚拟机上做安装测试,结果软件运行到加载DATAGRID控件的窗口就出错了,提示“cannot initialize data bindings”,且DATAGRID中没有数据。我知道肯定是在“Set DataGrid1.DataSource = Rs”这条代码上出错的,但代码本身绝对没有问题。然后我又在另一个XP虚拟机上测试,但在这个XP下软件运行很正常。两个XP的区别在于,前一个很干净,没有安装过任何东西,后一个则装过office和几个小工具。  现在问题明朗化了,结论就是肯定还少装了什么。但是很奇怪,难道使用DATAGRID控件,除了注册MSDATGRD.OCX外,还要别的库文件等来支持吗?于是上网查了一下,有人说还需要注册一下MSSTDFMT.DLL才可以。那么就再把它加到安装包里面,到虚拟机上测试,这下真的没问题了!原来MSSTDFMT.DLL是微软标准数据格式对象相关动态链接库文件,引用名称为“Microsoft Data Formatting Object Library”,如果在开发程序中有数据绑定,就是通过它对数据格式化后再绑定到控件的。虽然有时候程序里面没有对它进行引用,但如果用到数据绑定控件,那么就要记得把MSSTDFMT.DLL加到安装程序里面。VB控件下载http://4a.hep.edu.cn/ncourse/glxxxt/Mis_FunctionDemo/down_load_VB_ocx.htmVB控件下载使用说明: 
如果当你使用MIS模块演示系统中VB编制的模块不能正常运行时,且系统提示出缺少下列某些控件的话:
MSADODC.OCX、MSDATGRD.OCX
MSFLXGRD.OCX、TABCTL32.OCX、MSCHRT20.OCX
等,可以通过本页下载、安装VB运行所需要的控件,方法是将其下载到本地后先解压缩(会自动生成一个单独的目录和文件,如/VB_Ocx/setup.exe),然后再运行setup.exe程序。
VB控件安装设置程序供下载:
VB控件文件VB_Ocx.zip。 
==========转发内容结束==========3、上述ocx安装包解压之后包含3个文件:
VB_Ocx_Small 的目录
2003/07/07  10:02         9,953,822 MIS.CAB
2001/01/16  00:00           139,776 setup.exe
2003/07/08  09:50             4,235 SETUP.LST其中MIS.CAB解压之后又包含如下文件:
1998/07/07  00:00            14,336 ADODCCHS.DLL
1999/03/08  00:00           147,728 ASYCFILT.DLL
1998/05/31  00:00            22,288 COMCAT.DLL
1998/07/07  00:00            35,328 FLXGDCHS.DLL
2000/02/15  00:00         7,832,296 MDAC_TYP.EXE
2000/05/22  00:00           118,976 MSADODC.OCX
1998/07/07  00:00            93,184 MSCH2CHS.DLL
2000/05/22  00:00         1,009,336 MSCHRT20.OCX
2000/05/22  00:00           244,416 MSFLXGRD.OCX
2000/07/15  00:00           118,784 MSSTDFMT.DLL
2000/08/21  00:00         1,388,544 msvbvm60.dll
2000/04/12  00:00           598,288 OLEAUT32.DLL
1999/03/08  00:00           164,112 OLEPRO32.DLL
2001/01/16  00:00           249,856 SETUP1.EXE
2001/01/16  00:00            73,216 ST6UNST.EXE
1998/07/07  00:00             6,144 STDFTCHS.DLL
1999/06/03  00:00            17,920 STDOLE2.TLB
1998/07/07  00:00            18,944 TABCTCHS.DLL
2000/12/06  00:00           209,608 TABCTL32.OCX
2000/10/02  00:00           102,160 VB6CHS.DLL
2001/01/16  00:00           101,888 VB6STKIT.DLL请教VB方面的各路专家,这个问题应该如何排查和解决?非常感谢!

解决方案 »

  1.   

    工具栏按钮图标一般需要imagelist控件,看程序里是否没有关联上,工具栏上右键>属性
      

  2.   

    看是否和imagelist控件关联上,工具栏上右键看属性
      

  3.   

    看是否和imagelist控件关联上,工具栏上右键看属性
      

  4.   


    我用GetVBRes工具打开主程序exe文件,可以看到如下资源:这种情况是不是表明图片/图标已经直接嵌入在程序中了?这种加载通常会用到什么控件呢?程序在XP下是正常的,默认的2008R2显示按钮图标也是正常的,只是缺其他控件,安装了一些控件之后,按钮图标就不能显示了,是否有什么冲突?
      

  5.   

    打包好了用了几个月都正常,现在出问题,这可能是你电脑中毒引起,重装一下SERVER 2008
      

  6.   

    MSCOMCTL.OCX
    COMCTL32.OCX叫你的网友把这两个文件也打进包里。
      

  7.   


    我是不是上面没写清楚,补充如下:1、Server 2008有32位和64位版本;Server 2008 R2只有64位版本;
    2、Server 2008 R2刚安装的时候,加上上述控件包,是可以使用此软件的,但经过一段时间,系统会自动安装很多补丁,例如最重要的SP1发布之后肯定要安装,我个人怀疑是在更新了某些补丁之后,软件的按钮图标无法显示;
    3、Server 2008 R2 SP1是指集成了SP1的R2,这个是我新装的系统,不加上述控件包,按钮图标可以显示,但是缺少其他控件,软件不能工作;而加上上述控件包,软件可以工作,但是按钮图标显示不出来。个人认为与病毒无关。
      

  8.   


    我下载并手工注册了这两个OCX,还是无法显示按钮图标:(请继续指点,谢谢!
      

  9.   

    解决办法,Server 2008 R2下安装VB6,打补丁包含VBsp6。
    然后打开源码,打包⋯⋯
      

  10.   

    你的toolbar没有和imagelist链接啊,当然不会显示图片喽!
      

  11.   

    时隔一年,今天又研究了一下,终于发现了问题所在:
    1、不是补丁的问题,与64位操作系统也无关;
    2、因为我在使用机器的过程中,安装了一个VB开发的软件,叫做Dataram RAMDisk,就是一个把内存虚拟成硬盘的工具,这样我在开发VC程序的时候,可以把一些过程文件全部指向到这个虚拟盘上,速度快,免清理;
    3、上述软件会在系统中注册它所需的控件,主要是3个:
    MSCOMCT2.OCX
    MSCOMCTL.OCX
    tabctl32.ocx
    4、根据本帖中 chinaboyzyq(猴哥) 的观点(与这个两个控件有关:MSCOMCTL.OCX 、COMCTL32.OCX),我做一个简单的交叉对比,就用工具把系统中RAMDisk注册的那个OCX注销掉,再打开之前的软件,按钮上的图标就回来了。非常感谢大家的无私帮助,谢谢!补充:
    1、查看、注册、注销系统中的OCX、DLL,我用到了网上找到的一个工具,直接在google搜索关键字“查看 取消注册 ocx&dll 组件”即可。