您的位置:首页 > 其它

VS2008 安装部署工程的小问题

2011-04-01 16:36 190 查看
之前都使用NSIS,写脚本。后来换个公司,只使用InstallShield和VS2008。无奈学习了下。IS只使用Express版本,拖拽一下就搞定,也没写过脚本。基本还是不大懂得比较复杂的定制,有机会用到再说了。

倒是VS2008的,前两天客户提了个古怪的要求,要将一个LOGO文件,放到msi外面,以便他修改,安装时,再把这个logo文件考到安装目录里去。VS2008做的安装程序,一向我只会常规的模式,这种要求看来非要自己动手添加点动作,到现在我也不知道怎么给安装程序添加脚本,还是不能?琢磨几天,看来只有在custom action里添加点私货,来完成这件事了。



图1

在工程目录视图上可以看到一排按钮,如图1,红框中就是custom action按钮了。进入这个界面,vs2008一共预先定义了4个阶段,安装,提交,回滚,卸载。在这四个阶段可以加入我们自己的动作。加入的方式是,运行你自己的exe,dll,vbs,js。它只支持这四种格式的文件。后两种脚本我不会,我想这两种脚本也主要是为web安装程序准备的吧。exe太扎眼,所以我选择了在install阶段使用dll(如图2)。也就是说,我要在这个dll中把logo文件从原始目录考到安装目录下。



图2

这件事本来很简单,我也不想复杂化。因此,最关键的地方就在于,怎么把这两个目录作为参数,传递给dll。又不知道写脚本,貌似msdn上也没有相关的详细参考。还真是难住了。网上搜,msdn查,一步一步开始。

首先是建立dll工程,我在msdn上看到一段例子,当即拷贝下来建立为我的工程了。具体代码就不拷贝了,在主题Error Handling in Custom Actions下有一段dll的代码,包括我后面调试也用来弹出messagebox,还挺好使。

接下来就是传参数了,查看msdn发现了custom action的属性里面有一个CustomActionData,这个属性是可以传参数的(如图3)。在dll中通过msi的API获得。msi打头的api有不少,还真不了解都是干嘛的。介绍也不甚详细,例程更是少。知道这里可以传参数,但是以什么格式,怎么取得,一无所知。



图3

继续网上搜,所获甚少,多是web安装的。只能从中提取些有用信息。继续返回msdn去查找。最开始我用getmodulepath这样的api,返回的是msiexec的路径,哦,我想,安装程序是由msiexec启动的,dll也在其中,所以返回的是这个路径。然后我又查找msi的api,找到了msiGetSourcePath,msiGetTargetPath这样的函数,但是收获不大。这俩函数一直不能返回路径,乱码,原因不明。当我看到他们的第2个参数需要传入一个路径时,我估计这条路很困难。

仔细研究 CustomActionData Property主题下的内容。再仔细一个一个查看msi的API,发现了有MsiGetProperty这么个函数。CustomActionData也是属性,通过它能否取得传入的参数呢?果然,当CustomActionData 赋值为/name="[TARGETDIR]\"时,获得了安装路径。直接赋值 [ProductName],可以获得程序名称。看来这条路可行。现在是要传入两个参数了。还是在MSDN上有写, Each name must be unique and have only one value. Multiple values must be separated by a single space: /name1=value1 /name2=value2.就是这种形式:/name1=value1 /name2=value2.这里还有一个问题,就是value的写法,直接写字符串是不行的,因为地址是动态的。必须是宏或者代号之类的。例如,安装目标路径是TARGETDIR,那么安装程序所在的路径呢?不知道,继续查msdn,没有发现有这样说明文档。如果我要别的参数呢?用户的选择,或者系统路径,用户路径,桌面路径,等等怎么办?没有这样一个比较全面的说明,还真是麻烦。然后网上搜索,找了几个,试了好多次,终于发现,SourceDir,注意,大小写不能错。这个就是安装程序所在的路径了。

参数有了,dll中顺利得到两个路径,如图4,剩下的就是对字符串整理下,得到你要的路径就可以了。这个问题就算解决了。





图4

如果没有详细的文档,还是脚本来的直接。

本文出自 “时光旅行” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: