<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CFileDialog der nur die Ordner anzeigt (SHBrowseForFolder)]]></title><description><![CDATA[<p>Ihr kennt das vieleicht von einer Programminstallation her. Dieses kleine Fenster in dem nur ein Baum angezeigt wird in dem man einen Beliebigen Ordner wählen kann.<br />
Und um genau das Teil gehts mir.</p>
<p>Das ganze Funktioniert mit:</p>
<pre><code class="language-cpp">SHBrowseForFolder(&amp;BrowseInfo);
</code></pre>
<p>Und das geht auch richtig gut (sofern man den Code hat). Allerdings wird beim Aufruf immer der 'Root' Ordner und dessen Unterordner angezeigt. Solange man keinen anderen 'Root' Ordner in der BrowseInfo Struktur angibt ist dies immer der Arbeitsplatz.</p>
<p>Aber genau das soll ich jetzt ändern. Meine Aufgabe ist es, in diesem Dialog zum Ordner zu springen, in dem das Programm liegt. Und soweit ich der MSDN Doku trauen kann ist das unmöglich (wenn dabei noch alle übergeordneten Laufwerke oder z.B. der Arbeitsplatz auswählbar sein sollen). Wenn ich z.B. in der BrowseInfo Struktur den Programminstallations Ordner angebe, dann werden die übergeordneten Ordner, Laufwerke usw. nicht mit angezeigt.</p>
<p>Ich hoffe das ich mein Problem halbwegs verständlich erklären konnte. Wie gesagt: ich will diesen Ordner wählen Dialog und in diesem Dialog soll er (ähnlich wie im CFileDialog in der MFC) den Ordner markiert haben, in dem das Programm liegt (ohne alle übergeordneten abzuschneiden).</p>
<p>Hier noch kurz mein Code zum Aufruf des Dialogs:</p>
<pre><code class="language-cpp">{
			BROWSEINFO BrowseInfo;
			ITEMIDLIST *ItemDirectoryList = new ITEMIDLIST;
			BOOL OrdnerWahl = FALSE;
			char pfad[MAX_PATH*2];

			ZeroMemory(&amp;BrowseInfo, sizeof(BROWSEINFO));

			if(DialogFenster != NULL)
				BrowseInfo.hwndOwner = DialogFenster-&gt;GetSafeHwnd();

			BrowseInfo.ulFlags   = BIF_RETURNONLYFSDIRS;

			ItemDirectoryList = SHBrowseForFolder(&amp;BrowseInfo);

			pfad[0] = _T('\0');

			if (ItemDirectoryList)
			{
				if (SHGetPathFromIDList(ItemDirectoryList, pfad))
				{
					neuerPfad = (CString)pfad;

					OrdnerWahl = TRUE;
				}

				IMalloc *pMalloc = NULL; 
				if (SUCCEEDED(SHGetMalloc(&amp;pMalloc)) &amp;&amp; pMalloc) 
				{  
					pMalloc-&gt;Free(ItemDirectoryList);  
					pMalloc-&gt;Release(); 
				}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/119013/cfiledialog-der-nur-die-ordner-anzeigt-shbrowseforfolder</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Jul 2026 11:17:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119013.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Aug 2005 15:05:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CFileDialog der nur die Ordner anzeigt (SHBrowseForFolder) on Fri, 26 Aug 2005 15:05:25 GMT]]></title><description><![CDATA[<p>Ihr kennt das vieleicht von einer Programminstallation her. Dieses kleine Fenster in dem nur ein Baum angezeigt wird in dem man einen Beliebigen Ordner wählen kann.<br />
Und um genau das Teil gehts mir.</p>
<p>Das ganze Funktioniert mit:</p>
<pre><code class="language-cpp">SHBrowseForFolder(&amp;BrowseInfo);
</code></pre>
<p>Und das geht auch richtig gut (sofern man den Code hat). Allerdings wird beim Aufruf immer der 'Root' Ordner und dessen Unterordner angezeigt. Solange man keinen anderen 'Root' Ordner in der BrowseInfo Struktur angibt ist dies immer der Arbeitsplatz.</p>
<p>Aber genau das soll ich jetzt ändern. Meine Aufgabe ist es, in diesem Dialog zum Ordner zu springen, in dem das Programm liegt. Und soweit ich der MSDN Doku trauen kann ist das unmöglich (wenn dabei noch alle übergeordneten Laufwerke oder z.B. der Arbeitsplatz auswählbar sein sollen). Wenn ich z.B. in der BrowseInfo Struktur den Programminstallations Ordner angebe, dann werden die übergeordneten Ordner, Laufwerke usw. nicht mit angezeigt.</p>
<p>Ich hoffe das ich mein Problem halbwegs verständlich erklären konnte. Wie gesagt: ich will diesen Ordner wählen Dialog und in diesem Dialog soll er (ähnlich wie im CFileDialog in der MFC) den Ordner markiert haben, in dem das Programm liegt (ohne alle übergeordneten abzuschneiden).</p>
<p>Hier noch kurz mein Code zum Aufruf des Dialogs:</p>
<pre><code class="language-cpp">{
			BROWSEINFO BrowseInfo;
			ITEMIDLIST *ItemDirectoryList = new ITEMIDLIST;
			BOOL OrdnerWahl = FALSE;
			char pfad[MAX_PATH*2];

			ZeroMemory(&amp;BrowseInfo, sizeof(BROWSEINFO));

			if(DialogFenster != NULL)
				BrowseInfo.hwndOwner = DialogFenster-&gt;GetSafeHwnd();

			BrowseInfo.ulFlags   = BIF_RETURNONLYFSDIRS;

			ItemDirectoryList = SHBrowseForFolder(&amp;BrowseInfo);

			pfad[0] = _T('\0');

			if (ItemDirectoryList)
			{
				if (SHGetPathFromIDList(ItemDirectoryList, pfad))
				{
					neuerPfad = (CString)pfad;

					OrdnerWahl = TRUE;
				}

				IMalloc *pMalloc = NULL; 
				if (SUCCEEDED(SHGetMalloc(&amp;pMalloc)) &amp;&amp; pMalloc) 
				{  
					pMalloc-&gt;Free(ItemDirectoryList);  
					pMalloc-&gt;Release(); 
				}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/859114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/859114</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Fri, 26 Aug 2005 15:05:25 GMT</pubDate></item></channel></rss>