在Inno Setup中避免“无法扩展shell文件夹常量userdocs”错误

时间:2015-02-20 18:13:33

标签: windows installation inno-setup

我将一些示例文档安装到Windows上标准“我的文档”文件夹的“PerfectTablePlan”子文件夹中。这适用于99%以上的用户。但是,如果用户没有“我的文档”文件夹,我会收到以下形式的一些丑陋的错误消息:

  

内部错误:无法展开shell文件夹常量“userdocs”

这对用户来说不是很有信心!

不为这些用户安装样本(或在其他地方安装样本)是可以接受的。但不要显示丑陋的错误信息。

问题似乎来自{userdocs}的ExpandConstant宏扩展。

有没有什么方法可以在不使用宏的情况下获得“我的文档”的路径?

或者某种方式来抑制错误信息? ExpandConstant抛出异常: http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_expandconstant

我的.iss文件的相关部分如下所示:

#define MySampleDir "{code:SampleDirRoot}\PerfectTablePlan"
...
[Files]
Source: ..\binaries\windows\program\plans\*_v14.tp; DestDir: {#MySampleDir}\; Flags: ignoreversion onlyifdoesntexist createallsubdirs recursesubdirs uninsneveruninstall;
Source: ..\binaries\windows\program\plans\*_v3.tps; DestDir: {#MySampleDir}\; Flags: ignoreversion onlyifdoesntexist createallsubdirs recursesubdirs uninsneveruninstall;
...
[Code]
function SampleDirRoot(Param: String): String;
begin
if DirExists( ExpandConstant('{userdocs}') ) then
Result := ExpandConstant('{userdocs}')
else
Result := ExpandConstant('{allusersprofile}')
end;

2 个答案:

答案 0 :(得分:5)

例外:

  

无法展开shell文件夹常量'常量名称'

当内部调用SHGetFolderPath函数(在扩展shell文件夹常量时从ExpandConstant内部调用)返回给定文件夹CSIDL的空路径字符串时引发

,在本例中为{{3标识符。

这意味着用户没有CSIDL_PERSONAL文件夹。这让我想知道如何配置Windows'用户帐户没有该文件夹。那么,您可以通过捕获try..except块中引发的内部异常来解决此问题(或Windows错误配置?):

[Code]
function SampleDirRoot(Param: string): string;
var
  Folder: string;
begin
  try
    // first try to expand the {userdocs} folder; if this raises that
    // internal exception, you'll fall down to the except block where
    // you expand the {allusersprofile}
    Folder := ExpandConstant('{userdocs}');
    // the {userdocs} folder expanding succeded, so let's test if the
    // folder exists and if not, expand {allusersprofile}
    if not DirExists(Folder) then
      Folder := ExpandConstant('{allusersprofile}');
  except
    Folder := ExpandConstant('{allusersprofile}');
  end;
  // return the result
  Result := Folder;
end;

但我从来没有听说过没有CSIDL_PERSONAL文件夹的可能性。请注意,上述代码仅保护{userdocs}常量。

答案 1 :(得分:1)

我们在这里使用文件夹重定向,并且与其他应用程序(GnuCash,UFile)有类似的问题。在我们的案例中的问题是一个称为重定向文件夹迁移*的功能的结果,在某些情况下,在迁移完成后没有更新用户的注册表设置以指向新位置(请注意,此迁移可能在GPO之后几周发生设定)。

无论如何,这不是条目是空白的,而是指向几周前已经脱机的SERVER \ SHARE。

为每台计算机上的每个活动用户运行gpupdate /force修复了我们的问题,因为它更新了注册表,然后告诉用户他必须注销/登录。

*重定向文件夹迁移允许管理员指定每个用户(例如)My Documents文件夹应从一个网络位置移动到另一个网络位置。它以缓慢,有节制的方式执行此操作,下次用户登录到域上的任何工作站(因此,如果您的上一个用户仅在一个月后登录,则该过程需要一个月才能完成)。理论上这是一个可爱的想法,但在实践中是一个很大的PITA。

顺便提一下,'共享不存在,因为冒充其他用户的事情不应该是正确重定向文件夹的问题,因为重定向应该使用URL,而不是映射的驱动器号(例如\\ server \ RedirectedUserFolders \ SOME-USER \ My Documents,但如果删除某些默认权限,权限可能会成为问题。)