我将一些示例文档安装到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;
答案 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,但如果删除某些默认权限,权限可能会成为问题。)