如果系统中已经有一个已注册的COM对象包 1.dll(新版本),已经存在于系统A目录中,而如果某安装程序中有一个低版本的1.dll(旧版本),并且进行软件安装,安装在B目录下,在安装过程中这个旧版本的DLL能向系统注册吗?当客户端程序调用1.dll的COM服务器对象时,是使用的A目录下的1.dll还是B目录下的1.dll ?

解决方案 »

  1.   

    是这样的,如果我的程序中用到一个微软的COM DLL文件,那么如果我在安装程序中打包这个文件一起安装,而如果用户系统上已经有这个DLL的新版本了,那么,我的安装程序能正常安装吗?或者我的程序正常安装了,会不会对用户的其它用到这个新版本的DLL的软件造成干扰?
    如果是普通的DLL,那么可以把这两个DLL分别装在不同的目录下,这样可以避免覆盖的问题,但COM DLL应当是通过注册表中的注册信息来查找DLL进行调用,而同一个COM DLL,应当只有一个CLSID吧,那么即使在不同目录下也只会有一个DLL是有效的?
      

  2.   

    对于VB子代的打包程序有时候感觉不是很好用,我通常是用它打一次包,然
    后将包里的相关文件复制出来再用些专业的安装程序制作软件打包。通常比较专业的安装程序制作软件,都会有脚本支持,在安装程序的脚本中
    可以做识别组件的版本并根据情况对其进行处理。当然需要稍微琢磨一下你
    使用的安装程序脚本,虽然不是很难懂,但也要花点时间去了解。其实VB程序在Win98以上系统如果只使用VB的基本控件,没有引用什么外部
    组件和其他需要添加的控件,完全可以独立运行。如果用VB程序本身来做组
    件安装注册组件这一块也是很容易的,大可以在安装程序里先释放你的VB程
    序和相关的文件到一个临时目录中,然后运行你用VB写的安装程序,无非就
    是读取注册表,然后判断是否取消注销操作,然后调用regsvr32来注销或注
    册你的组件,如果做得完善点,还可以检测你的程序或NT服务程序是否在运行,
    如果在运行通过消息、DDE或网络的方式通知你的程序让其自行安全关闭,然
    后再进行处理。用到的也就是些注册表、文件、Shell操作。至于那种做法,看你的个人爱好了,喜欢直接用安装程序的脚本或用VB程序或
    是批处理程序都可以,根据需求而定。如果想在VB里做,涉及的东西不多,可以参考下面的东西
    注册组件可以
    Shell "regsvr32 你的组件路径 /s"注销可以:
    Shell "regsvr32 你的组件路径 /u /s"复制文件可以用:
    filecopy删除文件可以用:
    kill读写注册表可以参考:
    http://topic.csdn.net/u/20100311/16/1ccd9381-d566-4e49-ab6f-33c260ff4cf2.html
      

  3.   

    如果两个dll的接口一致,会使用最后一次注册的Dll文件,其实这点你可以不必担心的。
      

  4.   

    好象一般打包工具只能检测同一个目录下是否有同名文件吧,但是对于COM文件,安装在A目录下或B目录下,虽然不在同一目录下,但是注册信息却可能覆盖吧