+static LPITEMIDLIST _ILCreate(LPCWSTR lpszPath, LPCITEMIDLIST lpcFindDataPidl)
+{
+ int pathLen = (wcslen(lpszPath) + 1) * sizeof(WCHAR);
+ int cbData = sizeof(WORD) + pathLen + lpcFindDataPidl->mkid.cb;
+ LPITEMIDLIST pidl = (LPITEMIDLIST) SHAlloc(cbData + sizeof(WORD));
+ if (!pidl)
+ return NULL;
+
+ LPBYTE p = (LPBYTE) pidl;
+ *((WORD *) p) = cbData;
+ p += sizeof(WORD);
+
+ memcpy(p, lpszPath, pathLen);
+ p += pathLen;
+
+ memcpy(p, lpcFindDataPidl, lpcFindDataPidl->mkid.cb);
+ p += lpcFindDataPidl->mkid.cb;
+
+ *((WORD *) p) = 0;
+
+ return pidl;
+}
+
+static LPCWSTR _ILGetPath(LPCITEMIDLIST pidl)
+{
+ if (!pidl || !pidl->mkid.cb)
+ return NULL;
+ return (LPCWSTR) pidl->mkid.abID;
+}
+
+static LPCITEMIDLIST _ILGetFSPidl(LPCITEMIDLIST pidl)
+{
+ if (!pidl || !pidl->mkid.cb)
+ return pidl;
+ return (LPCITEMIDLIST) ((LPBYTE) pidl->mkid.abID
+ + ((wcslen((LPCWSTR) pidl->mkid.abID) + 1) * sizeof(WCHAR)));
+}
+
+LRESULT CFindFolder::AddItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+ if (!lParam)
+ return 0;
+
+ HRESULT hr;
+ LPWSTR path = (LPWSTR) lParam;
+
+ CComPtr<IShellFolder> pShellFolder;
+ hr = SHGetDesktopFolder(&pShellFolder);
+ if (FAILED_UNEXPECTEDLY(hr))
+ {
+ LocalFree(path);
+ return hr;
+ }
+
+ LPITEMIDLIST lpFSPidl;
+ DWORD pchEaten;
+ hr = pShellFolder->ParseDisplayName(NULL, NULL, path, &pchEaten, &lpFSPidl, NULL);
+ if (FAILED_UNEXPECTEDLY(hr))
+ {
+ LocalFree(path);
+ return hr;
+ }
+
+ LPITEMIDLIST lpLastFSPidl = ILFindLastID(lpFSPidl);
+ LPITEMIDLIST lpSearchPidl = _ILCreate(path, lpLastFSPidl);
+ ILFree(lpFSPidl);
+ LocalFree(path);
+ if (!lpSearchPidl)
+ {
+ return E_OUTOFMEMORY;
+ }
+
+ UINT uItemIndex;
+ hr = m_shellFolderView->AddObject(lpSearchPidl, &uItemIndex);
+ ILFree(lpSearchPidl);
+
+ return hr;
+}
+