BOOL CComCatCachedCategory::LoadFromRegistry() { WCHAR bufKey[MAX_PATH]; WCHAR guidStr[MAX_PATH]; DWORD dataSize, i; CComHeapPtr<CATCACHEHDR> buffer; GUID *guidArray; if (!fLocalDsa) return FALSE; dataSize = 0; if (!StringFromGUID2(fCategory, guidStr, MAX_PATH)) return FALSE; wsprintf(bufKey, L"%s\\%s\\%s", REGPATH , guidStr, L"Enum"); // Try to read key and get proper value size if (SHGetValue(HKEY_CURRENT_USER, bufKey, IMPLEMENTING, NULL, NULL, &dataSize)) return FALSE; buffer.Attach((PCATCACHEHDR)CoTaskMemAlloc(dataSize)); SHGetValue(HKEY_CURRENT_USER, bufKey, IMPLEMENTING, NULL, buffer, &dataSize); guidArray = (GUID*)(buffer + 1); for (i = 0; i < buffer->classCount; i++) { // Add class to cache DSA_InsertItem(fLocalDsa, DSA_APPEND, guidArray + i); } return TRUE; }
HRESULT CBandSiteMenu::_CreateNewISFBand(HWND hwnd, REFIID riid, void** ppv) { WCHAR path[MAX_PATH]; WCHAR message[256]; BROWSEINFOW bi = { hwnd, NULL, path }; if (LoadStringW(GetModuleHandleW(L"browseui.dll"), IDS_BROWSEFORNEWTOOLAR, message, _countof(message))) bi.lpszTitle = message; else bi.lpszTitle = L"Choose a folder"; CComHeapPtr<ITEMIDLIST> pidlSelected; pidlSelected.Attach(SHBrowseForFolderW(&bi)); if (pidlSelected == NULL) return S_FALSE; CComPtr<IShellFolderBand> pISFB; HRESULT hr = CISFBand_CreateInstance(IID_IShellFolderBand, (PVOID*)&pISFB); if (FAILED_UNEXPECTEDLY(hr)) return hr; hr = pISFB->InitializeSFB(NULL, pidlSelected); if (FAILED_UNEXPECTEDLY(hr)) return hr; return pISFB->QueryInterface(riid, ppv); }
HRESULT CComCatCachedCategory::CacheDSA() { WCHAR bufKey[MAX_PATH]; WCHAR guidStr[MAX_PATH]; UINT elemCount; UINT i; UINT bufferSize; CComHeapPtr<CATCACHEHDR> buffer; GUID *guidArray; GUID *tmp; elemCount = DSA_GetItemCount(fLocalDsa); bufferSize = sizeof(CATCACHEHDR) + elemCount * sizeof(GUID); if (!StringFromGUID2(fCategory, guidStr, MAX_PATH)) return E_FAIL; buffer.Attach((PCATCACHEHDR)CoTaskMemAlloc(bufferSize)); if (!buffer) return E_OUTOFMEMORY; // Correctly fill cache header buffer->dwSize = sizeof(CATCACHEHDR); buffer->version = 1; GetSystemTime(&buffer->writeTime); buffer->classCount = (DWORD)elemCount; guidArray = (GUID*)(buffer + 1); wsprintf(bufKey, L"%s\\%s\\%s", REGPATH , guidStr, L"Enum"); // Write DSA contents inside the memory buffer allocated for(i = 0; i < elemCount; i++) { tmp = (GUID*)DSA_GetItemPtr(fLocalDsa, i); if (tmp) { guidArray[i] = *tmp; } } // Save items to registry SHSetValue(HKEY_CURRENT_USER, bufKey, IMPLEMENTING, REG_BINARY, buffer, bufferSize); guidArray = NULL; return S_OK; }
HRESULT STDMETHODCALLTYPE CShellDispatch::BrowseForFolder(LONG Hwnd, BSTR Title, LONG Options, VARIANT RootFolder, Folder **ppsdf) { TRACE("(%p, %lu, %ls, %lu, %s, %p)\n", this, Hwnd, Title, Options, debugstr_variant(&RootFolder), ppsdf); *ppsdf = NULL; if (!is_optional_argument(&RootFolder)) FIXME("root folder is ignored\n"); BROWSEINFOW bi = { 0 }; bi.hwndOwner = reinterpret_cast<HWND>(LongToHandle(Hwnd)); bi.lpszTitle = Title; bi.ulFlags = Options; CComHeapPtr<ITEMIDLIST> selection; selection.Attach(SHBrowseForFolderW(&bi)); if (!selection) return S_FALSE; return ShellObjectCreatorInit<CFolder>(static_cast<LPITEMIDLIST>(selection), IID_PPV_ARG(Folder, ppsdf)); }