avatar
Today is 星期天
2010年09月5日

2008年12月8日

在WINDOWS下编译TBB库

由 晨笛 — 分类目录: C/C++3 条评论

    为了便于在各平台间移植,TBB库用常见的C++模板和编码样式开发,由GNU MAKE工具构建,兼容多种C++编译器,比如gcc、MS VC++、Intel C++ Compiler等。
    在WINDOWS环境下编译TBB库,需要的工具有:

    1、能生成WINDOWS程序的C++编译器,比如Intel C++ Compiler或MS VC++,推举使用Intel C++ Compiler(windows版)。我使用的编译环境是Windows 2003 Server sp2 + Intel Cpp Compiler(Win IA32) v10.1.020 + Visual Studio.Net 2008(VC9)。

    2、GNU MAKE工具。在WINDOWS平台下运行这类工具,略为麻烦,需要搭建一个既能兼容GNU MAKE又能执行Windows程序的环境,常见的Windows下的UNIX模拟环境,比如MinGW、Cygwin等可以满足这一要求。Gygwin运行Windwos程序不是很方便,而且与TBB库的MAKE脚本搭配得不是很好(需要修改一些地方才能通过编译),这里就只介绍如何在MinGW环境中构建TBB库。
    下面先对MinGW做个简单介绍:

    MinGW即Minimalistic GNU for Windows 的缩写,是一个建立在GCC和binutils 项目上的编译器系统。和其它GCC的移植版相比,MinGW可以说是最接近Win32的,因为MinGW几乎支持所有的Win32API,这也是MinGW的特色之一。MinGW所连接的程序,不需要任何第三方库就可以直接在Windows下运行,从这一点来看,MinGW更像是VC的跨平台替代品。MinGW可以从MinGW的官方网站 http://www.mingw.org/ 上获得。
    安装MinGW的过程很简单,有两种方案。

    1、直接从 http://sf.net/project/showfiles.php?group_id=2435 下载各种工具包,然后解压到同一个目录(即你设定的MinGW安装目录)中即可。这种方法的下载速度比较快,也能自由选择工具版本,但是你得对MinGW比较熟悉才行,否则你可能不知道需要下载哪些工具包,以及各种工具包的版本搭配关系。把MinGW各种工具包的最新版本凑合在一起,似乎并不能正常工作,反正我把各种工具包的最新版本混合在一起后,没有成功地构建出TBB库。

    2、下载MinGW-5.1.3.exe(http://downloads.sourceforge.net/mingw/MinGW-5.1.3.exe?modtime=1168811236&big_mirror=1),然后用这个自动安装程序从网络安装MinGW。这种方法操作简单,只要点击需要下载的工具包前面的选择框,然后等待程序运行数个小时候即可安装完毕。

    实际上为了节省时间,我是这样安装的,先用迅雷下载MinGW-5.1.3.exe,随后运行MinGW-5.1.3.exe,当它开始下载工具包时,点击CANCEL退出程序,然后在MinGW-5.1.3.exe的当前目录下找到mingw.ini这个文本文件,查看[current]项下的工具包文件名列表,从中选择需要的工具包名称,然后从 http://sf.net/project/showfiles.php?group_id=2435 网页找到这些工具包URL,再用迅雷下载。用迅雷的好处是,可以从国内IP获得这些工具包文件,十分钟内就可以下载完毕并安装好一个可使用的MinGW环境。

    构建TBB库需要的MinGW工具包有:

    mingw-runtime-3.14.tar.gz
    w32api-3.11.tar.gz
    binutils-2.17.50-20060824-1.tar.gz
    gcc-core-3.4.5-20060117-1.tar.gz
    gcc-g++-3.4.5-20060117-1.tar.gz
    mingw32-make-3.81-2.tar.gz

    安装好MinGW(就是把各种工具包解压到一个目录中那么简单)后,别忘了给Windows环境变量中的PATH变量中添加上你的MinGW安装目录。

    按照上述步骤搭建好MinGW环境后,从开始菜单中运行 Intel C++ Build Environment for applications running on IA-32,进入Intel C++ Compiler命令行编译环境,再进入TBB源代码解压目录(也就是有Makefile文件的那个目录),然后运行mingw32-make.exe即可成功编译出最新版本的TBB库。

2008年12月7日

ACE_DEBUG中的匹配符说明

由 晨笛 — 分类目录: C/C++评论暂缺

/**
* Format a message to the thread-safe ACE logging mechanism.  Valid
* options (prefixed by ‘%’, as in printf format strings) include:
*  – ‘A’: print an ACE_timer_t value (which could be either double
*         or ACE_UINT32.)
*  – ‘a’: abort the program at this point abruptly.
*  – ‘c’: print a character
*  – ‘C’: print a character string
*  – ‘i’, ‘d’: print a decimal number
*  – ‘I’: indent according to nesting depth (obtained from
*         ACE_Trace::get_nesting_indent()).
*  – ‘e’, ‘E’, ‘f’, ‘F’, ‘g’, ‘G’: print a double
*  – ‘l’: print line number where an error occurred.
*  – ‘M’: print the name of the priority of the message.
*  – ‘m’: return the message corresponding to errno value, e.g., as
*         done by strerror()
*  – ‘N’: print file name where the error occurred.
*  – ‘n’: print the name of the program (or “<unknown>” if not set)
*  – ‘o’: print as an octal number
*  – ‘P’: print out the current process id
*  – ‘p’: print out the appropriate errno message from sys_errlist,
*         e.g., as done by perror()
*  – ‘Q’: print out the uint64 number
*  – ‘q’: print out the int64 number
*  – ‘@’: print a void* pointer (in hexadecimal)
*  – ‘r’: call the function pointed to by the corresponding argument
*  – ‘R’: print return status
*  – ‘S’: print out the appropriate _sys_siglist entry corresponding
*         to var-argument.
*  – ’s’: print out a character string
*  – ‘T’: print timestamp in hour:minute:sec:usec format.
*  – ‘D’: print timestamp in month/day/year hour:minute:sec:usec format.
*  – ‘t’: print thread id (1 if single-threaded)
*  – ‘u’: print as unsigned int
*  – ‘w’: prints a wide character
*  – ‘W’: print a wide character string
*  – ‘x’: print as a hex number
*  – ‘X’: print as a hex number
*  – ‘z’: print an ACE_OS::WChar character
*  – ‘Z’: print an ACE_OS::WChar character string
*  – ‘%’: print out a single percent sign, ‘%’
*/

2008年10月24日

IIS中如何添加iso类型文件下载的方法

由 晨笛 — 分类目录: 网络评论暂缺

在Microsoft Internet Information Services (IIS) 即Internet 信息服务中,链接了”iso、gho” 文件类型,但是浏览时点击”iso、gho”文件下载地址,会出现”无法找到该页面”的提示,相关软件也无法下载。
解决办法如下:
1.在 IIS 管理器中,右键单击要为其添加 MIME 类型的网站或网站目录,单击”属性”。
2.单击”HTTP 头”选项卡。
3.单击”MIME 类型”。
4.单击”新建”。
5.在”扩展名”框中,键入文件扩展名:.iso。
6.在”MIME 类型”框中,键入ISO File
7.单击”确定”。
8.添加iso文件后,前台点击,大功告成。
9.若要再增加更多类型,可同样按照此方法修改。

2008年08月25日

发现VS的一个使用技巧

由 晨笛 — 分类目录: C/C++评论暂缺

昨天安装了一下QT的开发包,在安装目录下发现一个环境配置bat文件,打开看了一下,发现一个vs的使用技巧。原来vs的执行程序devenv可以接受命令行参数,通过devenv /?得到了他的帮助信息。

Microsoft (R) Visual Studio 8.0.50727.762 版。
版权所有 (C) Microsoft Corp 1984-2005。保留所有权利。

用法:
devenv  [solutionfile | projectfile | anyfile.ext]  [switches]

devenv 的第一个参数通常是一个解决方案文件或项目文件。如果您希望在编辑器中自动打开文件,也可以使用任何其他文件作为第一个参数。当您输入项目文件时,IDE 会在项目文件的父目录中查找与该项目文件具有相同基名称的 .sln 文件。如果不存在这样的 .sln 文件,IDE 将查找引用该项目的单个 .sln 文件。如果不存在这样的单个.sln 文件,则 IDE 将创建一个具有默认 .sln 文件名且未保存的解决方案,其基名称与项目文件的基名称相同。

命令行编译:
devenv solutionfile.sln /build solutionconfig [ /project projectnameorfile [ /projectconfig name ] ]
可用的命令行开关:

/Build          使用指定的解决方案配置生成解决方案或项目。例如“Debug”。如果可能存在多个平台,则配置名称必须用引号括起来并且包含平台名称。例如“Debug|Win32”。
/Clean          删除生成结果。
/Command        启动 IDE 并执行该命令。
/Deploy         生成并部署指定的生成配置。
/Edit           在此应用程序的运行实例中打开指定文件。如果没有正在运行的实例,则启动一个具有简化窗口布局的新实例。
/LCID           设置 IDE 中用于用户界面的默认语言。
/Log            将 IDE 活动记录到指定的文件以用于故障排除。
/NoVSIP         禁用用于 VSIP 测试的 VSIP 开发人员许可证密钥。
/Out            将生成日志追加到指定的文件中。
/Project        指定生成、清理或部署的项目。必须和 /Build、/Rebuild、/Clean 或 /Deploy 一起使用。
/ProjectConfig  重写解决方案配置中指定的项目配置。例如“Debug”。如果可能存在多个平台,则配置名称必须用引号括起来并包含平台名称。例如“Debug|Win32”。必须和/Project 一起使用。
/Rebuild        先清理,然后使用指定配置生成解决方案或项目。
/ResetAddin     移除与特定外接程序关联的命令和命令用户界面。
/ResetSettings  恢复 IDE 的默认设置,还可以重置为指定的 VSSettings 文件。
/ResetSkipPkgs  清除所有添加到 VSPackages 的 SkipLoading 标记。
/Run            编译并运行指定的解决方案。
/RunExit        编译并运行指定的解决方案然后关闭 IDE。
/SafeMode       以安全模式启动 IDE,加载最少数量的窗口。
/Upgrade        升级项目或解决方案以及其中的所有项目。并相应地创建这些文件的备份。有关备份过程的更多信息,请参见“Visual Studio 转换向导”上的帮助。

产品特定的开关:

/debugexe       打开要调试的指定可执行文件。命令行的其余部分作为它的参数传递到此执行文件。
/useenv         使用 PATH、INCLUDE、LIBPATH 和 LIB 环境变量而不是使用 VC++ 生成的 IDE 路径。

要从命令行附加调试器,请使用:
VsJITDebugger.exe -p <pid>

2008年07月17日

一段有用的NSIS安装程序制作脚本

由 晨笛 — 分类目录: 未分类评论暂缺

; NSIS Modern User Interface version 1.62
;
; NSIS 多语言脚本写作密技
;
; 这是 KA 实地用于 MDaemon 4.05 中文化的多语言安装,
; 环境: NSIS 2.0b1, Modern UI 1.62
;
; 为便于阅读,标明 (* 进阶) 者,较为困难,可先略过。
; 几乎是想办法用上 Modern UI 1.62 新版的所有技巧了。
; 如果注解写得太多,损害你的智商,请赶快写信骂我。
;
; 简体描述部分,因为在 BIG5 编码之下使用 GB2312 ,故
; 必定有乱码,还请见谅。如果需要在网页取得正确编码,
; 请储存为 BIG5 plain text ,再来处理。我会另外以
; attach file 的方式附在板上。
;
; 我没有使用任何类似 GUI 的工具。如果你之前已经有用
; 于 2.0a7 的 NSI 脚本,跨越版本时在 Modern UI 的写
; 法,会花一些工夫。比如新世纪精华板有人用的
; magiclime ,现在只能用 advsplash 以外挂程式方式载入。
; 不用怕,我在里面都写了。如果还嫌太麻烦,Joost 的英
; 文版HTML 入门,只有一页,建议先看。
;
; 记得,没人强迫你要使用多语言,没人强迫你要 Modern
; UI ,没人强迫你要欢迎对话方块。你一样可以做出一点也
; 不花俏的,很传统的安装程式。不要在那里废话什么 NSIS
; 愈做愈肥大。
;
; 这些都是自己决定的。
;

;=======================================================
; ■1.定义变数、安装目录、输出档案、图示
;=======================================================
; 只要在这里写好,其他的都按照定义的变数下去跑,就省力多了。
;
;==============================
; 1.1 版本号码/名称
;
!define VER_1 4 ;软体版本号码 1 ,如 Eudora 4.3.1.2 四位版本号码
!define VER_2 05 ;软体版本号码 2
;!define VER_3 xxx ;软体版本号码 3 (* 进阶)
;!define VER_4 yyy ;软体版本号码 4 (* 进阶)
;!define VER_R zzz ;中文化同版本第几更版 (* 进阶)
!define MUI_PRODUCT “MDaemon” ;程式名称 (可使用大小写)
!define PROGFNHEADER “mdaemon” ;中文化档案名称的主要部分 (全部小写)
!define PROGMAINEXE “mdaemon.exe” ;主程式执行档案名称 (含.exe)
;
;==============================
; 1.2 读我档案/输出档案
;
; 读我显示,包括 CHS/CHT/ENU 三个版本。如果你不需要制作
; 多语言中文化版本,只要考虑一个“读我”即可。这个读我,
; 通常拿来放“此中文化的描述档案”,而非一般软体的 readme 。
;
; 档案命名: (全部小写)。
; (cpatch) c + ${PROGFNHEADER} + 版本号码 _(底线) 第几中文化版本 . 副档名
; (hanzify) ha _(底线) ${PROGFNHEADER} + 版本号码 _(底线) 作者名 . 扩展名
;
;!define README “c${PROGFNHEADER}${VER_1}${VER_2}.txt”
!define README_CHS “c${PROGFNHEADER}${VER_1}${VER_2}_gb.txt”
!define README_CHT “c${PROGFNHEADER}${VER_1}${VER_2}.txt”
!define README_ENU “c${PROGFNHEADER}${VER_1}${VER_2}.txt”
OUTFILE “c${PROGFNHEADER}${VER_1}${VER_2}.exe”

;==============================
; 1.3 预设安装目录 (尾端不加 \)
;
; 通常会出现在 “C:\Program Files\xxxx ” 这种目录。
; 也可以使用 ${AppPath} 在注册表寻找旧版安装目录。
; 如果注册表的安装目录 (尾端 \) 出现,不要使用,以免发生错误。

;InstallDir “$PROGRAMFILES\${MUI_PRODUCT}”
;InstallDir “${AppPath}”
InstallDir “C:\MDaemon”

;==============================
; 1.4 版权影像
;
; 只需要一个就够 (一定要 bmp 格式),第二个是拿来花俏用的。
; 可以只使用一个,或完全不使用。

!define SPLASH1 “mdaeomon4_cht.bmp”
!define SPLASH2 “mdaeomon4_chs.bmp”

;==============================
; 1.5 安装程式型态
;
; 中文化/直接安装版/还是补缀补丁?安装时出现在 caption 部分。
; 解除安装时,也会出现在注册表。

!define PATCHTYPE_ENU “(CN+TW) localized”
!define PATCHTYPE_CHT “(CN+TW) 中文化”
!define PATCHTYPE_CHS “(CN+TW) 笢恅赵”

;=======================================================
; ■2.使用者介面
;=======================================================
; 这一段的用途,在于强制覆写 system.nsh 的英文预设设定值,
; 通常只有变更 “字型”“图示”
;==============================
; 2.1 字型

; 安装介面的字型预设大小 8,一定要改掉,否则在 win98 中文不好看。
; 如下。双语言中文化,使用 “Tahoma” 即可。
; 不需要特别指定“新宋体”或“宋体”。

;!define MUI_FONT “MS Shell Dlg”
;!define MUI_FONTSIZE “8″
;!define MUI_FONT_HEADER “MS Sans Serif”
;!define MUI_FONTSIZE_HEADER “8″
;
; 上列: NSIS 字型“预设值”,下列: 字型“建议修改值”。
;
!define MUI_FONT “Tahoma”
!define MUI_FONTSIZE “9″
!define MUI_FONT_HEADER “Tahoma”
!define MUI_FONTSIZE_HEADER “9″

;==============================
; 2.2 图示

; 安装程式图示: 通常我使用主程式的图示,另外用 VC 抽取出来。
; 解除安装图示: 为了让 [控制台 | 新增/移除程式] 出现正确图示,还是用同一个图示。
; 有时候则使用它附的图示 (因为看起来不错)。
;!define MUI_ICON “${NSISDIR}\Contrib\Icons\modern-install.ico”
;!define MUI_UNICON “${NSISDIR}\Contrib\Icons\modern-uninstall.ico”
;
; 上列: NSIS 图示“预设值”,风格有点像 InstallShield 6 ,也不错。
; 下列: 自订图示,请指定正确名称

!define MUI_ICON “mdaemon4.ico”
!define MUI_UNICON “mdaemon4.ico”

;==============================
; 2.3 其他 (* 进阶)

!define MUI_UI “${NSISDIR}\Contrib\UIs\modern2.exe”
!define MUI_CHECKBITMAP “${NSISDIR}\Contrib\Icons\modern.bmp”
!define MUI_FONTstyle_HEADER “700″
!define MUI_FONT_TITLE “Verdana”
!define MUI_FONTSIZE_TITLE “12″
!define MUI_FONTstyle_TITLE “700″
!define MUI_INSTALLCOLORS “/windows”
!define MUI_PROGRESSBAR “smooth”
!define MUI_SPECIALINI “${NSISDIR}\Contrib\Modern UI\ioSpecial.ini”
!define MUI_SPECIALBITMAP “${NSISDIR}\Contrib\Icons\modern-wizard.bmp”
!define MUI_BGCOLOR “0xFFFFFF”

;=======================================================
; ■3.多语言系统
;=======================================================
; 载入 Modern UI\System.nsh 之用。
;==========================
; 3.1 前置相同变数,视需要而定。
;
; 通常出现在更换版本时,原脚本的变数校正。

!define MUI_VERSION “${VER_1}.${VER_2}”
;!define NAME “${MUI_PRODUCT}”

;显示中文化标题,依 ENU/CHT/CHS 语言的不同。

CAPTION /LANG=1033 “${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_ENU}”
CAPTION /LANG=1028 “${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_CHT}”
CAPTION /LANG=2052 “${MUI_PRODUCT} ${MUI_VERSION} ${PATCHTYPE_CHS}”

;==========================
; 3.2 载入 Modern UI 系统

!include “${NSISDIR}\Contrib\Modern UI\System.nsh”

;==========================
; 3.3 使用者介面
;
; 如果不要这些对话方块,不做 define ,就不会出现。

!define MUI_WELCOMEPAGE ;欢迎页面
!define MUI_LICENSEPAGE ;授权页面
!define MUI_COMPONENTSPAGE ;元件页面
!define MUI_DIRECTORYPAGE ;目录选择
!define MUI_ABORTWARNING ;中止警告
!define MUI_UNINSTALLER ;解除安装程式
!define MUI_UNCONFIRMPAGE ;不做确认页面
; !define MUI_STARTMENUPAGE ;选择开始功能表
!define MUI_FINISHPAGE ;出现完成页面,执行程式和读我。
!define MUI_FINISHPAGE_RUN “$INSTDIR\app\${PROGMAINEXE}”
!define MUI_FINISHPAGE_SHOWREADME “$INSTDIR\${README_CHT}”
; !define MUI_FINISHPAGE_SHOWREADME “$INSTDIR\$(README)”

; LangString README ${LANG_ENGLISH} “${README_ENU}”
; LangString README ${LANG_TRADCHINESE} “${README_CHT}”
; LangString README ${LANG_SIMPCHINESE} “${README_CHS}”
; 上面这段 LangString 并不能套用在 SHOWREADME ,真奇怪。

!insertmacro MUI_SYSTEM ;使用者介面系统

;==============================
; 3.4 各国语言

!insertmacro MUI_LANGUAGE “English”
!insertmacro MUI_LANGUAGE “SimpChinese”
!insertmacro MUI_LANGUAGE “TradChinese”

;==============================
; 3.5 授权文字 (* 进阶)
;
; 这些档案没有出现在 NSIS 预设包内。如果你手上没有 license 档案,
; 请直接 remark 掉。
; 这些东西会先被解压缩出来。保留这几行在任何 File 指令之前!)
; 只能用于 BZIP2 压缩

LicenseData /LANG=${LANG_ENGLISH} “${NSISDIR}\Examples\Modern UI\license_enu.rtf”
LicenseData /LANG=${LANG_SIMPCHINESE} “${NSISDIR}\Examples\Modern UI\license_chs.rtf”
LicenseData /LANG=${LANG_TRADCHINESE} “${NSISDIR}\Examples\Modern UI\license_cht.rtf”

!insertmacro MUI_RESERVEFILE_LANGDLL

;=======================================================
; ■4.安装程式,安装开始的前置动作 (* 进阶)
;=======================================================
; 如果不需要,你可以全部 remark。
Function .onInit

;==============================
; 4.1 显示版权影像
;
; 旧版可使用 magiclime 做淡入淡出。不过这一版没了,改成
; advsplash ,外挂方式。解压缩到临时目录,显示 splash ,然后删掉。
; 注意: nsis 2.0a0 有 magicsplash 档案。不过 2.0b1 居然又不见了。

SetOutPath $TEMP
File /oname=splash1.bmp ${SPLASH1}
File /oname=splash2.bmp ${SPLASH2}
; File /oname=spltmp.exe “${NSISDIR}\bin\magiclime.exe”
; ExecWait ‘”$TEMP\spltmp.exe” splash1.bmp’
; ExecWait ‘”$TEMP\spltmp.exe” splash2.bmp’

advsplash::show 1000 600 400 -1 $TEMP\splash1
advsplash::show 1000 600 400 -1 $TEMP\splash2

Pop $0 ; $0 has ‘1′ if the user closed the splash screen early,
; ‘0′ if everything closed normal, and ‘-1′ if some error occured.

Delete $TEMP\spltmp.exe
Delete $TEMP\splash1.bmp
Delete $TEMP\splash2.bmp

;==============================
; 4.2 字型选择 (* 进阶)
;
; 只影响安装程式的语言选择 dialog ,因此不要使用中文字型名称。
Push Verdana
Push 9

;==============================
; 4.3 语言 (* 进阶)
;
; 塞了 ENU/CHT/CHS 三个语言。你要 18 个语言全塞,也不反对。大小大概增加 20 kb 左右。
; 如果不是多语言中文化安装,你可以全部 remark 掉。

!insertmacro MUI_LANGDLL_PUSH “English”
!insertmacro MUI_LANGDLL_PUSH “SimpChinese”
!insertmacro MUI_LANGDLL_PUSH “TradChinese”

Push 3F ;3 = 语言数目, F = 变更字型

LangDLL::LangDialog “Installer Language” “Please select a language.”

; 上面这一句,不要中文化。除非你想让老外看到乱码。

Pop $LANGUAGE
StrCmp $LANGUAGE “cancel” 0 +2
Abort

;==============================
; 4.4 安装前置动作 (修改注册表) (* 进阶)
;
; 视你需要,可以偷偷做一些动作。

; DeleteRegKey HKLM “SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32″
; DeleteRegKey HKLM “SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}”

;==============================
; 4.5 寻找旧版已安装的目录。 (* 进阶)
;
; 如果 AppPath 读出的尾端有 \ 符号,请不要直接使用于 INSTDIR 指令,以免发生错误。

; ReadRegStr $AppPath HKLM “SOFTWARE\Alt-N Technologies\MDaemon” “AppPath”

FunctionEnd

;=======================================================
; ■5.安装程式,安装完成后置动作 (* 进阶)
;=======================================================
; 如果不需要,你可以全部 remark。
;==============================
; 5.1 函式定义开始
Function .onInstSuccess

;==============================
; 5.2 安装完成后,执行 ExecShell
;
; 视个人需要而定,我只用在 Eudora 安装而已。
; ;——————————————
; !macro MUI_INSTSUCCESS1 LANGID TEXT
;
; StrCmp $LANGUAGE ${LANGID} “” +3
; MessageBox MB_YESNO|MB_ICONQUESTION “${TEXT}” IDNO Nomapi
; ExecShell open ‘$INSTDIR\SWMAPI.EXE’
; !macroend
; ;——————————————;

; 下列是 ENU/CHT/CHS 三个语言的动作。
;
; !insertmacro MUI_INSTSUCCESS1 1033 “Do you want to install ${NAME} as a default mailer? It will excute MAPI installer.”
; !insertmacro MUI_INSTSUCCESS1 1028 “你想要安装 ${NAME} 做为预设信件程式吗?将执行外部 MAPI 安装程式。”
; !insertmacro MUI_INSTSUCCESS1 2052 “斓砑猁假蚾 ${NAME} 酕峈苏?;蛔璃最唗镉ˋ蔚堍俴俋窒 MAPI 假蚾最唗﹝”
; Nomapi:

;==============================
; 5.3 安装后,要求使用者读取 README 档案

; ;——————————————
; !macro MUI_INSTSUCCESS2 LANGID TEXT README

; StrCmp $LANGUAGE ${LANGID} “” +3
; MessageBox MB_YESNO|MB_ICONQUESTION “${TEXT}” IDNO NoReadme
; ExecShell open notepad ‘$INSTDIR\${README}’
; !macroend
; ;——————————————

; 下列是 ENU/CHT/CHS 三个语言的动作。

; !insertmacro MUI_INSTSUCCESS2 1033 “Setup has been completed successfully . Press [Yes] to continue README file.” “${README_ENU}”
; !insertmacro MUI_INSTSUCCESS2 1028 “安装已成功地完成。按下 [Yes] 继续读取 README 档案。” “${README_CHT}”
; !insertmacro MUI_INSTSUCCESS2 2052 “假蚾眒伧髡华俇伧﹝偌狟 [Yes] 樟哿黍?; README 恅璃﹝” “${README_CHS}”
; NoReadme:

;==============================
; 5.4 函式定义结束
FunctionEnd

;=======================================================
; ■6.安装的所有档案
;=======================================================

;==============================
; 6.1 安装类型

; 两种应该很够了。

InstType “Minimum”
InstType “Standard”

SetOverwrite on

;==============================
; 6.3 安装的各个节段

Section “MDaemon” SecMDaemon
SectionIn 1 2

; 6.3.1 中文化的读我
; 通常塞在安装的主目录。

SetOutPath $INSTDIR
File “${README_CHT}”
File “${README_CHS}”

; 6.3.2 中文化的程式档案

; 通常不使用 *.* 型态,而个别指定,以免包装错误。
; 常常是 *.DLL *.EXE *.AX 等类型。我都把这类放在 cht 为首的工作目录。

SetOutPath $INSTDIR\app
File “cht\AccountPrune.exe”
File “cht\CFILTER.EXE”
File “cht\IMPORTNT.EXE”
File “cht\ListPrune.exe”
File “cht\MD3CONV.EXE”
File “cht\MDAEMON.EXE”
File “cht\MDCONFIG.EXE”
File “cht\MDLAUNCH.EXE”
File “cht\MDSTATS.EXE”
File “cht\MDUSER.DLL”
File “cht\MDUserLdap.dll”
File “cht\MigrateUsers.exe”
File “cht\ROBOEX32.DLL”
File “cht\UninstallSurvey.exe”
File “cht\UNWISE.EXE”
File “cht\WCIMPORT.EXE”
File “cht\XCEEDZIP.DLL”

; 6.3.3 中文化的文字档案
;
; 通常是 (*.cnt, *.txt *.dat *.ini) 类型。
; 无语言区分者,仍放在 pack 为首的工作目录。
; 有语言区分者,放在 text/cht 与 text/chs 为首的工作目录。

; 6.3.3.1 如果有旧版,会有一些“一定”要删除的旧版档案。然后再由安装程式补上新版。

SetOutPath $INSTDIR\app
Delete “$INSTDIR\app\HELP.DAT”
Delete “$INSTDIR\app\MDAEMON.CNT”
Delete “$INSTDIR\app\acctinfo.dat”

File “pack405\app\CFILTER.INI”
File “pack405\app\MDSTATS.INI”

; 6.3.3.2 如果有旧版,也会有一些“不能删除”的旧版档案。

; 这段是使用在 UltraEdit ,把 windows 目录的 INI 移动过来。MDaemon 不用这一段。
;
; IfFileExists “$WINDIR\UEdit32.ini” DO1 DO2
; DO1: ;把 $WINDIR 的移动到安装目录
; Rename “$WINDIR\UEdit32.ini” “$INSTDIR\Uedit32.ini”
; DO2: ;如果没有,则写入一个假的 INI,以修正 HTMLTIDY 的功能。如果安装目录已有,则不盖掉。

SetOverwrite off ;停用强制覆写
File “pack405\app\MDAEMON.INI”
SetOverwrite on ;判断完毕之后,启用强制覆写

; 6.3.3.3 搞一些好玩的,比如塞入自动使软体注册的资料
; 正式版本就不要这样做,以免太嚣张,反而不好。
;
; WriteINIStr “$INSTDIR\app\mdaemon.ini” “Registration” “Name” “My_reg_Name”
; WriteINIStr “$INSTDIR\app\mdaemon.ini” “Registration” “Company” “My_reg_Company”
; WriteINIStr “$INSTDIR\app\mdaemon.ini” “Registration” “4XKey” “GDPFFMF-QAWLYFJ-XQDIYAO”

; 6.3.3.4 补上新版档案
;
; 依照各种语言,自动执行,分配正确的档案。使用者不必再选择。
; 先写一个巨集,自动判断作业系统语言。 1033 enu, 1028 cht, 2052 chs
;——————————————
!macro MUI_COPYTEXTFILE LANGID ACTION_COPYTEXTFILE

StrCmp $LANGUAGE ${LANGID} “” +3
${ACTION_COPYTEXTFILE}

!macroend

; !insertmacro MUI_COPYTEXTFILE 1033 ‘File “text405\enu\Help.dat”‘
; !insertmacro MUI_COPYTEXTFILE 1033 ‘File “text405\enu\MDaemon.cnt”‘
;
; 英文的不动,只做为对照组。注意单引号和双引号。
; 这种脚本写法其实蛮笨的,应该有更好的方法。

!insertmacro MUI_COPYTEXTFILE 1028 ‘File “text405\cht\Help.dat”‘
!insertmacro MUI_COPYTEXTFILE 1028 ‘File “text405\cht\MDaemon.cnt”‘
!insertmacro MUI_COPYTEXTFILE 2052 ‘File “text405\chs\Help.dat”‘
!insertmacro MUI_COPYTEXTFILE 2052 ‘File “text405\chs\MDaemon.cnt”‘

; 6.3.4 非中文化档案 (不用修改的部分)

; 可使用 *.* 这种型态。 我都把这类放在 pack 为首的工作目录。

SetOutPath $INSTDIR\app
File “pack405\app\AccountPrune.txt”
File “pack405\app\bwcc32.dll”
File “pack405\app\ADDUSER.SMP”
File “pack405\app\CFAPP.ICO”
File “pack405\app\CFILTER.DLL”
File “pack405\app\DEDUPE.EXE”
File “pack405\app\DIRREORG.EXE”
File “pack405\app\DomainPOP.dsc”
File “pack405\app\EDITUSER.SMP”
File “pack405\app\FILELIST.DAT”
File “pack405\app\INETWH32.DLL”
File “pack405\app\INSTALL.LOG”
File “pack405\app\MailboxSize.exe”
File “pack405\app\MailboxSize.txt”
File “pack405\app\MDAEMON.DSC”
File “pack405\app\MDAEMON.HLP”
File “pack405\app\NTUTIL.DLL”
File “pack405\app\ULREPAIR.EXE”
File “pack405\app\WISECHCK.EXE”
File “pack405\app\WISEUPDT.EXE”
File “pack405\app\WP2WC.EXE”
File “pack405\app\XCDSFX32.BIN”

SetOutPath $INSTDIR\cgi
File “pack405\cgi\*.*”
SectionEnd

Section “MDaemon Docs” SecMDaemonDocs
SectionIn 2
SetOutPath $INSTDIR\docs
File “pack405\docs\*.*”
SetOutPath $INSTDIR\docs\api
File “pack405\docs\api\*.*”
SectionEnd

Section “World Client” SecWorldClient
SectionIn 2
SetOutPath $INSTDIR\wcstandard
File “pack405\wcstandard\*.*”
; 底下为需要中文化的部分
File “cht\wcstandard\WCStandard.exe”
File “cht\wcstandard\WorldClient.dll”
File “cht\wcstandard\XceedZip.dll”

SetOutPath $INSTDIR\wcstandard\html
File “pack405\wcstandard\html\*.*”
SetOutPath $INSTDIR\wcstandard\html\help
File “pack405\wcstandard\html\help\*.*”
SetOutPath $INSTDIR\wcstandard\templates
File “pack405\wcstandard\templates\*.*”
SectionEnd

Section “Web Config” SecWebConfig
SectionIn 2
SetOutPath $INSTDIR\webconfig
File “pack405\webconfig\*.*”
; 底下为需要中文化的部分
File “cht\webconfig\WebConfig.exe”

SetOutPath $INSTDIR\webconfig\html
File “pack405\webconfig\html\*.*”
SetOutPath $INSTDIR\webconfig\templates
File “pack405\webconfig\templates\*.*”
SectionEnd

;==============================
; 6.4 加入到“开始选单”
;

Section “Add shortcut to Start Menu” SecStartMenu
SectionIn 1 2
SetOutPath “$INSTDIR”

CreateDirectory “$SMPROGRAMS\${MUI_PRODUCT}”
; 有时候 CreateShortCut 会出问题,不如用这个动作
; 直接强制 installer 建立目录。这样比较贱。

CreateShortCut “$SMPROGRAMS\${MUI_PRODUCT}\MDaemon.lnk” \
“$INSTDIR\app\mdaemon.exe”
CreateShortCut “$SMPROGRAMS\${MUI_PRODUCT}\MDConfig.lnk” \
“$INSTDIR\app\MDConfig.exe”
CreateShortCut “$SMPROGRAMS\${MUI_PRODUCT}\Uninstall ${MUI_PRODUCT}.lnk” \
“$INSTDIR\Uninstall.exe”
SectionEnd

;==============================
; 6.5 加入到“快速启动”
;
; 不是每个程式都要加入“快速启动”列,视需要而定。
;
;Section “Add shortcut to Quicklaunch” SecQuicklaunch
; SectionIn 1 2
; CreateShortCut “$QUICKLAUNCH\${MUI_PRODUCT}.lnk” \
; “$INSTDIR\app\${PROGMAINEXE}”
;SectionEnd

;==============================
; 6.6 加入到“桌面”
;

Section “Add shortcut to Desktop” SecDesktop
SectionIn 1 2
CreateShortCut “$DESKTOP\${MUI_PRODUCT}.lnk” \
“$INSTDIR\app\${PROGMAINEXE}”
SectionEnd

;==============================
; 6.6 加入到“滑鼠右键” (* 进阶)
;
; 只用在 UltraEdit

;Section “Add to Right mouse button” SecRightMouse
; SectionIn 1 2
; WriteRegStr HKLM “SOFTWARE\Classes\*\shellex\ContextMenuHandlers\UltraEdit-32″ “” “{b5eedee0-c06e-11cf-8c56-444553540000}”
; WriteRegStr HKLM “SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}” “” “UltraEdit-32″
; WriteRegStr HKLM “SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32″ “” “$INSTDIR\ue32ctmn.dll”
; WriteRegStr HKLM “SOFTWARE\Classes\CLSID\{b5eedee0-c06e-11cf-8c56-444553540000}\InProcServer32″ “ThreadingModel” “Apartment”
;SectionEnd

;=======================================================
; ■7.写入解除安装程式
;=======================================================
; 如果你嫌太难,可以不写解除安装程式,全部 remark 掉。
;==============================
; 7.1 节段开始

Section “Create Uninstaller” SecCreateUninst
SectionIn 1 2

;==============================
; 7.2 写入到“注册表”(基础)
;
; 一般只有写下面这一段,指定安装目录。

WriteRegStr HKLM “SOFTWARE\${MUI_PRODUCT}” “Install_Dir” “$INSTDIR”
WriteRegStr HKLM “SOFTWARE\${MUI_PRODUCT}” “Installer Language” $LANGUAGE

;==============================
; 7.3 写入到“注册表” (* 进阶)
;
; 下面这段注册表值,只是在 {控制台 | 新增移除程式] 花俏用的。
; 如果看不懂,可以全部不使用。
; 参考 http://leoboard.cpatch.org/cgi-bin/topic.cgi?forum=2&topic=24&show=0
;
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“DisplayIcon” “$INSTDIR\app\${PROGMAINEXE}”
; “DisplayIcon” “$INSTDIR\${PROGMAINEXE}” ; 一般使用这个型态。只有 MDaemon 例外。
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“DisplayName” “${MUI_PRODUCT} ${VER_1}.${VER_2} ${PATCHTYPE_ENU}”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“DisplayVersion” “${VER_1}.${VER_2}”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“UninstallString” “$INSTDIR\uninstall.exe”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“URLInfoAbout” “http://www.altn.com/Products/Default.asp?product_id=MDaemon”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“Contact” “kiiali@cpatch.org”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“HelpLink” “http://www.altn.com/Support/Default.asp?product_id=MDaemon”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“URLUpdateInfo” “http://www.altn.com/Download/Default.asp”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“Readme” “$INSTDIR\${README_CHT}”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“Comments” “Chinese (P.R.C.) and Chinese (Taiwan) ${MUI_PRODUCT} localized version by Kii Ali, for Mailer Daemon with win32 plateform.”
WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” \
“Publisher” “Copyright (c) 2002, Alt-N Technology.”

;==============================
; 7.4 依照各种语言,自动写入不同的注册表值 (* 进阶)
; 包括 ENU/CHT/CHS
;——————————————
!macro MUI_REGMUI1 LANGID TEXT

StrCmp $LANGUAGE ${LANGID} “” +3
${TEXT}

!macroend

!insertmacro MUI_REGMUI1 1033 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Comments” “Chinese (P.R.C.) and Chinese (Taiwan) ${MUI_PRODUCT} localized version by Kii Ali, for Mailer Daemon with win32 plateform.” ‘
!insertmacro MUI_REGMUI1 1028 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Comments” “中文 (中国大陆) 与 中文 (台湾) ${MUI_PRODUCT} 本地化版本,由 Kii Ali 制作,用于 win32 平台架设个人或公司的信件伺服器。” ‘
!insertmacro MUI_REGMUI1 2052 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Comments” “笢恅 (笢弊湮翻) 迵 笢恅 (怢俜) ${MUI_PRODUCT} 挂华赵唳挂ㄛ蚕 Kii Ali 秶钎ㄛ蚚衾 win32 Ⅸ;怢殇扢跺?;么鼠侗腔蛔璃督昢け;﹝” ‘

;==============================
; 7.5 依照各种语言,自动写入不同的注册表值 (* 进阶)
; 包括 ENU/CHT/CHS
;——————————————
!macro MUI_REGMUI2 LANGID TEXT

StrCmp $LANGUAGE ${LANGID} “” +3
${TEXT}

!macroend
!insertmacro MUI_REGMUI2 1033 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Publisher” “Copyright (c) 2002, Alt-N Technology.” ‘
!insertmacro MUI_REGMUI2 1028 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Publisher” “版权所有 (c) 2002, Alt-N Technology. ” ‘
!insertmacro MUI_REGMUI2 2052 ‘WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}” “Publisher” “唳?;垀衄 (c) 2002, Alt-N Technology.” ‘
;——————————————

;==============================
; 7.6 现在写入“解除安装程式”

; 写入语言名称到注册表 (用于解除安装程式)
WriteRegStr HKLM “Software\${MUI_PRODUCT}” “Installer Language” $LANGUAGE
WriteUninstaller “$INSTDIR\Uninstall.exe”

SectionEnd

;==============================
; 7.8 显示“完成”标头

;如果不想使用“完成”页面,在这个巨集之后插入。

!insertmacro MUI_SECTIONS_FINISHHEADER

;=======================================================
; ■8.描述功能
;=======================================================
;==============================
; 8.1 描述功能的巨集 (* 进阶)
;
; 如果有描述,最好一个一个加入巨集。
; 这一段要在所有的 section 之后,否则会出现“变数名称没有找到”。
; 如果 MUI_FUNCTIONS_DESCRIPTION_BEGIN 拆成两段,会变成重覆呼叫,而导致错误。

!insertmacro MUI_FUNCTIONS_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecMDaemon} $(DESC_SecMDaemon)
!insertmacro MUI_DESCRIPTION_TEXT ${SecMDaemonDocs} $(DESC_SecMDaemonDocs)
!insertmacro MUI_DESCRIPTION_TEXT ${SecWorldClient} $(DESC_SecWorldClient)
!insertmacro MUI_DESCRIPTION_TEXT ${SecWebConfig} $(DESC_SecWebConfig)
!insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenu} $(DESC_SecStartMenu)
; !insertmacro MUI_DESCRIPTION_TEXT ${SecQuicklaunch} $(DESC_SecQuicklaunch)
!insertmacro MUI_DESCRIPTION_TEXT ${SecDesktop} $(DESC_SecDesktop)
!insertmacro MUI_DESCRIPTION_TEXT ${SecCreateUninst} $(DESC_SecCreateUninst)
; !insertmacro MUI_DESCRIPTION_TEXT ${SecRightMouse} $(DESC_SecRightMouse)
!insertmacro MUI_FUNCTIONS_DESCRIPTION_END
;
;==============================
; 8.2 每个节段的描述文字,直接使用各国语言 (* 进阶)
;
; 这是让滑鼠移动到安装项目上时,自动出现的描述功能。
; 我使用 ENU/CHT/CHS 三个语言。如果嫌麻烦,可以只使用一个语言,甚至不使用描述。

LangString DESC_SecMDaemon ${LANG_ENGLISH} “MDaemon Server Main Prog”
LangString DESC_SecMDaemonDocs ${LANG_ENGLISH} “Related Documents, manuals”
LangString DESC_SecWorldClient ${LANG_ENGLISH} “Server: reading your emails on browser”
LangString DESC_SecWebConfig ${LANG_ENGLISH} “config server on browser”
LangString DESC_SecStartMenu ${LANG_ENGLISH} “Add icon to Start Menu”
LangString DESC_SecQuicklaunch ${LANG_ENGLISH} “Add icon to QuickLaunch”
LangString DESC_SecDesktop ${LANG_ENGLISH} “Add icon to Desktop”
LangString DESC_SecRightMouse ${LANG_ENGLISH} “Add function of mouse right-click”
LangString DESC_SecCreateUninst ${LANG_ENGLISH} “Create Uninstaller”

LangString DESC_SecMDaemon ${LANG_TRADCHINESE} “MDaemon 伺服器主程式”
LangString DESC_SecMDaemonDocs ${LANG_TRADCHINESE} “相关的文件、手册”
LangString DESC_SecWorldClient ${LANG_TRADCHINESE} “浏览器网页读取信件的伺服器”
LangString DESC_SecWebConfig ${LANG_TRADCHINESE} “在浏览器组态伺服器”
LangString DESC_SecStartMenu ${LANG_TRADCHINESE} “加入图示到开始功能表”
LangString DESC_SecQuicklaunch ${LANG_TRADCHINESE} “加入图示到快速启动列”
LangString DESC_SecDesktop ${LANG_TRADCHINESE} “加入图示到桌面”
LangString DESC_SecRightMouse ${LANG_TRADCHINESE} “加入滑鼠右键功能”
LangString DESC_SecCreateUninst ${LANG_TRADCHINESE} “建立解除安装程式”

LangString DESC_SecMDaemon ${LANG_SIMPCHINESE} “MDaemon 督昢け;翋最唗”
LangString DESC_SecMDaemonDocs ${LANG_SIMPCHINESE} “眈寿腔恅璃﹜忒聊”
LangString DESC_SecWorldClient ${LANG_SIMPCHINESE} “銡拟け;厍珜黍?;蛔璃腔督昢け;”
LangString DESC_SecWebConfig ${LANG_SIMPCHINESE} “婓銡拟け;餍离督昢け;”
LangString DESC_SecStartMenu ${LANG_SIMPCHINESE} “氖楼芞梓善※羲宎§粕等”
LangString DESC_SecQuicklaunch ${LANG_SIMPCHINESE} “氖楼芞梓善办厒ぎ;雄蹈”
LangString DESC_SecDesktop ${LANG_SIMPCHINESE} “氖楼芞梓善袤拨”
LangString DESC_SecRightMouse ${LANG_SIMPCHINESE} “氖楼扷梓衵莹髡夔”
LangString DESC_SecCreateUninst ${LANG_SIMPCHINESE} “斐膘贱壶假蚾最唗”

;=======================================================
; ■9.解除安装程式,真正的动作
;=======================================================
; 这个部分,和前面的建立 CreateUninst ,意味不一样喔。
; 前者: 把 uninstaller 程式做出来。
; 后者: 指定这个程式,要删除那些档案/目录/注册表项。
;==============================
; 9.1 节段开始

Section “Uninstall”

; 要移除掉解除安装程式
Delete “$INSTDIR\Uninstall.exe”
; 移除档案
Delete “$INSTDIR\App\*.*”
Delete “$INSTDIR\Logs\*.*”
Delete “$INSTDIR\docs\api\CreateUser\*.*”
Delete “$INSTDIR\docs\api\IterateUsers\*.*”
Delete “$INSTDIR\docs\api\Sample COM\MDUserEdit\*.*”
Delete “$INSTDIR\docs\api\Sample COM\*.*”
Delete “$INSTDIR\docs\api\*.*”
Delete “$INSTDIR\docs\*.*”
Delete “$INSTDIR\cgi\*.*”
Delete “$INSTDIR\ARCHIVES\*.*”
Delete “$INSTDIR\BACKUP\*.*”
Delete “$INSTDIR\BADMSGS\*.*”
Delete “$INSTDIR\CFILTER\*.*”
Delete “$INSTDIR\DIGESTS\*.*”
Delete “$INSTDIR\GATEWAYS\*.*”
Delete “$INSTDIR\LOCALQ\LNDOMAIN\*.*”
Delete “$INSTDIR\LOCALQ\*.*”
Delete “$INSTDIR\LOGS\*.*”
Delete “$INSTDIR\PUBLIC~1\*.*”
Delete “$INSTDIR\RAWFILES\*.*”
Delete “$INSTDIR\REMOTEQ\RETRY\*.*”
Delete “$INSTDIR\REMOTEQ\*.*”
Delete “$INSTDIR\SMTPIN\*.*”
Delete “$INSTDIR\WCstandard\HTML\help\*.*”
Delete “$INSTDIR\WCstandard\HTML\*.*”
Delete “$INSTDIR\WCstandard\Temp\*.*”
Delete “$INSTDIR\WCstandard\Templates\*.*”
Delete “$INSTDIR\WCstandard\*.*”
Delete “$INSTDIR\webconfig\HTML\*.*”
Delete “$INSTDIR\webconfig\Temp\*.*”
Delete “$INSTDIR\webconfig\Templates\*.*”
Delete “$INSTDIR\webconfig\*.*”
Delete “$INSTDIR\*.*”

; 移除开始功能表、桌面、快递启动等捷径。
Delete “$SMPROGRAMS\${MUI_PRODUCT}\*.*”
Delete “$DESKTOP\${MUI_PRODUCT}.lnk”
Delete “$QUICKLAUNCH\${MUI_PRODUCT}.lnk”
RMDir “$SMPROGRAMS\${MUI_PRODUCT}”

; 移除使用过的目录。
RMDir “$INSTDIR\App”
RMDir “$INSTDIR\Logs”
RMDir “$INSTDIR\docs\api\CreateUser”
RMDir “$INSTDIR\docs\api\IterateUsers”
RMDir “$INSTDIR\docs\api\Sample COM\MDUserEdit”
RMDir “$INSTDIR\docs\api\Sample COM”
RMDir “$INSTDIR\docs\api”
RMDir “$INSTDIR\docs”
RMDir “$INSTDIR\cgi”
RMDir “$INSTDIR\ARCHIVES”
RMDir “$INSTDIR\BACKUP”
RMDir “$INSTDIR\BADMSGS”
RMDir “$INSTDIR\CFILTER”
RMDir “$INSTDIR\DIGESTS”
RMDir “$INSTDIR\GATEWAYS”
RMDir “$INSTDIR\LOCALQ\LNDOMAIN”
RMDir “$INSTDIR\LOCALQ”
RMDir “$INSTDIR\LOGS”
RMDir “$INSTDIR\PUBLIC~1″
RMDir “$INSTDIR\RAWFILES”
RMDir “$INSTDIR\REMOTEQ\RETRY”
RMDir “$INSTDIR\REMOTEQ”
RMDir “$INSTDIR\SMTPIN”
RMDir “$INSTDIR\WCstandard\HTML\help”
RMDir “$INSTDIR\WCstandard\HTML”
RMDir “$INSTDIR\WCstandard\Temp”
RMDir “$INSTDIR\WCstandard\Templates”
RMDir “$INSTDIR\WCstandard”
RMDir “$INSTDIR\webconfig\HTML”
RMDir “$INSTDIR\webconfig\Temp”
RMDir “$INSTDIR\webconfig\Templates”
RMDir “$INSTDIR\webconfig”
RMDir “$INSTDIR”

; 删除 windows 注册表之中的安装路径
DeleteRegKey HKLM SOFTWARE\${MUI_PRODUCT}

; 删除 windows 注册表的解除安装
DeleteRegKey HKLM “Software\Microsoft\Windows\CurrentVersion\Uninstall\${MUI_PRODUCT}”

; 删除 uninstaller 使用的语言名称 (* 进阶)
DeleteRegvalue HKLM “Software\${MUI_PRODUCT}” “Installer Language”

;显示“完成”标头 (* 进阶)
!insertmacro MUI_UNFINISHHEADER

SectionEnd

;==============================
; 9.2 解除安装程式,初始化函式动作 (* 进阶)

Function un.onInit

;从注册表取得语言名称
ReadRegStr $LANGUAGE HKLM “Software\${MUI_PRODUCT}” “Installer Language”

FunctionEnd

;=======================================================
; ■eof 档案结尾

2008年06月26日

盖茨27日正式退休

由 晨笛 — 分类目录: 杂记评论暂缺

http://tech.163.com/special/00092P74/Billgates2008.html

2008年06月25日

深入研究表单提交方式–GET/POST

由 晨笛 — 分类目录: 网络评论暂缺

本文平台:Windows 2000 Professional + Apache 1.3.17 + Perl 5.6.1 + Internet Explorer 5.00.2920.0000

  大家知道目前表单提交的方式有GET和POST。我在这里不多说什么,给大家看一个以GET方式提交的表单的请求:

GET /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://localhost//other.html
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost:8080
Connection: Keep-Alive

  这个请求是我们通过这个HTML代码发出的:

<form action=http://localhost:8080/cgi-bin/tech/method.cgi method=GET>
<input type=text size=10 value=GET name=GET>
<input type=submit value=GET方式>
</form>

  这个请求已经超出了我们研究的范围,我们只研究其中的第一行。其中,第一个GET说出了提交的方式,是以GET方式提交的;中间的就是提交给服务器上哪个程序,前面一部分/cgi-bin/tech/method.cgi就是我们HTML的form中action的内容,而后面的GET=GET就是HTML的form中,input的内容:我们发现IE已经把这个表单的内容转换成特定格式了。在Perl中,通过$GET=$ENV{QUERY_STRING}获得以GET发送的数据。

  我们再看一个以POST方式提交的表单的请求:

POST /cgi-bin/tech/method.cgi HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://localhost//other.html
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost:8080
Content-Length: 9
Connection: Keep-Alive

POST=POST

  同样给出HTML:

<form action=http://localhost:8080/cgi-bin/tech/method.cgi method=POST>
<input type=text size=10 value=POST name=POST>
<input type=submit value=POST方式>
</form>

  我们发现其中的数据跑到了最下面。在Perl中,通过read(STDIN,$POST,$ENV{CONTENT_LENGTH})获得以POST发送的数据。我记得GET发送数据最多只能1024字节,而POST好像很大很大!

  思考:如果我有这么一段HTML代码,它将会出现什么问题呢?

<form action=http://localhost:8080/cgi-bin/tech/method.cgi?GET=GET method=POST>
<input type=text size=10 value=POST name=POST>
<input type=submit value=GET/POST方式>
</form>

  这个代码在很多程序上可能用到过,但是大多数人不会好好的想一想,究竟哪些内容是以GET发送的,哪些内容是以POST发送的。我们看看它的请求是什么:

POST /cgi-bin/tech/method.cgi?GET=GET HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://localhost//other.html
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: localhost:8080
Content-Length: 9
Connection: Keep-Alive

POST=POST

  哈!原来是以POST发送的。但是,你一定发现了有一部分数据放在了第一行,就是和GET的情况一样的。其实这个例子很典型,是POST和GET混发!
  不相信你在Perl中,用read(STDIN,$POST,$ENV{CONTENT_LENGTH})和$GET=$ENV{QUERY_STRING}看看,到底哪个里面有GET=GET这个数据。

  我给大家提供设备,大家自己去研究研究:

HTML部分:  

<html>
<head>
<title>Get-Post</title>
</head>

<body>
<form action=/cgi-bin/tech/method.cgi method=GET>
<input type=text size=10 value=GET name=GET>
<input type=submit value=GET方式>
</form>
<form action=/cgi-bin/tech/method.cgi method=POST>
<input type=text size=10 value=POST name=POST>
<input type=submit value=POST方式>
</form>
<form action=/cgi-bin/tech/method.cgi?GET=GET method=POST>
<input type=text size=10 value=POST name=POST>
<input type=submit value=GET/POST方式>
</form>
<form action=/cgi-bin/tech/method.cgi?name=Hackfan&age=16&email=hackfan@163.net method=POST>
<input type=text size=10 value=Suzhou name=address>
<input type=text size=10 value=msger.net name=homepage>
<input type=text size=10 value=106814 name=qq>
<input type=submit value=复杂GET/POST方式>
</form>
</body>
</html>

Perl部分:

#!c:\perl\bin\perl.exe

$|=1;

print Content-type:text/html\n\n;

print 发送方式:$ENV{REQUEST_METHOD}<br>\n;
if(read(STDIN,$POST,$ENV{CONTENT_LENGTH})){
 print POST得到的数据:$POST<br>\n;
}
if($GET=$ENV{QUERY_STRING}){
 print GET得到的数据:$GET<br>\n;
}

$METHOD=POST;

for($i=0;$i<=1;$i++){
 foreach(split(/&/,$$METHOD)){
  $_=~s/\+//g;
  ($name,$value)=split(/=/,$_);
  $name=~s/%([a-fA-f0-9][a-fA-f0-9])/pack(C,hex($1))/eg;
  $value=~s/%([a-fA-f0-9][a-fA-f0-9])/pack(C,hex($1))/eg;
  $$METHOD{$name}=$value;
 }
 $METHOD=GET;
}
$METHOD=POST;

for($i=0;$i<=1;$i++){
 print Hash形式的$METHOD数据遍历:<br>\n;
 foreach(keys %{$METHOD}){
  print \$.$METHOD.{.$_.}=$$METHOD{$_}<br>\n;
 }
 print <br>\n;
 $METHOD=GET;
}

exit;
####代码结束####
  好了,我要说的是,搞这个研究究竟有什么意义呢?
  意义是:让你知道,用户提交的数据哪些是用POST方式,哪些使用GET方式的!
  其实我上面那段Perl代码已经包括了很多的技术。你通过阅读就可以知道%GET里面放的是用GET方式提交的,%POST同理!

2008年06月6日

无聊·炫

由 晨笛 — 分类目录: 杂记评论暂缺

这是现在我在做的游戏。

2008年05月29日

厨房间的节能灯坏了

由 晨笛 — 分类目录: 杂记评论暂缺

估计是节能灯的电子镇流器坏了。这东西怎么就这么容易坏能?看看以前的电感镇流器,长寿、不容易坏、价格便宜、易维修、一般换个启动器就能修好。大人、小孩、没文化的人都会换。

由于一般电子镇流器在损环时,只是坏掉2-4个发热严重的零件:开关三极管,其它部份的零件一般很少有发生损坏。这也是广大厂家努力解决的问题,例如采用更大电流和功率的三极管。可是这还不能根本解决问题,三极管依然会被烧毁,加散热片也无多大作用,特别是在节能灯和大功率节能灯中,由于本身密封和灯管自身的高温,散热片可说是毫无作用。而使用这两种常规方法解决问题,成本会成倍地增长。厂家之间的价格竞争如此激烈,当然也不愿意这么做,他们采取了一种有损消费者利益的方法。例如:40W电子镇流器其实只供应20W的功率,这样就减少了三极管的发热,这样的电子镇流器好象就不容易坏,成本还有所降低,于是很多的厂家都这么悄悄地做了。

2008年05月19日

全国哀悼日纪念

由 晨笛 — 分类目录: 杂记评论暂缺

都是中国人,都是一家人!祝福幸存者,四川加油,中国加油!

页数: 上一页 1 2 3 4 5 6 7 8 下一页
© 2010 晨笛的博客 All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - 使用愉快!