नया फ़ोल्डर बनाने के लिए "शैल नेमस्पेस" तरीका क्या है? - सी ++, विंडोज़, कॉम, विंडोज-शैल

जाहिर है Win32 एपीआई के साथ यह करने के लिए तुच्छ है -निर्देशिका बनाओ()। लेकिन मैं एक आईशेलव्यू होस्ट करने की कोशिश कर रहा हूं, और इसे सबसे अधिक खोल-उन्मुख तरीके से करना चाहता हूं। मैंने सोचा होगा कि एक createobject या createfolder या कुछ ऐसे आईशेलफोल्डर से होंगे। लेकिन न तो आईशेल व्यू और न ही आईशेलफोल्डर और न ही IFolderView ऐसा कुछ प्रतीत होता है।

क्या कोई नया फ़ोल्डर बनाने के लिए एक शैल-प्रोग्रामिंग तरीका है? या क्या मुझे पथनाम का उपयोग करके फ़ोल्डर बनाने की ज़रूरत है, पुराने तरीके से?

अगर मुझे CreateDirectory () के माध्यम से ऐसा करना है, तो मेरा अगला प्रश्न हो सकता है: इस विचार को वास्तव में देखने के लिए IShellView / IFolderView को कैसे प्राप्त करें और इसे उपयोगकर्ता को प्रदर्शित करने के लिए कोई विचार है?

प्रेरणा: अपना स्वयं का फ़ाइल संवाद प्रतिस्थापन बनाना और मैं मानक XP-style फ़ाइल संवाद की "नई फ़ोल्डर" टूलबार आइकन कार्यक्षमता प्रदान करना चाहता हूं।

संपादित करें:मैं आगे बढ़ गया और 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));

उत्तर:

जवाब के लिए 0 № 1

शैल फ़ोल्डर्स आमतौर पर आईएसटीओएस इंटरफेस को लागू करते हैं, इसलिए यह बहुत आसान है। उदाहरण के लिए, निम्नलिखित डेस्कटॉप पर "abcd" नामक फ़ोल्डर बनाता है:

  CComPtr  pDesktop;
HRESULT घंटा =SHGetDesktopFolder (और pDesktop);
अगर (FAILED (घंटा)) वापसी;
CComQIPtr  pStorage (pDesktop);
अगर (! पीएसओरेज) वापसी;
CComPtr  डमी;
एचआर = पीएसओरेज-> CreateStorage (एल "abcd", एसटीजीएम_फेलिफेर, 0, 0, और डमी);

जवाब के लिए 4 № 2

हाँ तुम कर सकते हो IContextMenu प्राप्त करें और उप मेनू की तलाश करें, लेकिन परेशान क्यों करें, बस कॉल करें SHChangeNotify जब आप CreateDirectory को कॉल करते हैं


उत्तर № 3 के लिए 1

Win32 API फ़ंक्शन CreateDirectory "सही तरीका" प्रतीत होता है। कम से कम, मुझे कुछ भी बेहतर नहीं मिल सकता है - और यहां जवाब वास्तव में ऐसा करने के लिए बेहतर तरीके से कोई प्रकाश नहीं डालते हैं।


संबंधित सवाल
सबसे लोकप्रिय