Ակնհայտ է, որ դա աննշան է win32 api - CreateDirectory() հետ: Բայց ես փորձում եմ հյուրընկալել IShellView-ը և կուզենայի դա անել ամենահեղինակավոր ձևով: Ես կմտածեի, որ կլինի createobject կամ createfolder կամ նման մի քանի IShellFolder-ից: Բայց ոչ IShellView-ը, ոչ IShellFolder-ը, ոչ էլ նույնիսկ IFolderView-ը կարծես նման բան չունեն:
Կա՞ Shell-ծրագրավորման եղանակ՝ նոր թղթապանակ ստեղծելու համար: Թե՞ ես պետք է թղթապանակ ստեղծեմ՝ օգտագործելով pathname, հնաոճ ձևով:
Եթե ես պետք է դա անեմ CreateDirectory(-ի միջոցով), ապա իմ հաջորդ հարցը կարող է լինել.
Մոտիվացիա. Ստեղծելով իմ սեփական File Dialog-ի փոխարինումը և ես ուզում եմ ապահովել «նոր թղթապանակ» գործիքագոտու պատկերակի գործառույթը ստանդարտ XP ոճի ֆայլի երկխոսության մեջ:
Խմբագրել. Ես առաջ գնացի և ստեղծեցի մի բան, որը հիմնականում աշխատում է՝ օգտագործելով CreateDirectory-ը: Այնուամենայնիվ, ես դեռ հուսով եմ, որ կա դա անելու ավելի լավ միջոց, բայց որպեսզի դուք կարողանաք տեսնել, թե ինչպես է դա աշխատում և ավելի լավ գաղափարներ առաջարկել այս խնդիրը ավելի լավ լուծելու համար.
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));