Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Probleme mit Special Folder (https://www.delphipraxis.net/173975-probleme-mit-special-folder.html)

aps 26. Mär 2013 17:45

Probleme mit Special Folder
 
Hallo,

ich nutze folgende Funktion, um Special Folders zu ermitteln:

Code:
const
  CSIDL_COMMON_DOCUMENTS = $002e;

function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;


Directory = GetSpecialFolder(Handle, CSIDL_COMMON_DOCUMENTS);
Das funktioniert auch auf praktisch allen PCs wunderbar, bis auf einen einzigen mir bekannten Kunden-PC unter Windows XP. Da kommt immer ein leerer Pfad raus anstelle des gewünschten Pfads für die Gemeinsamen Dokumente (unter Win7 Bibliothek Gemeinsame Dateien).

Woran kann das liegen und wie bekomme ich auch auf dem Rechner den gewünschten Pfad? Laut Kundenangaben gibt es den Pfad, sogar an standardmäßiger Stelle, nur mein Delphi-Programm (d6) schafft es nicht, ihn zu ermitteln.

Danke im Voraus!

Andreas L. 26. Mär 2013 18:50

AW: Probleme mit Special Folder
 
Geht es mit dieser Funktion?

Delphi-Quellcode:
...

  function SHGetFolderPathW(hwndOwner: HWND; nFolder: Integer; hToken: THandle;
    dwFlags: DWORD; pszPath: LPWSTR): HRESULT; stdcall;
    external 'shell32.dll' name 'SHGetFolderPathW';

...

function GetSpecialDirectory(CSIDL: Integer; Handle: Cardinal = 0): String;
const
  SHGFP_TYPE_CURRENT = 0;
var
  APIResult: HRESULT;
  Buffer: Array[0 .. MAX_PATH - 1] of WCHAR;
begin
  Result := '';

  APIResult := SHGetFolderPathW(Handle, CSIDL, 0, SHGFP_TYPE_CURRENT, Buffer);

  if APIResult = S_OK then
    Result := SysUtils.IncludeTrailingPathDelimiter(WideString(Buffer));
end;

Luckie 26. Mär 2013 19:02

AW: Probleme mit Special Folder
 
Was bekommst du denn für einen Fehlercode, wenn SHGetPathFromIDList fehlschlägt?

aps 27. Mär 2013 16:52

AW: Probleme mit Special Folder
 
Erst einmal danke für die Antworten.

@Andreas: Ich habe meinem Kunden mal ein kleines Testprogramm geschickt, damit er das mal ausprobieren kann.

@Luckie: Gibt es eine Möglichkeit, mehr zu erfahren als nur "Klappt" oder "Klappt nicht"? Ich kenne mich mit diesen Routinen vom Windows-System nicht mehr wirklich aus (überhaupt bin ich leider seit Jahren aus Delphi raus und fange gerade erst wieder damit an), und die Funktion stammt hier aus der Lib.

Luckie 27. Mär 2013 17:52

AW: Probleme mit Special Folder
 
In der Doku steht nichts wie man an nähere Infos kommt. Aber versuch es mal mit GetLastError.

aps 27. Mär 2013 19:07

AW: Probleme mit Special Folder
 
Ich wollte hier Erfolg melden: Die Variante von Andreas funktioniert auf allen getesteten Systemen, auch auf dem des Kunden, wo die alte Version hier aus der Lib nicht lief.


Danke dafür :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz