Einzelnen Beitrag anzeigen

Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Netzwerkressource mit SHBrowseForFolder auswählen

  Alt 1. Dez 2008, 16:55
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:

Delphi-Quellcode:
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{CSIDL_DRIVES},
    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_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
  Mit Zitat antworten Zitat