Получение путей к папке Vista - PullRequest
1 голос
/ 10 июня 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
  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.

Ответы [ 3 ]

8 голосов
/ 10 июня 2009

Потому что вы даете Shell32 вместо hShell32 в GetProcAddress вызовах.

Если вам интересно, почему это не с

Не существует перегруженной версии GetProcAddress, которую можно вызвать с этими аргументами

Вы можете щелкнуть левой кнопкой мыши по первому параметру, и IDE перенесет вас к константе, найденной компилятором для Shell32.

3 голосов
/ 07 апреля 2011

Просто чтобы заметить, что кто-то еще думает об использовании приведенного выше кода, Delphi 2010 (может быть, 2009?) Имеет модуль под названием KnownFolders.pas, содержащий все остальные константы FOLDERID_ например: FOLDERID_RoamingAppData: TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}';

2 голосов
/ 04 апреля 2012

В Delphi 2010 все функции SHGetKnownFile определены в модуле "shlobj" Константы FOLDERID находятся в KnownFolders

...