为什么当某个Vista pc上存在该文件夹时,ShGetFolderPath会返回nil

时间:2010-02-09 14:53:49

标签: delphi

在测试我们的应用程序时,我们发现使用ShGetFolderPath返回AppData路径,即使该文件夹存在于测试PC上,该函数也会返回nil。在开发PC上,ShGetFolderPath返回AppData路径,没有错误。

开发PC和测试PC正在运行Vista。

function GetShellFolder( ID: Cardinal; Create: Boolean = False ): string;
// This function is a superset of SHGetSpecialFolderPath, included with
// earlier versions of the Shell. On systems preceeding those including
// Shell32.dll version 5.0 (Windows Millennium Edition (Windows Me) and
// Windows 2000), SHGetFolderPath was obtained through SHFolder.dll,
// distributed with Microsoft Internet Explorer 4.0 and later versions.

// Takes the CSIDL of a folder and returns the path or 'Could not determine
// folder path' if it does not exist.  Creates the folder if it does not
// exist if Create is true.
var
  Res: HResult;
  Path: array [ 0 .. Max_Path ] of Char;
begin
  if Create then
    ID := ID or csidl_Flag_Create;
  Res := ShGetFolderPath( 0, ID, 0, shgfp_Type_Current, Path );
  if S_OK <> Res then
  begin
    Result := 'Could not determine folder path';
    raise Exception.Create( 'Could not determine folder path' );
  end;
  Result := Path;
end;

GetShellFolder( CSIDL_LOCAL_APPDATA, False );

在开发计算机上,CSIDL_LOCAL_APPDATA路径成功返回,但在测试PC上,不返回CSIDL_LOCAL_APPDATA文件夹。

有人知道为什么在测试PC上没有返回CSIDL_LOCAL_APPDATA文件夹,即使该文件夹存在于硬盘上?测试计算机返回带有CSIDL_HISTORY的历史文件夹,但它不会返回带有CSIDL_LOCAL_APPDATA的本地appdata文件夹。

在测试中,PC资源管理器将CSIDL_LOCAL_APPDATA文件夹显示为users \ user \ AppData \ Local。在测试中,PC资源管理器将CSIDL_HISTORY文件夹显示为users \ user \ AppData \ Local \ Microsoft \ Windows \ History。

如果我们调用GetShellFolder(CSIDL_LOCAL_APPDATA,True),该函数仍然不会返回文件夹路径。

我做错了什么或如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

可能派上用场的其他一些信息:1。什么是delphi版本(unicode或ansi)2。是否引发了异常?如果是,shGetFolderPat调用的确切结果是什么?打电话(我们现在不是S_OK,但它是什么?)

关于实际答案,根据规范,PATH-应该是长度为MAX_PATH的以零结尾的字符串。目前,根本没有初始化(局部变量),这可能解释了两台机器之间的差异。您可能想尝试首先将其填充为零。我承认,远射。