Note that there are some explanatory texts on larger screens.

plurals
  1. POGetting Vista Folder Paths
    text
    copied!<p>Why will this not compile in Delphi 2009?</p> <pre><code>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 &lt;&gt; 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 &lt;&gt; 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. </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload