工程用到的某个DLL或OCX的版本不对了。
你要一起发给客户替换掉。

解决方案 »

  1.   

    仔细检查SQL语句是不是有不支持的。
      

  2.   


    为什么客户现在使用之前版本的软件是正常的,新版本的只是我现在在旧版本的软件基础上稍微改动了几句代码,改动的部分都还没有运行到,"ActiveX部件不能创建"的错误是在主界面显示时出现的,改动部分的代码是在其他窗体的,都还未运行到。
    为什么我重新编译了一下,然后发布到客户的运行环境就出错呢?
    当时旧版本的开发环境编译环境手头上也没有了,无法对比我的编译环境和旧版本的编译环境。
    VB6的不同版本会跟这个有关系吗? 我指的是VB6的企业版,个人版,以及是否有安装VB6 SP6的部分。另外我的编译环境机器上也安装了VS2003,这跟ActiveX控件不能创建这个错误有关吗?
      

  3.   

    谢谢 vansoft 兄的回复,谢谢!
      

  4.   

    由于客户是处于金融行业,发一个安装包给客户安装,需要更新系统的一些系统组件,
    很麻烦,也很担心新的安装包安装后老版本的软件也不能正常了,影响到客户的正常营业,
    这是很大的事,所以暂时先不考虑安装包的事项。我尝试使用了VB6自带的打包安装工具,打包了新版本的软件,对比新旧两个安装包的SETUP.LST
    文件的内容,没有发现明显的有些新版本的打包软件有打包安装而旧版本的没有进行安装的。其中有些系统的dll或ocx差别较大的有以下:                                新版本安装包                         旧版本安装包
      stdole2.tlb            版本 5.1.2600                        2.40.4275.1
      asycfilt.dll              版本 5.1.2600                        2.40.4275.1
      OLEPRO32.DLL  版本 5.1.2600                        5.0.4275
      OLEAUT32.DLL   版本 5.1.2600                        2.40.4275
      scrrun.dll               版本 5.7.6002                        5.6.0.88
      msvcrt.dll                版本 7.0.2600                        6.0.9782.0
      msado25.tlb           存在                                 不存在
      
      各位是否有经验这些系统组件版本的差异是否会造成"ActiveX部件不能创建" 的错误。
      
      该错误是出现在软件系统的主界面的显示过程中,是在 Form_Load()函数中,
     我在代码中加入了启动日志记录的功能,通过日志分析清楚了解软件连接数据库,查询启动数据时成功的。
     主界面上通过拖放控件的形式放置了一个第三方的控件A (ocx文件方式的),在From_Load()函数中,通过
     Set mainCtrlB = New MCtrlB 的方式调用了另外一个第三方的控件B (该控件是以 ActiveX exe方式存在的,假设为 MCtrlB.exe。)
     mainCtrlB.openpart aaa       
     
     代码的流程大致如下:
     Private Sub Form_Load()
     
    On Error GoTo ErrHandle
      '连接数据库成功
      ConnectDB(); 
      LogText("1 连接数据库")
     
     '显示登录界面
     LogText("2 登录界面")
     
    '显示主窗体
     Me.Show
     LogText("3 显示主窗体成功")
     
     'New 控件B
     Set mainCtrlB = New MCtrlB
     mainCtrlB.openpart aaa
     LogText("4 加载控件B成功")
     
     ErrHandle:
        '出现错误后,继续执行
        
        MsgBox "主界面错误:错误号" & str(err.Number) & " 来源:" & err.Source & "描述:" & err.Description, vbExclamation, "系统错误提示"
        End
    End Sub在客户环境中所观察到的日志记录是,存在 "3 显示主窗体成功" 的记录,但是没有 "4 加载控件B成功" 的记录。
    控件B是以一个exe文件的方式存在system32的目录下的。
    通过这个日志观察是否可以确定控件A是成功能够加载的,出现错误的是控件B不能创建与运行?
      

  5.   

    ADO版本不对msado25.tlb是ADO2.5的文件,既然旧版里没有那就说明旧版引用的不是ADO2.5,客户机可能也不支持ADO2.5解决办法:要么升级客户机的ADO到2.5以上,要么把你程序里引用的ADO降到旧版同一水平(ADO2.1或ADO2.0)
      

  6.   

    ADO2.0:msado20.tlb
    ADO2.1:msado21.tlb
    ADO2.5:msado25.tlb
    ADO2.6:msado26.tlb
    ADO2.7:msado27.tlb
    ADO2.8:msado15.tlb你看看旧版用的是哪一个,或者找找旧版安装包里有没有MDAC_TYP.exe这个文件,看看这个文件的版本是多少
      

  7.   


    谢谢CityBird的帮助,旧版安装包是有MDAC_TYPE.exe文件的,应该是安装的也ADO2.5以上版本的。
    如果数据库组件不对,我新版的软件的日志记录已经表示连接数据库成功,并能够成功查询使用了一些表的数据,
    只是到了主界面显示的时候报告ActiveX控件不能创建的错误。所以我认为可能和Ado组件的版本关联不大。
      

  8.   

    MCtrlB.exe运行是不是有什么限制,比如只允许运行一个实例,而客户运行新程序前没有退出旧程序或者退出不完全,MCtrlB.exe仍然驻留在后台运行,导致新程序加载MCtrlB.exe失败。
      

  9.   

    谢谢提醒,我在我的开发机器上已经进行过测试,同时启动了两个软件系统,即MCtrlB.exe也是同时两个运行,也很正常。所以初步可以排除是MCtrlB.exe的限制。
      

  10.   

    本帖最后由 bcrun 于 2014-04-30 11:49:33 编辑
      

  11.   

    active控件是自己的还是别人的。
    不会是控件注册的问题吧?
    如果用了和以前一样的控件,但是注册信息发生变化,也一样不能创建控件。把你用的控件发布给客户注册。
    如果控件是自己写的,要用兼容方式
      

  12.   


    谢谢spt_petrolor,两个active控件均是自己写的。如果控件是自己写,要用兼容方式。请问如何兼容?
      

  13.   

    active控件工程,工程属性,部件,二进制兼容。不兼容,部件每次编译都会是一个新的控件,注册信息完全不一样。
    工程兼容,工程组里面是兼容的
    二进制兼容,控件的注册信息是兼容的,接口貌似不可修改,但代码可以任意修改。记得不很清楚,看msdn:“版本兼容”设置版本兼容性的等级 “不兼容”- 非增强的兼容性。
    “工程兼容”- 如果选中该选项的话,“位置”框将变为活动的,从而可以搜寻与此工程相兼容的文件。如果清除该选项的话,那么“位置”框就成为无效的。 
    对于所有的 ActiveX 工程类型来说,“工程兼容”的缺省状态是被选中的。“二进制兼容”- 对于维护用自己的部件编译的工程中存在的兼容性问题来说是有用的。
    “文件定位框”- 显示跟工程兼容的文件名及其位置。可以键入一个名字和位置,或者使用“浏览”按钮显示“可兼容的 ActiveX 服务器”对话框,在那里可以定位文件。 
      

  14.   

    自己顶一下。
    想咨询一下各位, 根据日志记录的信息,有记录下 "3主窗体显示成功", 没有记录下 "4 加载控件B成功", 是否可以确定问题是出在 控件B 上? 该ActiveX exe 形式的控件不对或没有注册?然后我做了测试,假如卸载掉unregister 控件B, 再运行我的运用软件, 双击该exe文件, 也会报告“Activex 部件不能创建”
    的运行错误, 错误号是429。所以是否可以确定是控件B在客户的环境中是已卸载掉了?欢迎各位的高见和经验,谢谢!
      

  15.   

    正解!谢谢zhao4zhong1的指点,但是旧版的安装文件里面有一个 MDAC_TYP.EXE 的安装文件,我尝试安装了一下,发现这个MDAC_TYPE.exe安装的是Microsoft Data Access 2.0 的组件。所以再客户环境中可能使用的是Microsoft Data Access 2.0这个组件, 所以这个应该是一个重大嫌疑。但是我有一个疑惑,新版本软件在客户的环境中是可以正常的使用数据库操作的, 不能确定是否是这个原因导致的。
    有什么方法可以确定目前客户环境的ADO的版本呢?
      

  16.   

    C:\>dir "C:\Program Files\Common Files\System\ado\msado*.tlb"
     驱动器 C 中的卷是 C_HD5_1
     卷的序列号是 1817-D526 C:\Program Files\Common Files\System\ado 的目录2010-11-03  20:57            81,920 msado26.tlb
    2010-11-03  20:57            81,920 msado25.tlb
    2010-11-03  20:57            81,920 msado27.tlb
    2010-11-03  20:57            61,440 msado21.tlb
    2010-11-03  20:57            61,440 msado20.tlb
                   5 个文件        368,640 字节
                   0 个目录 28,550,307,840 可用字节目前客户环境的ADO的版本为27
      

  17.   


    谢谢zhao4zhong1兄的帮助,谢谢!
      

  18.   

    谢谢各位的回答,上周出差去客户现场维护了,经过查证,问题确实出在MCtrlB.exe这个进程外COM组件的版本上,在客户机器上运行的MCtrlB.exe这个ocx控件的clsid与开发环境的MCtrlB.exe不同导致。
    非常谢谢spt_petrolor兄的指点,谢谢!