存档

文章标签 ‘工具’

inno setup初探

2014年6月10日 没有评论

由于工作的原因,需要对应用程序制作安装包。在以前的项目中,都是使用的 InstallShield  来做的安装包,最近的一个项目是从一个日本开发团队的项目中新建的一个分支,他们原本的安装包都是使用 Inno Setup 来创建的,结合项目背景和安装包的复杂度,我们就踏上了inno setup的路。

inno setup 相对于 InstallShield 轻量了很多,也是使用了 iss 作为安装脚本文件的后缀。常量的定义也大大方便了开发人员。

下面描述下常见的常量

AppId 应用程序唯一ID
AppName 应用程序名称
AppVersion 应用程序版本号
AppPublisher 应用程序制造商
AppSupportURL 应用程序厂商的URL

DefaultDirName 默认的安装路径
OutputDir exe安装包的输出路径
UninstallDisplayIcon 卸载程序的图标

上面的几个变量中,第一部分的信息会显示在添加删除程序中,尤其以AppId最为重要,操作系统以此来区分不同的应用程序。如果是同一个应用程序不同的版本,请保证该变量始终是相同的。inno setup可以帮助生成GUID格式的AppId。

而[Files]段是描述了拷贝文件的路径和方式,例如下面的

Source : “{#SourcePath}\WinGather.exe”; DestDir: “{app}”; Flags: ignoreversion

意思就是把 SourcePath 定义的目录下的 WinGather.exe 程序拷贝到程序的安装目录下。{app} 是一个系统变量,表示程序在用户机器上的安装目录。ignoreversion 是在拷贝的过程中忽略版本的不同。

如果一个应用中有很多个文件需要拷贝,有的还包括子目录,都这样写就会很琐碎。于是就有这样的版本:

Source: “{#SourcePath}\ccprompt\*”; DestDir: “{app}\ccprompt”; Flags:ignoreversion recursesubdirs

从这里我们可以看到通配符*的使用,这样就会方便很多哟。此外,recursesubdirs 参数表示如果包含子目录的话,那么连同子目录也一起拷贝。这样 [Files] 就会少很多,尽管有通配符的支持,但是实际应用中要看情况而定,目的是为了避免安装包拷贝时的准确性,如果安装不对劲,也方便查找定位原因。

[run]段的作用是描述在安装的最后一步所要做的操作,多用于启动服务或者清理等操作,例如下面的:

Filename:”net.exe”; Parameters:”stop ccsdk”; Flags:waituntilterminated runhidden runascurrentuser;

这个例子就是调用 net 来停止一个叫做 ccsdk 的服务,同时有3个额外的选项,分别表示等这个操作完成后再进行后续的安装,不显示界面,以当前用户即管理员权限运行。如果运行一个命令行或者批处理,如果不使用 runhidden,那么在界面上就会看到有一个窗口一闪而过,体验不是很好。

[uninstallDelete]段的作用是描述在卸载的时候,要删除的文件,多用于程序在运行期间产生的文件例如日志、临时文件等,例如:

Type:filesanddirs; Name:”{app}\log.txt”

上面就是简单的描述了一下,inno setup其实非常简单,环境本身也提供了安装想到和帮助文档,文档里写的是非常的详细。所以我这里几乎没有什么内容可写。对于E文不懂的同学,可以在网上下一个中文版的帮助手册。最后说一下,inno setup的安装脚本是不区分大小写的。

分类: 日常 标签: , ,

jQueryPad++发布

2011年12月31日 没有评论

我前面文章提及 jQueryPad 并说自己会重写一个类似的界面了,现在 jQueryPad++ 出了第一个版本了。

先上一个界面

jQueryPad++是模仿 jQueryPad 的应用,是一个方便快捷的 JavaScript/HTML 编辑调试器,因此取名为jQueryPad++。事实上,jQueryPad很优秀,界面很漂亮,代码结构也很清晰。

jQueryPad在使用的时候,会把临时文件放在 C:\Users\【用户】\AppData\Local\jQueryPad ,但是,但是,但是不会删除这些临时文件,国内的优化软件例如QQ管家、360什么的也不会清理这里的临时文件,所以造成的后果就是这里的文件会越来越多。这让有点洁癖的我,感觉非常的别扭。

在我看来,这个问题很讨厌,比没有智能提示还要讨厌,所以也就有了jQueryPad++。

jQueryPad++把临时文件存放 IE 的临时目录下C:\Users\【用户】\AppData\Local\Microsoft\Windows\Temporary Internet Files 下面,这样只需要清理 IE 缓存文件就可以了,无论是手工还是用 QQ/360 都是很方便的。

既然是尽可能地模仿 jQueryPad,但是由于衣服自己洗的水平有限,还是有很多地方不一样的。

1、移除了顶部的 Tip,这个感觉是个鸡肋,要不要无所谓。好吧,主要是因为不会实现。

2、没有实现按钮、滚动条的颜色和 jQueryPad 的一致。看起来丑了点。

3、将程序主界面的宽度从 800 修改为 1000。

4、临时文件的存放路径发生了变化。

文件最后用 Net Framework 3.5 编译,在运行的时候是需要对应的 Framework 支持的。众所周知的,NET编译的程序,在第一次运行的时候,速度可能会比较慢,之后就好多了。

最后放上下载地址,jQueryPad++绿色版-1.12.31.36,祝大家生活愉快。

分类: 日常 标签: ,

jQueryPad++获取已安装的浏览器

2011年12月29日 没有评论

一直在使用一个叫做 jQueryPad 的软件,这是一个国外的开发者使用 WPF 技术开发的小工具。还是蛮不错的,因为某原因,我决定自己来重写一个类似的功能。

我写的这个名字就叫做 jQueryPad++,界面什么的都尽量模仿那个软件好了。jQueryPad 免费但是不开源,里面有一个功能是列出了已经安装的浏览器,点击可以用对应的浏览器打开,在jQueryPad++里,获取浏览器的实现如下:

代码里定义了一个 GetBrowsers() 方法,该方法返回一个枚举,循环枚举可以获取安装的浏览器了。代码访问注册表的某一位置可以获取到电脑上一些已经安装程序的路径,然后再进行过滤就可以了。

在刚开始的时候,我并不清楚要在注册表的哪个位置去查找,为了让同行以后避免发生这样的情况,同时也为 jQueryPad++ 打个小广告,这里放上代码实现。懒得弄代码高亮了,大家凑活看吧。

protected IEnumerable<Browser> GetBrowsers()         //这里是返回迭代,Browser是一个自定义的类

{

//查找注册表的路径。这个路径我也是看了好久才发现地方的。使用了Registry ,需要添加对应的命名空间。

RegistryKey path = Registry.LocalMachine.OpenSubKey(@”Software\Microsoft\Windows\CurrentVersion\App Paths”);

string[] list = path.GetSubKeyNames();

foreach (string item in list)

{

if (item.StartsWith(“Firefox”, StringComparison.InvariantCultureIgnoreCase)) //检查是否包含Firefox ,比较字符串的时候忽略大小写

{ //如果存在firefox的键,那么默认值保存的就是程序的可执行文件的完整路径,还有一个是 Path 返回的是可执行文件的路径。同时需要注意的是 yield return 的使用,对于返回或者说是获取可迭代类型,需要这么使用,不能直接使用 return ,表明继续进行下一个操作。相关的关键词是 yield break ,表示返回。总之呢有点类似 continue 和 break 的味道。

yield return new Browser(“Firefox”, path.OpenSubKey(item).GetValue(“”).ToString());

}

if (item.StartsWith(“chrome”, StringComparison.InvariantCultureIgnoreCase)) {yield return new Browser(“Chrome”, path.OpenSubKey(item).GetValue(“”).ToString()); }    // 这里和下面是获取 chrome 和 ie ,和上面的方式一样,添加opera 也是相同的道理。

if (item.StartsWith(“IExplor”, StringComparison.InvariantCultureIgnoreCase)){yield return new Browser(“Internet Explorer”, path.OpenSubKey(item).GetValue(“”).ToString());}

}

}

代码到这里,主要的功能已经实现。关于 jQueryPad++ ,等发布的时候我会单独写一个帖子,目前还有一些WPF方面的小问题需要梳理,看来还是没有达到一种语言通,就所有的语言都会的境界。

分类: 日常 标签: , , ,