Hallo!
Im Programm soll man den Speicherordner für eine Datei einem entsprechenden Fenster auswählen können. Um den Speicherordner auszuwählen verwende ich folgenden Code:
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| function SelectFolder(Caption, DefPath: string; ShowNewFolderBt: boolean = false): string; var bi: TBrowseInfo; lpBuffer: PChar; pidlPrograms, pidlBrowse: PItemIDList;
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: Cardinal; lpData: Cardinal): Integer; stdcall; var PathName: array[0..MAX_PATH] of Char; begin case uMsg of BFFM_INITIALIZED: SendMessage(Hwnd, BFFM_SETSELECTION, Ord(True), Integer(lpData)); BFFM_SELCHANGED: begin SHGetPathFromIDList(PItemIDList(lParam), @PathName); SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, Longint(PChar(@PathName))); end; end; Result := 0; end;
begin Result := ''; if (not SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow, CSIDL_DESKTOP, pidlPrograms))) then exit;
GetMem(lpBuffer, MAX_PATH);
FillChar(BI, SizeOf(BrowseInfo), 0); bi.hwndOwner := GetActiveWindow; bi.pidlRoot := pidlPrograms; bi.pszDisplayName := lpBuffer; bi.lpszTitle := PChar(Caption); bi.ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT or BIF_NEWDIALOGSTYLE; bi.lpfn := @BrowseCallbackProc; bi.lParam := Integer(PChar(DefPath));
pidlBrowse := SHBrowseForFolder(bi); if (pidlBrowse <> nil) then if SHGetPathFromIDList(pidlBrowse, lpBuffer) then Result := slashPath(String(lpBuffer));
if (lpBuffer <> nil) then FreeMem(lpBuffer); end; |
Das klappt alles prima, mit dem Dialog kann man einen Ordner suchen oder auch einen neuen Ordner erstellen. Nun soll es aber auch möglich sein eine Netzwerkressource als Speicherordner auszuwählen, dass klappt mit dem Dialog jedoch leider nicht.
Ich arbeite mit Vista, dort kann man ja z.B. FTP-Ordner als Netzwerkressorce in den Explorer einfügen und dann wie auf einen normalen Ordner darauf zugreifen. (Ich meine, dass das auch schon vor Vista ging, aber ich habe im Moment kein älteres System wo ich das ausprobieren könnte).
Wenn ich solch einen FTP-Ordner einrichte wird dieser zwar auch in dem Dialog angezeigt und ich kann diesen auswählen, das Ergebnis der Funktions ist dann aber leer...
Das Ganze scheitert in diesem Fall daran, dass SHGetPathFromIDList(pidlBrowse, lpBuffer) FALSE liefert und somit kein Pfad zurück gegeben wird.
Weiß jemand was ich ändern muss damit auch bei Netzwerkressourcen der korrekte Pfad zurück gegeben wird?
Besten Dank
Ares