2009-06-10 3 views
1

Почему это не скомпилировано в Delphi 2009?Получение папок для Vista Vista

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. 
+0

благодарственные ... он теперь работает. –

+3

Компилятор обычно ОБРАТИТ вам, почему что-то не будет компилироваться. Не заставляйте всех догадываться. Включите сообщение об ошибке компилятора и его местоположение, когда спросите, в чем проблема. –

+0

@Bill Miller: если бы ответ mghie был полезен, для вас было бы вежливо «принять» его, отметив галочку рядом с его ответом. – Argalatyr

ответ

8

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

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

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

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

4

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

2

В Delphi 2010, все функции SHGetKnownFile определены в блоке «shlobj» Константы FOLDERID в KnownFolders

Смежные вопросы