嗯,是这样,我们生成的一个msi里面有一部分要openSubKey去读注册表获得里面的一个安装路径,在HKEY_LOCAL_MACHINE\SOFTWARE下的某个地方,但是运行这个msi的时候发现openSubKey返回的是null,而相同的路径如果做一个exe试着去读就不会返回空,这是为什么呢?
msi跟exe在系统看来有啥区别?
还有为啥这个msi在有的机器上就能读到这个目录有的机器上就读不到呢?

解决方案 »

  1.   

    你可能碰到了与我类似的问题。
    先为你解释一下MSI的意思,说到MSI文件,不得不先说说Windows Installer,它不只是安装程序,而是可扩展的软件管理系统。Windows Installer的用途包括:管理软件的安装、管理软件组件的添加和删除、监视文件的复原以及使用回滚技术维护基本的灾难恢复。另外,Windows Installer还支持从多个源位置安装和运行软件,而且可以由想要安装自定义程序的开发人员自定义。要想使用这些功能,就必须通过MSI文件。MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的信息和在很多安装情形下安装(和卸载)程序所需的指令和数据。MSI文件将程序的组成文件与功能关联起来。此外,它还包含有关安装过程本身的信息:如安装序列、目标文件夹路径、系统依赖项、安装选项和控制安装过程的属性。 
    如果你是用.net 打包工具进行的打包,并且写了一个自定义类去读取某些值,举个例子,比如你要得到安装程序的运行路径,你会发现,起始位置会是C:\Windows\system32。但是如果你是自己写的一个.EXE文件,它的取得的位置会是实际位置。
    对于注册表的读取,应该没有什么影响,但我要提醒你,会不会有别的什么地方处置的不妥当。
      

  2.   

    能不能给提供一些可能性,会是什么地方处置不妥当呢?
    exe拷过来一模一样的代码啊。
      

  3.   

    在installer类里编写的代码,除了执行路径不同外,应该没有什么限制.你的代码中有路径相关的部分么? 检查一下呢.
      

  4.   

    msi的文件貌似是用msiexec.exe来执行的
      

  5.   

    我不太懂,但是分享一个小东西吧:
    Windows Install Clean Up