Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Di 02.12.08 12:24 
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:

ausblenden volle Höhe 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:
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{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_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


Zuletzt bearbeitet von Ares am Mi 03.12.08 17:03, insgesamt 1-mal bearbeitet
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 03.12.08 14:34 
Niemand eine Idee?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 15:16 
Nun ja, dass du mit SHGetPathFromIDList nicht weiter kommst, ist ja keine Überraschung, schließlich steht das ja in der Referenz.
Ich vermute, dass folgende Funktion die richtige ist, habe es mir aber nicht näher angeschaut.
msdn.microsoft.com/e...bb762174(VS.85).aspx
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mi 03.12.08 17:02 
Mmh, ich muss gestehen ich kenne mich mit diesen API Funktionen nicht sonderlich gut aus. Ich habe jetzt eine Weile versucht daraus schlau zu werden, habe es aber leider nicht geschafft.

Zitat:
Nun ja, dass du mit SHGetPathFromIDList nicht weiter kommst, ist ja keine Überraschung, schließlich steht das ja in der Referenz.


Wo genau steht das denn da? Das Einzige was ich dort gefunden habe ist, dass bei bei der Auswahl eines Links nicht das Linkziel sondern der Pfad der Linkdatei zurückgegeben wird.

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". In dem Sinne handelt es sich ja schon um einen Link, aber dann müsste ja wenigstens der Pfad der Linkdatei zurück gegeben werden...

Oder meinst du den Hinweis auf Rückgaben bei der Auswahl von "\\server" leer sind? Um einen solchen Netzwerkpfad handelt es sich eigentlich nicht. Die Auswahl hiervon ist ja auch durch BIF_RETURNONLYFSDIRS blockiert.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  if (pidlBrowse <> nil) then begin
    if SHGetPathFromIDList(pidlBrowse, lpBuffer) then begin
      Result := slashPath(String(lpBuffer));
    end else begin
      SHGetDataFromIDList(nil, pidlBrowse, SHGDFIL_NETRESOURCE, lpBuffer, 10);
      Result := slashPath(String(lpBuffer));
    end;
  end;


Ich habe nun eine Zeit rumprobiert und z.B. obigen Code getestet. Dieser Funktioniert jedoch leider nicht (war ja auch mehr oder weniger geraten :) Ich denke es liegt daran, dass ich den ersten Parameter einfach auf nil gesetzt habe. Das liegt aber daran, dass ich nicht weiß wie ich diesen sinnvoll ermitteln könnte.

Weiß hier jemand weiter?

Besten Dank Ares
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.12.08 17:13 
user profile iconAres hat folgendes geschrieben Zum zitierten Posting springen:
Oder meinst du den Hinweis auf Rückgaben bei der Auswahl von "\\server" leer sind? Um einen solchen Netzwerkpfad handelt es sich eigentlich nicht. Die Auswahl hiervon ist ja auch durch BIF_RETURNONLYFSDIRS blockiert.
Ich hatte vermutet, dass da das selbe gilt, ich werde das einmal selbst unter Vista ausprobieren.
Ares Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Mo 08.12.08 14:31 
Ich bin hier leider noch kein Stück weiter gekommen. Hat niemand mehr eine Idee wie das zu lösen ist?