Entwickler-Ecke

Windows API - SHGetKnownFolderPath aus Delphi Net


ASMFreak - Di 17.01.12 18:03
Titel: SHGetKnownFolderPath aus Delphi Net
MoinMoin,

ich habe ein dickes Problem. Ich wollte die Funktion SHGetFolderPath ersetzen durch die aktuellere SHGetKnownFolderPath. (Nur, falls jemand bemerken sollte, "Warum, wenn es mit der alten ging?": Weil die einige Folder aus Vista und Win7 nicht kennt, die CSIDLs sind ja begrenzt.)

Ich habe also folgenden Quelltext:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
interface
   :
   : 
function SHGetKnownFolderPath(rfid: TGUID; dwFlags: DWORD; hToken: THandle; var ppszPath: IntPtr): HRESULT;
function SHGetKnownFolderPathA(rfid: TGUID; dwFlags: DWORD; hToken: THandle; var ppszPath: IntPtr): HRESULT;
function SHGetKnownFolderPathW(rfid: TGUID; dwFlags: DWORD; hToken: THandle; var ppszPath: IntPtr): HRESULT;
   :
   :
implementation
   :
   :
const
  Shell32Dll = 'Shell32.dll';

[SuppressUnmanagedCodeSecurity, DllImport(Shell32Dll, CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'SHGetKnownFolderPath')]
function SHGetKnownFolderPath; external;
[SuppressUnmanagedCodeSecurity, DllImport(Shell32Dll, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'SHGetKnownFolderPathA')]
function SHGetKnownFolderPathA; external;
[SuppressUnmanagedCodeSecurity, DllImport(Shell32Dll, CharSet = CharSet.Unicode, SetLastError = True, EntryPoint = 'SHGetKnownFolderPathW')]
function SHGetKnownFolderPathW; external;
     :
     :
function GetFolderPath(Folder: TGUID): String;
  var
    Buffer: IntPtr;
    Res: HRESULT;
begin
  Res := SHGetKnownFolderPath(Folder, 00, Buffer);
  OleCheck(Res);
  Result := Marshal.PtrToStringAuto(Buffer);
  if Assigned(Buffer) then
    CoTaskMemFree(Buffer);
end;

Wenn ich nun dier Funktion die GUID FOLDERID_Documents übergebe, erhalte ich in der Zeile "Res := ..." folgende Exception:
"Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."

Weiß jemand Rat? Was mache ich falsch?
Bin für jeden Hinweis dankbar.

Gruß ASMFreak