Delphi 获取Vista文件夹路径

Delphi 获取Vista文件夹路径,delphi,delphi-2009,Delphi,Delphi 2009,为什么这不会在Delphi 2009中编译 unit VistaFolders; interface uses Windows, ShellAPI, ShlObj; type KNOWNFOLDERID = TGuid; const FOLDERID_ProgramData: KNOWNFOLDERID = '{374DE290-123F-4565-9164-39C4925E467B}'; // downloads folder var SHGetKnownFold

为什么这不会在Delphi 2009中编译

unit VistaFolders;

interface

uses Windows, ShellAPI, ShlObj;

type
  KNOWNFOLDERID = TGuid;

const
  FOLDERID_ProgramData: KNOWNFOLDERID =
    '{374DE290-123F-4565-9164-39C4925E467B}'; // downloads folder

var
  SHGetKnownFolderPathFunc: function( const rfid: KNOWNFOLDERID;
    dwFlags: DWORD; hToken: THandle; var ppszPath: PWideChar ): HResult; stdcall;
  SHGetKnownFolderIDListFunc: function( const rfid: KNOWNFOLDERID;
    dwFlags: DWORD; hToken: THandle; var ppidl: PItemIDList ): HResult; stdcall;

  function GetDownloadsFolderPath: string;

implementation

uses ActiveX;

function PathFromIDList( Pidl: ShlObj.PItemIdList ): string;
var
  Path: array[ 0..MAX_PATH ] of Char;
begin
  if SHGetPathFromIDList( Pidl, Path ) then
    Result := Path
  else
    Result := '';
end;

function GetDownloadsFolderPath: string;
var
  Path: PWideChar;
  Pidl: PItemIdList;
begin
  Result := '';
  if @SHGetKnownFolderPathFunc <> nil then
  begin
    if Succeeded( SHGetKnownFolderPathFunc( FOLDERID_ProgramData, 0, 0, Path ) ) then
      begin
        try
          Result := Path;
        finally; CoTaskMemFree( Path ); end;
        Exit;
      end;
  end
  else if @SHGetKnownFolderIDListFunc <> nil then
  begin
    if Succeeded( SHGetKnownFolderIDListFunc( FOLDERID_ProgramData, 0, 0, Pidl ) ) then
      begin
        try
          Result := PathFromIDList( Pidl );
        finally; CoTaskMemFree( Pidl ); end;
        Exit;
      end;
  end;
  if Succeeded( SHGetFolderLocation( 0, CSIDL_PROFILE, 0, 0, Pidl ) ) then
    try
      Result := PathFromIDList( Pidl ) + '\Downloads';
    finally; CoTaskMemFree( Pidl ); end;
end;

procedure InitVistaFunctions;
var
  hShell32: THandle;
begin
  hShell32 := GetModuleHandle( 'SHELL32' );
  @SHGetKnownFolderPathFunc := Windows.GetProcAddress( Shell32, 'SHGetKnownFolderPath' );
  @SHGetKnownFolderIDListFunc := Windows.GetProcAddress( Shell32, 'SHGetKnownFolderIDList' );
end;

initialization
  InitVistaFunctions;

end.
unitvistafolders;
接口
使用Windows、ShellAPI、ShlObj;
类型
KNOWNFOLDERID=TGuid;
常数
FOLDERID_程序数据:KNOWNFOLDERID=
“{374DE290-123F-4565-9164-39C4925E467B}”;//下载文件夹
变量
SHGetKnownFolderPathFunc:function(常量rfid:KNOWNFOLDERID;
dwFlags:DWORD;hToken:THandle;var-ppszPath:PWideChar):HResult;stdcall;
SHGetKnownFolderIDListFunc:function(常量rfid:KNOWNFOLDERID;
dwFlags:DWORD;hToken:THandle;var-ppidl:PItemIDList):HResult;stdcall;
函数GetDownloadsFolderPath:string;
实施
使用ActiveX;
函数路径FromIDList(Pidl:ShlObj.PItemIdList):字符串;
变量
路径:字符的数组[0..MAX_Path];
开始
如果SHGetPathFromIDList(Pidl,Path),则
结果:=路径
其他的
结果:='';
结束;
函数GetDownloadsFolderPath:string;
变量
路径:PWideChar;
Pidl:PItemIdList;
开始
结果:='';
如果@SHGetKnownFolderPathFunc为零,则
开始
如果成功(SHGetKnownFolderPathFunc(FOLDERID\u ProgramData,0,0,Path)),则
开始
尝试
结果:=路径;
最后CoTaskMemFree(路径);结束;
出口
结束;
结束
否则,如果@SHGetKnownFolderIDListFunc为零,则
开始
如果成功(SHGetKnownFolderIDListFunc(FOLDERID_ProgramData,0,0,Pidl)),则
开始
尝试
结果:=PathFromIDList(Pidl);
最后CoTaskMemFree(Pidl);结束;
出口
结束;
结束;
如果成功(SHGetFolderLocation(0,CSIDL_PROFILE,0,0,Pidl)),则
尝试
结果:=PathFromIDList(Pidl)+'\Downloads';
最后CoTaskMemFree(Pidl);结束;
结束;
程序功能;
变量
hShell32:THandle;
开始
hShell32:=GetModuleHandle('SHELL32');
@SHGetKnownFolderPathFunc:=Windows.GetProcAddress(Shell32,“SHGetKnownFolderPath”);
@SHGetKnownFolderIDListFunc:=Windows.GetProcAddress(Shell32,“SHGetKnownFolderIDList”);
结束;
初始化
initvista函数;
结束。

因为您在
GetProcAddress
调用中给出的是
Shell32
而不是
hShell32

如果你想知道为什么它会失败

没有可以使用这些参数调用的“GetProcAddress”的重载版本


您可以按住ctrl键单击第一个参数,IDE将带您进入编译器为
Shell32

找到的常量,因为您在
GetProcAddress
调用中给出的是
Shell32
,而不是
hShell32

如果你想知道为什么它会失败

没有可以使用这些参数调用的“GetProcAddress”的重载版本


您可以按住ctrl键并单击第一个参数,IDE会将您带到编译器为
Shell32

找到的常量,这只是为了提醒任何想使用上述代码的人,Delphi 2010(可能是2009?)有一个名为KnownFolders.pas的单元,其中包含所有其他FOLDERID_uu.常量 如:
FOLDERID_RoamingAppData:TGUID=“{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}”

请注意,Delphi 2010(可能是2009?)有一个名为KnownFolders.pas的单元,其中包含所有其他FOLDERID_uuu常量 如:
FOLDERID_RoamingAppData:TGUID=“{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}”

在Delphi 2010中,所有SHGetKnownFile函数都在单元“shlobj”中定义
FOLDERID常量位于KnownFolders中。在Delphi 2010中,所有SHGetKnownFile函数都在单位“shlobj”中定义
FOLDERID常量在KnownFolders中

谢谢。。。编译器通常会告诉你为什么有些东西无法编译。不要让别人猜。当你问问题是什么时,包括编译器的错误信息和位置。@Bill Miller:如果mghie的答案有帮助,那么在他的答案旁边勾选复选标记“接受”是礼貌的。谢谢你。。。编译器通常会告诉你为什么有些东西无法编译。不要让别人猜。当你问问题是什么时,包括编译器的错误信息和位置。@Bill Miller:如果mghie的答案是有帮助的,那么在他的答案旁边勾选复选标记“接受”是礼貌的。