避免Inno安装程序中的“无法展开shell文件夹常量userdocs”错误

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

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

这不是非常有信心鼓舞的用户!

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

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

有什么方法可以在不使用macros的情况下获得“我的文档”的path?

或者以某种方式来压制错误信息? ExpandConstant引发exception: 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; 

Solutions Collecting From Web of "避免Inno安装程序中的“无法展开shell文件夹常量userdocs”错误"

例外:

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

当内部调用的SHGetFolderPath函数(在扩展shell文件夹常量时从ExpandConstant调用)返回给定文件夹CSIDL的空路径字符串(在本例中为CSIDL_PERSONAL标识符)时CSIDL_PERSONAL

这意味着用户没有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}常量。

我们在这里使用文件夹重定向,并且与其他应用程序(GnuCash,UFile)有类似的问题。 在我们的案例中,问题是由于重定向文件夹迁移功能导致的,在某些情况下,迁移完成后,用户的注册表设置不会更新为指向新的位置(请注意,此迁移可能在GPO发生组)。

无论如何,这并不是说这个项目是空白的,而是指向几周前已经离线的SERVER \ SHARE。

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


*重定向文件夹迁移允许管理员指定每个用户(例如)我的文档文件夹应从一个网络位置移动到另一个。 当用户下一次登录到域上的任何工作站(所以如果你的最后一个用户从现在开始只有一个月登录,那么这个过程需要一个月的时间才能完成)。 理论上这是一个很好的主意,但实际上是一个大的PITA。

顺便说一句, “共享不存在,因为它正在冒充另一个用户的东西不应该是一个正确的重定向文件夹的问题,因为重定向应该使用一个URL,而不是一个映射的驱动器号(例如\\ server \ RedirectedUserFolders \ SOME- USER \我的文档,虽然权限可能是一个问题,如果你删除一些默认的权利)。