Wie kann der "Shell-Namespace" einen neuen Ordner erstellen? - C ++, Windows, COM, Windows-Shell

Offensichtlich ist das mit win32 api trivial -Verzeichnis erstellen(). Aber ich versuche, ein IShellView zu hosten, und möchte dies am Shell-orientierten Weg tun. Ich hätte gedacht, dass es ein createobject oder createfolder oder etwas von einem IShellFolder geben würde. Aber weder IShellView noch IShellFolder noch IFolderView scheinen so etwas zu haben.

Gibt es eine Shell-Programmierung, um einen neuen Ordner zu erstellen? Oder muss ich einen Ordner mit einem Pfadnamen erstellen, der altmodischen Art?

Wenn ich es über CreateDirectory () tun muss, dann könnte meine nächste Frage sein: irgendwelche Ideen, wie man das IShellView / IFolderView dazu bringt, dieses neue Objekt tatsächlich zu sehen und es dem Benutzer anzuzeigen?

Motivation: Ich erstelle meinen eigenen Datei-Dialog Ersatz und ich möchte die "neue Ordner" Symbolleiste Icon-Funktionalität des Standard-XP-Stil Dateidialogs zur Verfügung stellen.

BEARBEITEN:Ich habe mit CreateDirectory etwas erschaffen, das grundsätzlich funktioniert. Ich hoffe jedoch immer noch, dass es einen besseren Weg gibt, dies zu tun, aber damit Sie sehen können, wie das funktioniert, und bessere Ideen zu bieten, um dieses Problem besser zu lösen:

    PidlUtils::Pidl pidl(m_folder);
CFilename folderName(GetDisplayNameOf(pidl), "New Folder");
for (int i = 2; folderName.Exists(); ++i)
folderName.SetFullName(FString("New Folder (%d)", i));
if (!CPathname::Create(folderName, false))
throw CContextException("Unable to create a new folder here: ");

// get the PIDL for the newly created folder
PidlUtils::Pidl pidlNew;
#ifdef UNICODE
const wchar_t * wszName = folderName.c_str();
#else
wchar_t wszName[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, folderName.GetFullName(), -1, wszName, MAX_PATH);
#endif
m_hresult = m_folder->ParseDisplayName(NULL, NULL, wszName, NULL, pidlNew, NULL);
if (FAILED(m_hresult))
throw CLabeledException(FString("Unable to get the PIDL for the new folder: 0x%X", m_hresult));

// upgrade our interface so we can select & rename it
CComQIPtr<IShellView2> sv2(m_shell_view);
if (!sv2)
throw CLabeledException("Unable to obtain the IShellView2 we need to rename the newly created folder.");

// force it to see thew new folder
sv2->Refresh();

// select the new folder, and begin the rename process
m_hresult = sv2->SelectAndPositionItem(pidlNew, SVSI_EDIT|SVSI_DESELECTOTHERS|SVSI_ENSUREVISIBLE|SVSI_POSITIONITEM, NULL);
if (FAILED(m_hresult))
throw CLabeledException(FString("Unable to select and position the new folder item: 0x%X", m_hresult));

Antworten:

0 für die Antwort № 1

Shell-Ordner implementieren normalerweise die IStorage-Schnittstelle, das ist also ziemlich einfach. Im folgenden Beispiel wird auf dem Desktop ein Ordner namens "abcd" erstellt:

  CComPtr  pDesktop;
HRESULT hr =SHGetDesktopFolder (& pDesktop);
if (FAILED (hr)) return;
CComQIPtr  pStorage (pDesktop);
wenn (! pStorage) zurückkehren;
CComPtr  Dummy;
hr = pStorage-> CreateStorage (L "abcd", STGM_FAILIFTHERE, 0, 0, & dummy);

4 für die Antwort № 2

Ja, du kannst Holen Sie sich IContextMenu und nach Untermenüs suchen, aber warum stören, rufen Sie einfach SHChangeNotify nachdem Sie CreateDirectory aufgerufen haben


1 für die Antwort № 3

Die Win32-API-Funktion CreateDirectory scheint der "richtige Weg" zu sein. Zumindest kann ich nichts Besseres finden - und die Antworten hier geben kein Licht auf einen besseren Weg, es zu tun.


Verwandte Fragen
Speisekarte