幽谷奇峰 | 燕雀鸣幽谷,鸿鹄掠奇峰

Windows平台便携版Evernote的制作与下载 (更新到v5.7.1.5586)


使用便携软件的好处就不用我赘述了,本人是有着轻微强迫症的便携软件的狂热粉丝,我在windows平台下使用的大部分软件都是便携版的。PortableApps.com Platform 是Windows系统下比较流行的便携软件平台,PortableApps.com Launcher(以下简称PAL)是PortableApps.com开发的便携软件制作工具。本文就介绍如何制作兼容PortableApps.com Platform的便携版Evernote。

提取Evernote程序文件

先到Evernote官网上下载最新的Evernote安装程序,然后到 这里 下载提取工具Universal Extractor, 建议下载Archive版(便携版)。

不能直接用Universal Extractor提取Evernote官方安装包,否则会出现错误而失败。要先运行一下Evernote官方安装包,等到弹出安装对话框时,点击“取消”退出安装程序,它会在%TEMP%路径(对于Win7就是:C:\Users\Administrator\AppData\Local\Temp)下生成一个名为Evernote.msi的Windows Installer(MSI)包,对此包用Universal Extractor提取就可得到所需的纯净的程序文件。

分析程序运行机理

运行Evernote,发现它会启动Evernote.exe,EvernoteClipper.exe,EvernoteTray.exe这三个进程,在%APPDATA%%LOCALAPPDATA%以及NT6.0以上的LocalLow中写入文件,在注册表HKCU\Software\Evernote中写入键值,HKCU\Software\Evernote\Evernote\EvernotePath的值为Evernote数据库的位置。Evernote首次运行还会在shell:sendto中创建一个指向Evernote.exe的快捷方式,以便文件的右键菜单中有“发送到Evernote”的菜单。

编写配置文件

我们的目标是利用PAL制作这样一个便携软件启动器(Launcher):

Launcher启动—>备份本地数据—>导入便携数据—>将数据库路径写入注册表—>启动主程序—>主程序退出—>导出便携软件数据—>清理便携软件垃圾—>恢复本地数据—>Launcher退出

PortableApps.com 提供了一个模板: PortableApps.com Application Template 2.4, 以便我们快速部署配置文件。

appinfo.ini

下载上述模板,解压后,重命名AppNamePortable为EvernotePortable。在App下新建Evernote目录,将提取出的程序文件复制到此处。

创建 App\AppInfo\appinfo.ini ,此目录下的文件主要是为PortableApps.com Platform提供程序的基本信息。使用PAL创建便携软件,此目录是不可缺少的。

在appinfo.ini中这样写:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Format]
Type=PortableApps.comFormat
Version=3.0

[Details]
Name=Evernote Portable
AppID=EvernotePortable
Publisher=Evernote Corporation | yysfire
Homepage=http://yysfire.github.io/tools/
Category=Office
Language=Multilingual
Description=Save your ideas, things you like, things you hear, and things you see.

[License]
Shareable=true
OpenSource=false
Freeware=true
CommercialUse=true

[Version]
PackageVersion=5.7.1.5586
DisplayVersion=5.7.1

[Control]
Icons=1
Start=EvernotePortable.exe

图标

导出Evernote.exe的图标,推荐使用IcoFX Portable,保存为App\AppInfo\appicon.ico,并导出为appicon_16.png(16px),appicon_32.png(32px),appicon_128.png(128px,非必须),均放在App\AppInfo\路径下。

Launcher

创建App\Appinfo\Launcher\EvernotePortable.ini,这个INI是制作便携软件的关键,它告诉PAL如何使我们的软件便携化。

参考:使用Portableapps.com Launcher制作便携软件:以Evernote Portable为例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[Launch]
ProgramExecutable=Evernote\Evernote.exe
;主程序位置
SinglePortableAppInstance=true
;只允许运行一个便携版实例
CloseEXE=EvernoteTray.exe
;除了Evernote.exe,当EvernoteTray.exe正在运行时,便携软件也拒绝启动。
WaitForExe1=EvernoteTray.exe
;当Evernote.exe关闭后,等待EvernoteTray.exe进程退出,EvernotePortable.exe才退出,才真正结束便携软件。
DirectoryMoveOK=yes
;路径改变并不会影响便携软件运行,因此检测到路径改变时不提示警告。

[Activate]
Registry=true
;表示本软件需要写注册表

[DirectoriesMove]
-=%LOCALAPPDATA%\Evernote
;当软件启动时,原%LOCALAPPDATA%\Evernote会被重命名(备份)为
;%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable,当软
;件结束时,%LOCALAPPDATA%\Evernote会被删除,
;%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable 被重命名(恢复)
;为%LOCALAPPDATA%\Evernote。(-=)的意思是程序结束时不将
;%LOCALAPPDATA%\Evernote备份到便携软件Data目录,因为这几个目录主要是日志、
;临时文件,没有备份到便携设备的必要。如果需要备份到Data目录,则将“-”指定为其
;他名称。下同。
-=%APPDATA%\Evernote
-=%USERPROFILE%\AppData\LocalLow\Evernote

[DirectoriesCleanupIfEmpty]
1=%LOCALAPPDATA%\Evernote\Evernote
;如为空目录,则在结束时删除目录,避免留下垃圾文件。下同
2=%LOCALAPPDATA%\Evernote
3=%APPDATA%\Evernote
4=%USERPROFILE%\AppData\LocalLow\Evernote

[RegistryKeys]
EvernotePortable=HKCU\Software\Evernote
;在程序启动时,HKCU\Software\Evernote被重命名为
;HKCU\Software\Evernote-Backup-by-EvernotePortable,
;Data\settings\EvernotePortable.reg 被导入注册表,在程
;序结束后,反过来导出便携软件键值,恢复本机注册表项。

[RegistryValueWrite]
HKCU\Software\Evernote\Evernote\EvernotePath=REG_SZ:%PAL:DataDir%
;在程序启动时,在HKCU\Software\Evernote\Evernote\EvernotePath 中写入便携
;软件Data目录路径,以将数据库目录设定为便携软件的Data。更多PAL专有变量请参阅文档。

[RegistryCleanupIfEmpty]
1=HKCU\Software\Evernote
;如为空项,则在结束时删除,避免留下注册表垃圾。

DefaultData

PortableApps.com Platform 便携软件一般是不能通过软件自身的升级方式更新的,因此,我们需要修改程序的默认设置,关闭自动升级选项。通过观察注册表,可知Evernote自动升级主要由2个键值控制。在程序第一次运行时,需要将这两个键值设为0,以关闭默认升级。

新建App\DefaultData\settings\EvernotePortable.reg,写入如下内容:

1
2
3
4
5
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Evernote\Evernote]
"UpdateToPreReleaseVersion"=dword:00000000
"CheckForUpdatesAtLaunch"=dword:00000000

Custom Code

Evernote有一个残余进程EvernoteClipper.exe,并不会在程序结束后自动退出。PAL并没有结束进程的功能,因此需要用到一段Custom Code。在App\AppInfo\Launcher目录下新建Custom.nsh,写入如下内容:

1
2
3
4
5
6
7
8
9
${SegmentFile}

${SegmentPrePrimary}
KillProcDLL::KillProc "EvernoteClipper.exe"
!macroend

${SegmentPostPrimary}
KillProcDLL::KillProc "EvernoteClipper.exe"
!macroend

此代码的作用是调用NSIS的KillPorcDLL插件,在程序启动之前和退出之后,结束进程EvernoteClipper.exe。但是,似乎并不起作用。

其实,EvernoteClipper.exe并没有什么大作用,关闭它对主程序没什么影响,而它的启动是由注册表中的一个键值 HKEY_CURRENT_USER\Software\Evernote\Evernote\StartEvernoteClipper 来控制。因此,我们可以在App\DefaultData\settings\EvernotePortable.reg中加入"StartEvernoteClipper"=dword:00000000来关闭它的启动。

我在前面还提到,在Evernote首次启动时,会添加“发送到Evernote”的右键菜单。但是,当Evernote程序退出后,此右键菜单还存在,这不符合便携软件的理念。

解决这个问题无外乎两种思路:

  1. 思路一:完全抛弃此右键菜单,想办法让Evernote不安装这个菜单。
  2. 思路二:右键发送到Evernote的菜单有时还是挺好用的,当启动便携版Evernote时,生成此菜单,当便携版Evernote退出后,就删掉此菜单。

对于思路一,我找到了控制Evernote安装右键菜单的注册表键值:HKEY_CURRENT_USER\Software\Evernote\Evernote\SendToLinkInstalled,在App\DefaultData\settings\EvernotePortable.reg中将此键值清零,结果好象不起作用。

对于思路二,可以在App\AppInfo\Launcher\Custom.nsh中写入以下代码解决:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
!define SENDTO   `$SENDTO\Evernote.lnk`

${SegmentFile}

${SegmentPrePrimary}
    ExpandEnvStrings $0 "%PAL:AppDir%\Evernote\Evernote.exe"
    CreateShortCut `${SENDTO}` `$0`
!macroend

${SegmentPostPrimary}
    Delete `${SENDTO}`
!macroend

综合以上,文件D:\PortableApps\EvernotePortable\App\AppInfo\Launcher\Custom.nsh最终的内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
!define SENDTO   `$SENDTO\Evernote.lnk`

${SegmentFile}

${SegmentPrePrimary}
    ExpandEnvStrings $0 "%PAL:AppDir%\Evernote\Evernote.exe"
    CreateShortCut `${SENDTO}` `$0`
    KillProcDLL::KillProc "EvernoteClipper.exe"
!macroend

${SegmentPostPrimary}
    Delete `${SENDTO}`
    KillProcDLL::KillProc "EvernoteClipper.exe"
!macroend

文件App\DefaultData\settings\EvernotePortable.reg最终的内容如下:

1
2
3
4
5
6
7
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Evernote\Evernote]
"UpdateToPreReleaseVersion"=dword:00000000
"CheckForUpdatesAtLaunch"=dword:00000000
"StartEvernoteClipper"=dword:00000000
"SendToLinkInstalled"=dword:00000000

编译与封包

Evernote的便携化基本完成了。在 PortableApps.com Launcher 中载入 EvernotePortable 目录,按下一步编译。如果成功,会在 EvernotePortable 目录下生成 EvernotePortable.exe。

至此便携软件已经制作完毕,为便于使用与分发,可使用 PortableApps.com AppCompactor 减小软件体积,使用 PortableApps.com Installer 制作成安装(自解压)包。

扩展阅读

  1. PortableApps.com Format Specification (3.0)
  2. PortableApps.com Launcher Manual

Evernote便携版下载地址

EvernotePortable_5.7.1.5586 下载地址


本作品由 Yysfire 创作,采用知识共享许可协议进行许可。转载时请在显著位置标明本文永久链接:
http://yysfire.github.io/windows/make_and_download_portable-evernote_for_windows.html


相关文章


最后修改
2014-11-18 06:11
发表时间
2014-11-18 02:12
本文标签
Evernote 1 PAL 1 PortableApps 1 Windows 10
关注我

侧栏导航