SHBrowseForFolder - komisches Verhalten



  • Hab mir ne Funktion geschrieben um vom Benutzer einen Ordner zu erfragen:

    bool GetFolderFromUserDlg(HWND hwnd, TCHAR *pszTitle, TCHAR *pszBuf)
    {
    	TCHAR szTemp[MAX_PATH];
    
    	BROWSEINFO BI;
    	BI.hwndOwner		= hwnd;
    	BI.pidlRoot			= 0;
    	BI.pszDisplayName	= _T("");
    	BI.lpszTitle		= pszTitle;
    	BI.ulFlags			= 0;
    	BI.lpfn				= 0;
    
    	LPITEMIDLIST pidl;
    	pidl = SHBrowseForFolder(&BI);
    	if(!pidl)
    		return false;
    
    	BOOL bRes;
    
    	bRes = SHGetPathFromIDList(pidl, szTemp);
    	IMalloc* pMalloc;
    	if(SHGetMalloc(&pMalloc) == S_OK)
    	{
    		pMalloc->Free((void*)pidl);
    		pMalloc->Release();
    	}
    	if(!bRes)
    	{
    		return false;
    	}
    
    	lstrcpy(pszBuf, szTemp);
    	return true;
    }
    

    Das lustige:
    Wenn ich danach ein MessageBox(0, "", "", 0); aufrufe, erhalte ich den Ordnernamen angezeigt. Was lief hier falsch?
    Mitunter stürzt das Programm auch danach ab 😞 .
    Ich kann aber keinen Fehler finden 😡 .

    Danke im Voraus,
    Black Shadow



  • Member "BI.pszDisplayName" hat einen verwirrenden Namen. 🙂
    Dort kommt der Zeiger auf ein Puffer rein, in dem dann der Verzeichnisname reinkommt, den der User ausgewählt hat.
    So müsste es klappen :

    ...
    // BI.pszDisplayName    = _T("");
    BI.pszDisplayName    = pszBuf;
    ...
    

    Der Kompiler hat die Adressen der leeren Strings von _T("") und denen der MessageBox hintereinander gelegt.
    Darum hat der Aufruf von "SHBrowseForFolder ()" die leeren Strings der MessageBox überschrieben.





  • Danke ihr zwei, so müsste es nun klappen 🙂

    MfG


Log in to reply