Delphi 获取WinXP/Vista/7/8启动文件夹

Delphi 获取WinXP/Vista/7/8启动文件夹,delphi,delphi-xe3,Delphi,Delphi Xe3,这适用于Win7/8,但不适用于XP,为什么 // uses shlobj; function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string; // Gets path of special system folders // // Call this routine as follows: // GetSpecialFolderPath (CSIDL_PERSONAL, false) //

这适用于Win7/8,但不适用于XP,为什么

// uses shlobj;

function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string;

// Gets path of special system folders
//
// Call this routine as follows:
// GetSpecialFolderPath (CSIDL_PERSONAL, false)
//        returns folder as result
//
var
   FilePath: array [0..255] of char;

begin
 SHGetSpecialFolderPath(0, @FilePath[0], FOLDER, CanCreate);
 Result := FilePath;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   memo1.Lines.Add('path:|'+GetSpecialFolderPath(CSIDL_ALTSTARTUP, false)+'|')
end;

谢谢

0..255太小了。使用
MAX\u路径
常量


在Vista中,此文件夹不再存在。我不知道它会返回什么(向后兼容的值),但在Vista中,它显然比255个字符短。

将此CSIDL\u ALTSTARTUP更改为此CSIDL\u STARTUP

我试图避免编写这种常见需求的代码


我使用JCL中的这个函数:

您是否在多台XP机器上试用过?在win8上试用过,在虚拟机中也试用过XP。除此之外,在所有系统上都可以正常工作:CSIDL\u Startup当您说“不工作”时,解释“不工作”的含义非常有用。它会导致错误吗?它是否返回正确的结果?它会导致你的电脑崩溃并开始吸烟吗?它是否显示一个对话说“我在罢工”?请记住,我们无法看到您的屏幕或从我们所在的位置读取您的想法,请具体回答您的问题。谢谢。当然,另一个CSIDL可能会工作,但它会返回一个不同的文件夹。如果您指定了实际需要的文件夹,这会有所帮助。有一个完整的列表,其他CSIDL可能也“工作”,但他们都返回不同的东西。不幸的是。不过,让缓冲区足够大仍然很重要。