Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Netzwerkressource mit SHBrowseForFolder auswählen (https://www.delphipraxis.net/125152-netzwerkressource-mit-shbrowseforfolder-auswaehlen.html)

Ares 1. Dez 2008 15:55


Netzwerkressource mit SHBrowseForFolder auswählen
 
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

erich.wanker 2. Dez 2008 18:16

Re: Netzwerkressource mit SHBrowseForFolder auswählen
 
Hallo Ares..

vielleicht hilft dir das ein wenig weiter...
http://www.madshi.net/

genauer gesagt: http://help.madshi.net/SpecialFolders.htm

Hab ich dich richtig verstanden.. du willst Netzlaufwerke - aber keine FTP Ordner?

Delphi-Quellcode:
function IsLogicalDrive(Drive: string): boolean;
  var
    sDrive: string;
    cDrive: char;
  begin
    sDrive := ExtractFileDrive(Drive);
    if sDrive = '' then
      Result := False
    else begin
      cDrive := UpCase(sDrive[1]);
      if cDrive in ['A'..'Z'] then
        result := (GetLogicalDrives And
          (1 Shl (Ord(cDrive) - Ord('A')))) <> 0 
      else
        Result := False;
    end;
  end;

Ares 3. Dez 2008 07:13

Re: Netzwerkressource mit SHBrowseForFolder auswählen
 
Zitat:

Zitat von erich.wanker
Hab ich dich richtig verstanden.. du willst Netzlaufwerke - aber keine FTP Ordner?

Nein, der Dialog soll mir alle Ordner zurück in die man (mal abgesehen von den Rechten) schreiben kann. Also "normale" Ordner, Netzwerklaufwerke, FTP Ordner, USB-Sticks, etc. Nur Ordner wo man keine Daten speichern kann wie z.B. "Computer", "Systemsteuerung" oder "Netzwerkumgebung" soll man nicht auswählen können.

Eigentlich funktioniert die Auswahl aller Ordner bestens, nur die Auswahl der FTP-Ordner (bzw. allgemeiner der Netzwerkressourcen) nicht. Hier wird ein leerer Pfad zurückgegeben.

Ich arbeite wie gesagt mit Vista und habe wie oben beschrieben einen FTP-Ordner eingerichtet. Dieser wird mir im Explorer als Ordner "www.meineFTPSeite.xyz" direkt unter "Computer" also quasi als eigenes Laufwerk angezeigt. Der Eigentliche Pfad dieses Ordners ist aber "D:\Benutzer\<Benutzer>\AppData\Roaming\Microsoft\ Windows\Network Shortcuts\www.meineFTPSeite.xyz".

Wenn ich nun mit dem Dialog für die Ordnersuche den FTP-Ordner auswähle, sollte mir dieser eigentlich diesen Pfad zurückgeben. Stattdessen erhalte ich aber nur ein leeres Ergebnis, weil SHGetPathFromIDList(pidlBrowse, lpBuffer) FALSE liefert...

Delphi-Quellcode:
bi.ulFlags := BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT or BIF_NEWDIALOGSTYLE;
Durch das Falg RETURNONLYFSDIRS wird verhindert, dass "unechte Ordner" wie "Computer", "Systemsteuerung" oder "Netzwerk" ausgewählt werden. Wird solch ein Ordner gewählt ist der OK Button des Dialogs deaktiviert. Das greift aber nicht bei dem FTP-Ordner, der Dialog betrachtet diesen also als "echten" Ordner. Nur es wird kein Pfad zurück geliefert...


Also: Wie bekomme ich den Dialog dazu, dass er mir bei der Auswahl des FTP-Ordners den korrekten Pfad liefert?

Ares 5. Dez 2008 08:29

Re: Netzwerkressource mit SHBrowseForFolder auswählen
 
Niemand mehr eine Idee?

Ares 8. Dez 2008 13:31

Re: Netzwerkressource mit SHBrowseForFolder auswählen
 
Ich bin hier leider noch kein Stück weiter gekommen. Hat niemand mehr eine Idee wie das zu lösen ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 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