原文网址:http://www.cnblogs.com/langu/archive/2012/03/23/2413990.html

一直以来,找安装程序的msi源文件路径得到的都是“system32”的路径,安装程序做完了,学习WIX的时候发现了方法,并已经测试成功了。

网上有很多获取源文件路径的方法,比如

1、扫描当前所有进程,获取meiexec进程的路径

2、获取当前程序的路径

3、获取发起当前进程的路径

事实上这些路径都不是msi的路径。那么:

怎么获得msi文件的路径?

切换到“自定义视图界面”,打开“自定义操作”属性界面中customactionData属性填入/Sdir=[SourceDIR],

然后在安装方法中写上string sdir=Context.Parameters["SDIR"];

注意:
1、/Sdir=[SourceDIR]与/Sdir="'[SourceDIR]'"等效都可以获得路径,区别是后者得到的路径有“‘”单引号。(测试补充:如果路径中含空格则一定要使用双引号内部单引号的方法)
2、该路径需要处理才能使用,由于系统内部各种转义字符的缘故,得到的路径需要将“\\”替换成“\”,
方法sdir=sdir.replace("\\\\","\\"),也可以这么写sdir=sdir.replace(@"\\",    @"\"),
3、其他的写法均会报错

为什么哪些路径不是msi数据库文件的路径?

我们需要将安装程序分成两部分来看,一是setup.exe,二是[productname].msi

前者是引导程序,跟我们写的代码无关;后者是手写的代码和安装相关的文件等等。

msi源文件的路径是msi的一个属性,在win7等系统中右键属性详细信息可以看到msi文件现在的路径,在server2003中直接看不到。

执行msi文件的命令是msiexec.exe [productname].msi……,其中msiexec.exe 的路径是%windir%\system32\msiexec.exe

所以前面的那些方法都不适合windows installer安装过程中获得msi文件的路径,那些方法都是msiexec.exe的路径。

获得msi文件路径有什么用?

目前我想到的至少有2个主要作用:

第一,大多时候在做64位兼容的问题上,并不需要将x64和x86的安装包分开,但是vs又不让将这两者打包到一个msi数据库文件中。那么我们可以当x86的包生成完后,将x64的小程序方法到安装包的目录或指定子目录下,这样就可以通过sdir来调用了。

第二,安装的时候有些文件时为产品运行服务的,有些文件是为安装服务的。后面的这种文件并不一定需要拷贝到安装目录下,另外如果网络安装,还可以保护你写的程序只安装时调用

不足之处请指正

做.net的早晚会用到,并且网上还没有这方面的正确资料或几乎很少的更多相关文章

  1. 今天做一个项目的时候,要在一个编辑的jsp页面的textarea标签设置value属性,结果发现他没有value属性,但是是编辑页面又必须要回显要修改的内容,所以在参考了w3cschool之后很轻松的解决了这个问题。

    今天做一个项目的时候,要在一个编辑的jsp页面的textarea标签设置value属性,结果发现他没有value属性,但是是编辑页面又必须要回显要修改的内容,所以在参考了w3cschool之后很轻松的 ...

  2. 预热篇- 总结Delphi Xe4 做App的的可行性分析. ios平台的问题还需要自行学习

    首先澄清一个问题, 很多同学其实是误会了, 以为只要搞定了Delphi 就能很快写快餐程序了.  ios 本身的知识还是需要一些的, 并没有什么捷径可以走. 但如果一个团队有分工协作的话, Delph ...

  3. 做新时代的奋斗者!(好吧,我还没弄出python的编译环境)

    Pictures: 今日分来的补记来嘞: Game 1:Guess the number. Python包含许多内建的函数,有些函数存在于称为模块的单独的程序中,可以使用import语句把它们的模块导 ...

  4. Deep learning:四十四(Pylearn2中的Quick-start例子)

    前言: 听说Pylearn2是个蛮适合搞深度学习的库,它建立在Theano之上,支持GPU(估计得以后工作才玩这个,现在木有这个硬件条件)运算,由DL大牛Bengio小组弄出来的,再加上Pylearn ...

  5. iOS7 人机界面设计指南

    iOS7 人机界面设计指南     苹果在WWDC 2013大会上发布了iOS 7,新系统一改5年来的拟物路线,在乔纳森•艾维的主导下,加入了更多的“扁平化”和“极简”现代设计元素. iOS7系统界面 ...

  6. Android计算器布局

    Android(安桌)计算器布局实现         ——解决整个屏幕方案 引言:     学完了android布局的几种方式,做了一个android计算器. 我在网上搜索了这方面的资料,发现了布局都 ...

  7. UltraEdit正則表達式介绍及实例

    前几天,有个将Excel中的数据导入到数据库中的需求.原本想到用程序读取Excel中的数据并存储到数据库中,但经一哥们的提醒,说用 EditPlus或UltraEdit这种工具直接将数据拼凑成SQL插 ...

  8. 你用 Python 做过什么有趣的数据挖掘项目?

    有网友在知乎提问:「你用 Python 做过什么有趣的数据挖掘项目?」 我最近刚开始学习 Python, numpy, scipy 等, 想做一些数据方面的项目,但是之前又没有这方面的经验.所以想知道 ...

  9. Google是如何做测试的?

    Google是如何做测试的?(一.二) 导读:本文译自 James Whittaker 在 Google 测试官方博客发表的文章<How Google TestsSoftware >. 在 ...

随机推荐

  1. 【LeetCode】462. Minimum Moves to Equal Array Elements II

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...

  2. Windows10 Apache2.4 PHP7 MySQL 5.7安装教程

    最近细细的折腾了win10下PHP环境的安装过程,每次安装总是有小问题,现在总结一下.安装之前需要注意,下载的安装包(除MySQL)外必须统一是64位或者统一时32位. 一. MySQL5.7的安装 ...

  3. mac下安装composer

    打开命令后 cd /usr/local/bin 然后执行 curl -sS https://getcomposer.org/installer | php 接下来 sudo mv composer.p ...

  4. 二维小波包分解wpdec2

    load woman; %小波包2尺度(层)分解 t=wpdec2(X,2,'haar'); plot(t);%绘制小波包树 %提取(1,2)处结点.也可以点击上图结点,观察 c12=wpcoef(t ...

  5. Zeppelin使用phoenix解释器

    Interpreters设置

  6. java.util.Iterator

    public interface Iterator<E>: 对 collection 进行迭代的迭代器. 方法摘要: boolean hasNext() 如果仍有元素可以迭代,则返回 tr ...

  7. 5.编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试St

    Student类: package com.bao; public class Student { int stuNo;String name,sex;int age,weight; Student( ...

  8. input时间输入框小解

    date    年月日 month 年月 week   年周(ios上不可用,android部分会显示当前是第几周) time   时分(ios不显示时/分的字样) datetime 为一输入框,基本 ...

  9. JPA 系列教程15-继承-一个表-SINGLE_TABLE

    继承映射策略 一个类继承结构一个表的策略,最终只生成一个表,这是继承映射的默认策略. 举例 如果实体类Teacher继承实体类Person,实体类Student也继承自实体Person,那么只会映射成 ...

  10. InnoDB表要建议用自增列做主键

    InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子节点(leaf pages of the tre ...