Verzeichnis im Dialog eingeben

gehrti

Mitglied
Hi!

Ich hab eine dialogbasierte MFC Anwendung und möchte dem Nutzer die Möglichkeit geben ein Verzeichnis einzugeben. Gibt es sowas schon fertig, wie es zum Beispiel für das Öffnen und Speichern von Dateien mit CFileDialog etwas gibt?

Ich möchte keine Eingabe per String, sondern per "Klicki Bunti" realisieren.

Ich steh gerade etwas auf dem Schlauch und hoffe mir kann jemand auf die Sprünge helfen.

Ciao Thomas
 
Es gibt da SHBrowseForFolder. Das ist leider ein bisschen umständlich, da man sich hinterher den Pfad aus einer PIDL (so eine Art ID-Liste) holen muss. Ma guggen...

Hier, hab mir mal eine Utility-Routine dafür gebastelt:
Code:
#include <shlobj.h>

std::string BrowseForFolder( HWND hwndParent, const char* szDisplayText ) 
{

  char      szTemp[MAX_PATH];

  szTemp[0] = 0;

  BROWSEINFO    bi;
  LPITEMIDLIST  lpiil;

  bi.hwndOwner = hwndParent;
  bi.pidlRoot = NULL;
  bi.pszDisplayName = szTemp;
  bi.lpszTitle = szDisplayText;
  bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS;
  bi.lpfn = NULL;
  bi.lParam = 0;
  bi.iImage = 0;

  lpiil = SHBrowseForFolder( &bi );

  if ( lpiil != NULL )
  {
    SHGetPathFromIDList( lpiil, szTemp );

    if ( szTemp[strlen( szTemp ) - 1] != 92 )
    {
      wsprintf( szTemp, "%s\\", szTemp );
    }
    LPMALLOC    lpMalloc;
    SHGetMalloc( &lpMalloc );

    lpMalloc->Free( lpiil );
  }

  return std::string( szTemp );
	
}
 
Hi!

Besten Dank, habs mit Deiner Hilfe auf Anhieb hinbekommen. Find nur gerade nicht raus, wie ich an die ID eines Verzeichnisses komme für die ITEMIDLIST, damit ich den pidlRoot ändern kann.
Gibts eine analoge Funktion zu SHGetPathFromIDList?

MfG. Thomas
 
Das war immer der Haupthaken, ich meine, die gibt es nicht. Man kann sich meine ich die ID vom Desktop holen und müsste sich dann nach unten durchhangeln.
 
Ich brauch eigentlich auch nur n Verzeichniss in meinem Prog, aber hab mir gedacht um Aufwand zu sparen, nim doch den std. CFileDialog.
Dann soll der benutzer halt ne Datei darin anklicken, dann hol ich mir mit getPath das Verzeichnis und schneid den Dateinamen ab :D
Problem ist nur wenns keine Dateien in dem Ordner gibt, aber das ist bei mir nicht der Fall :D
Und wenn doch dann nutzt mir das verzeichniss auch nix *g*
 
Habe es auch versucht so zu machen, funktioniert auch super bis auf das freigeben des Speichers. Bekomme folgende Fehlermeldung:

error C2039: 'Free': Ist kein Element von 'IMalloc'

für diese Zeile:

lpMalloc->Free (browser);

Gibt es das nur bei C++? Ich programmiere in C. Ohne das Freigeben funktioniert alles prima. Das muss aber schon rein oder? Steht auch in der MSDN.
 
Wenn du dich selber kasteien willst, bitte schön :)

Da COM auf Objekte aufsetzt; und diese in C nicht unterstützt werden, gibt es einen Pseudo-VTable. Da musst du dann für alle Member-Funktion über eine VTable-Pointer zugreifen:

pMalloc->lpVtbl->Free
 
ich bin glaub zu blöd, es geht nicht. Hier mein Code:

Code:
			// Dialog zum Verzeichnis wählen einblenden
			browser = SHBrowseForFolder (&bi);

			// und gewähltes Verzeichnis auswerten
			if (browser)
			{
				if(SHGetPathFromIDList (browser, szPath)) 
				{
					SetWindowText (hEditDevice, szPath);
				}
			}
			    
			SHGetMalloc (&lpMalloc);

			lpMalloc->lpVtbl->Free (browser);

Fehlermeldung: error C2198: "Funktionszeiger": Nicht genügend Argumente für Aufruf.
 
Ach flixt, der implizite this-Parameter:

lpMalloc->lpVtbl->Free( lpMalloc, browser );

Darin sieht man wunderbar, dass Member-Funktionen als ersten Parameter einen Zeiger auf ihr Objekt mitbekommen.
 

Neue Beiträge

Zurück