Avatar billede eht Nybegynder
14. marts 2010 - 17:18 Der er 2 kommentarer og
1 løsning

Erstatning for SHGetSpecialFolderLocation i Windows Vista/7

Hej

Jeg har tidligere benyttet nedenstående ´funktion til at finde placeringerne af system-mapperne.
Denne funktion er vist ved at være forældet, har jeg læst.
Hvordan gør jeg det korrekt med Delphi under Windows Vista/7.
Det er vist noget med SHGetKnownFolderPath:

http://msdn.microsoft.com/en-us/library/bb776911(VS.85).aspx

På forhånd tak.
Erik

function GetSystemPath(Folder: Integer): string;
var
  PIDL: PItemIDList;
  Path: LPSTR;
  AMalloc: IMalloc;
begin

  Path := StrAlloc(MAX_PATH);
  SHGetSpecialFolderLocation(Application.Handle, Folder, PIDL);
  if SHGetPathFromIDList(PIDL, Path) then
    Result := Path;
  SHGetMalloc(AMalloc);
  AMalloc.Free(PIDL);
  StrDispose(Path);
  Result := IncludeBackSlash(result);
end;

{Now you can call this function with different parameters. For example:
CSIDL_DESKTOP for WINDOWS\Desktop
CSIDL_DESKTOPDIRECTORY for WINDOWS\Desktop
CSIDL_FONTS for WINDOWS\FONTS
CSIDL_NETHOOD for WINDOWS\NetHood
CSIDL_PERSONAL for X:\My Documents
CSIDL_PROGRAMS for WINDOWS\StartMenu\Programs
CSIDL_RECENT for WINDOWS\Recent
CSIDL_SENDTO for WINDOWS\SendTo
CSIDL_STARTMENU for WINDOWS\Start Menu
CSIDL_STARTUP for WINDOWS\Start Menu\Programs\StartUp
CSIDL_TEMPLATES for WINDOWS\ShellNew

CSIDL_ADMINTOOLS
CSIDL_COMMON_ADMINTOOLS
CSIDL_APPDATA
CSIDL_COMMON_APPDATA
CSIDL_COMMON_DOCUMENTS
CSIDL_COOKIES
CSIDL_FLAG_CREATE
CSIDL_HISTORY
CSIDL_INTERNET_CACHE
CSIDL_LOCAL_APPDATA
CSIDL_MYPICTURES
CSIDL_PERSONAL
CSIDL_PROGRAM_FILES
CSIDL_PROGRAM_FILES_COMMON
CSIDL_SYSTEM
CSIDL_WINDOWS  }
Avatar billede mbsnet Nybegynder
19. marts 2010 - 03:57 #1
Om ikke andet kan du læse oplysningerne fra registrerings-databasen.:

[HKEY_CURRENT_USER]\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

//mortenbs
Avatar billede eht Nybegynder
19. marts 2010 - 18:37 #2
Fandt den korrekte metode til Vista og senere. Her stien til skrivebordet:

Her link til andre KNOWNFOLDERID:
http://msdn.microsoft.com/en-us/library/dd378457(VS.85).aspx

Uses
  ComObj;

Type
  KNOWNFOLDERID    = TGUID;
  REFKNOWNFOLDERID = ^KNOWNFOLDERID;
  PWSTR            = PWideChar;
  PPWSTR          = ^PWSTR;

Const
  FOLDERID_Desktop : KNOWNFOLDERID =
    '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}';

Function SHGetKnownFolderPath(
  rfid : REFKNOWNFOLDERID; dwFlags : DWORD;
  hToken : THANDLE;
  var ppszPath : PPWSTR) : HRESULT; StdCall;
  External 'shell32.dll';
 
Procedure CoTaskMemFree(
  pv: Pointer); StdCall; External 'ole32.dll';

Now then, with the API declarations in place, it's easy to write functions such as GetDesktopPath:

function GetDesktopPath: String;
Var
  PathBuf  : PPWSTR;
  APIResult : HRESULT;

begin
  APIResult := SHGetKnownFolderPath(
    @FOLDERID_Desktop,0,0,PathBuf);
  OleCheck(APIResult);
  Result := WideCharToString(PWideChar(PathBuf));
  CoTaskMemFree(PathBuf);
end;
Avatar billede eht Nybegynder
02. september 2010 - 13:45 #3
Har selv svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester