如何安装到 CSIDL_COMMON_APPDATA

How to install into CSIDL_COMMON_APPDATA

使用NSIS, I want to set the InstallDir to CSIDL_COMMON_APPDATA

这可能类似于

C:\Documents and Settings\All Users\Application Data

很遗憾,the variables/constants allowed in InstallDir不支持常用应用数据文件夹。

所以我尝试了:

System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'
InstallDir "\MyProduct"

(0x23 等于 CSIDL_COMMON_APPDATA)

编译时,NSIS 报错如下:

Error: Can't add entry, no section or function is open!

我的问题:

如何设置安装目录为CSIDL_COMMON_APPDATA?

基于this suggestion,我找到了解决方法:

首先,将 InstallDir 设置为任意值:

InstallDir "$PROGRAMFILES\MyProduct"

接下来用.onInit函数改一下:

Function .onInit
    System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'
    StrCpy $InstDir "\MyProduct"
FunctionEnd

SetShellVarContext 指令更改了一些 NSIS 常量,使它们指向特殊路径的所有用户版本:

Function .onInit
SetShellVarContext all
StrCpy $InstDir $AppData
FunctionEnd