用vb做了一个控件a.ocx 
在别的工程中加入这个控件,生成exe 
现在这个控件做了一些改动,重新编译了一个a.ocx,版本不变 
用这个新控件覆盖原来的控件 
运行exe就说vb.usercontrol激活失败,与工程不兼容之类的 
可是我在编译控件的时候选择的是与工程兼容的呀 请问: 
如果用户在安装了某个应用程序以后 
要是该应用程序用到的某个自制控件要被替换掉, 
通常是给原有的应用程序打补丁时需要替换掉以前的一些控件 
应该怎么做呢 我做过的一些尝试: 
1.把控件的兼容性选择为工程兼容,或者不兼容,或者与原来控件的二进制文件兼容都试过 当与控件二进制兼容时,在当前编译的系统下新旧控件可以自由替换,但换一个系统就还是 
一样的错误 
2.在换了一个系统以后,打开引用控件的工程,如果当前工程中引入控件的位置放置的是新 
的控件时,就会提示说说有一个新的注册版本,问你是否升级,必须选择是,才可以把新的控 
件引入,保存后,再用旧的控件覆盖新的控件,再打开工程,说有一个新的版本,问是否升级, 
若是,则提示引用失败,控件加载失败,若否则可以使用旧的控件 现在做好了补丁控件,却不知道怎么替换掉以前的,难道非要连引入新控件的exe一起发给用 
户吗 我试过很多次手工的注册和注销了 
还是不行 
一样的错误 其实这个控件只要和exe在同一个目录下可以直接使用 
不注册他也可以在当前目录下找到 
如果是注册的原因 
出错的提示就应该是“控件未注册,找不到”之类的提示 
而现在的错误提示是:“无法激活,不兼容” 试了很久都不成功,非常着急!!!!!!那位高手指点一下,多谢了!!!! 

解决方案 »

  1.   

    原因是你在做这个控件第一次编译或你使用该控件时的控件兼容性设置为"工程" 或"不兼容"
    生成EXE文件后就不能自动升级了
      

  2.   

    如果编译后的.exe文件不太大的话,完全可以带着.exe一起升级啊,可能的话再专门做个升级程序,把.exe和.ocx放到资源文件中,升级时解到硬盘下覆盖旧版本的文件即可。
    而且这个升级程序在以后还能用到啊。  :)
      

  3.   

    谢谢大家!!尤其是dysqw() , 0211997(HI) 和goodname008
    我这里上网不是很方便,那天没有看到大家的回复,真是抱歉,这么晚才散分,让大家久等了
    1.我刚开始也怀疑是第一次没有设置二进制兼容的原因,我是后来接手别人的第一版的东西修改的
    2.那这么看来就没有办法单纯的用ocx替换还升级了,只能用goodname008的建议采用exe+ocx的方案了
    3.我对dll和ocx同exe的关系还是不熟悉,我倒是跟踪过注册表,发现注册以后在classid下写添加了id号,还有文件所在位置只类的,vb的很多控件都是自注册的吧,用右键点开直接注册,用记事本打开vb的工程,里面有很多该工程用到的ocx和dll,他每次用vb打开的时候就自动加载了吧,每次加载的时候先搜索注册表的id号,如果没有的话就搜索当前目录的同名文件,但是该文件必须保持同一个id号,id号是自动生成的吧,用 vc的一个ole(好象是)可以看?那不能修改吗
    4.我是用installshield 对vb做开发软件的打包的,经常遇到各种各样的问题,最多的ocx和dll的安装卸载的问题,我们测试的时候一般都是在空的系统下做的都没有问题,但是用户的系统一般都装了很多东西,有的用户说装不上,还有的说卸载了以后很多别的东西不能用了(即使他选的是保留共享的文件)我们做打包的时候一般是把vb工程里用到的文件都加进去,然后再加上一些vb运行环境和ado这些installshield封装好的组件,但是installshield还是会自己找到很多系统的文件自动加进去,但是都分得很清楚,那些是自注册的,那些是共享的,这些也肯定不会出错的,想来想去不知道问题出在哪儿了,大家帮忙再给看看
      

  4.   

    考虑过用SetupFactory或SetupBuilder之类的软件打包吗?
      

  5.   

    没有用过,installshield不是很成熟的打包软件吗?和他们相比较有什么不同呢