Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennewmenu.cpp
Go to the documentation of this file.
00001 /* 00002 * provides new shell item service 00003 * 00004 * Copyright 2007 Johannes Anderwald (janderwald@reactos.org) 00005 * Copyright 2009 Andrew Hill 00006 * Copyright 2012 Rafal Harabien 00007 * 00008 * This library is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * This library is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00021 */ 00022 00023 #include <precomp.h> 00024 00025 WINE_DEFAULT_DEBUG_CHANNEL(shell); 00026 00027 CNewMenu::CNewMenu() 00028 { 00029 m_wszPath = NULL; 00030 m_pItems = NULL; 00031 m_pLinkItem = NULL; 00032 m_pSite = NULL; 00033 m_hbmFolder = NULL; 00034 m_hbmLink = NULL; 00035 } 00036 00037 CNewMenu::~CNewMenu() 00038 { 00039 UnloadAllItems(); 00040 if (m_hbmFolder) 00041 DeleteObject(m_hbmFolder); 00042 if (m_hbmLink) 00043 DeleteObject(m_hbmLink); 00044 } 00045 00046 void CNewMenu::UnloadItem(SHELLNEW_ITEM *pItem) 00047 { 00048 /* Note: free allows NULL as argument */ 00049 free(pItem->pData); 00050 free(pItem->pwszDesc); 00051 free(pItem->pwszExt); 00052 00053 if (pItem->hBitmap) 00054 DeleteObject(pItem->hBitmap); 00055 00056 HeapFree(GetProcessHeap(), 0, pItem); 00057 } 00058 00059 void CNewMenu::UnloadAllItems() 00060 { 00061 SHELLNEW_ITEM *pCurItem; 00062 00063 /* Unload normal items */ 00064 while (m_pItems) 00065 { 00066 pCurItem = m_pItems; 00067 m_pItems = m_pItems->pNext; 00068 00069 UnloadItem(pCurItem); 00070 } 00071 00072 /* Unload link item */ 00073 if (m_pLinkItem) 00074 UnloadItem(m_pLinkItem); 00075 m_pLinkItem = NULL; 00076 } 00077 00078 static HBITMAP IconToBitmap(HICON hIcon) 00079 { 00080 HDC hdc, hdcScr; 00081 HBITMAP hbm, hbmOld; 00082 RECT rc; 00083 00084 hdcScr = GetDC(NULL); 00085 hdc = CreateCompatibleDC(hdcScr); 00086 SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK)); 00087 hbm = CreateCompatibleBitmap(hdcScr, rc.right, rc.bottom); 00088 ReleaseDC(NULL, hdcScr); 00089 00090 hbmOld = (HBITMAP)SelectObject(hdc, hbm); 00091 FillRect(hdc, &rc, (HBRUSH)(COLOR_MENU + 1)); 00092 if (!DrawIconEx(hdc, 0, 0, hIcon, rc.right, rc.bottom, 0, NULL, DI_NORMAL)) 00093 ERR("DrawIcon failed: %x\n", GetLastError()); 00094 SelectObject(hdc, hbmOld); 00095 00096 DeleteDC(hdc); 00097 00098 return hbm; 00099 } 00100 00101 CNewMenu::SHELLNEW_ITEM *CNewMenu::LoadItem(LPCWSTR pwszExt) 00102 { 00103 HKEY hKey; 00104 WCHAR wszBuf[MAX_PATH]; 00105 BYTE *pData = NULL; 00106 DWORD cbData; 00107 00108 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s\\ShellNew", pwszExt); 00109 00110 TRACE("LoadItem Keyname %s Name %s\n", debugstr_w(pwszExt), debugstr_w(wszBuf)); 00111 00112 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, KEY_READ, &hKey) != ERROR_SUCCESS) 00113 { 00114 TRACE("Failed to open key\n"); 00115 return NULL; 00116 } 00117 00118 /* Find first valid value */ 00119 struct 00120 { 00121 LPCWSTR pszName; 00122 SHELLNEW_TYPE Type; 00123 BOOL bNeedData; 00124 BOOL bStr; 00125 } Types[] = { 00126 {L"FileName", SHELLNEW_TYPE_FILENAME, TRUE, TRUE}, 00127 {L"Command", SHELLNEW_TYPE_COMMAND, TRUE, TRUE}, 00128 {L"Data", SHELLNEW_TYPE_DATA, TRUE, FALSE}, 00129 {L"NullFile", SHELLNEW_TYPE_NULLFILE, FALSE}, 00130 {NULL} 00131 }; 00132 UINT i; 00133 00134 for (i = 0; Types[i].pszName; ++i) 00135 { 00136 /* Note: We are using ANSI function because strings can be treated as data */ 00137 cbData = 0; 00138 DWORD dwFlags = Types[i].bStr ? RRF_RT_REG_SZ : RRF_RT_ANY; 00139 DWORD dwType; 00140 if (RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, NULL, NULL, &cbData) == ERROR_SUCCESS) 00141 { 00142 if (Types[i].bNeedData && cbData > 0) 00143 { 00144 pData = (BYTE*)malloc(cbData); 00145 RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, &dwType, pData, &cbData); 00146 if (!Types[i].bStr && (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) 00147 { 00148 PBYTE pData2 = (PBYTE)malloc(cbData); 00149 cbData = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pData, -1, (LPSTR)pData2, cbData, NULL, NULL); 00150 free(pData); 00151 pData = pData2; 00152 } 00153 } 00154 break; 00155 } 00156 } 00157 RegCloseKey(hKey); 00158 00159 /* Was any key found? */ 00160 if (!Types[i].pszName) 00161 return NULL; 00162 00163 SHFILEINFO fi; 00164 if (!SHGetFileInfoW(pwszExt, FILE_ATTRIBUTE_NORMAL, &fi, sizeof(fi), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON)) 00165 return NULL; 00166 00167 /* Create new item */ 00168 SHELLNEW_ITEM *pNewItem = (SHELLNEW_ITEM *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM)); 00169 if (!pNewItem) 00170 { 00171 free(pData); 00172 return NULL; 00173 } 00174 00175 TRACE("new item %ls\n", fi.szTypeName); 00176 pNewItem->Type = Types[i].Type; 00177 pNewItem->pData = pData; 00178 pNewItem->cbData = pData ? cbData : 0; 00179 pNewItem->pwszExt = _wcsdup(pwszExt); 00180 pNewItem->pwszDesc = _wcsdup(fi.szTypeName); 00181 if (fi.hIcon) 00182 pNewItem->hBitmap = IconToBitmap(fi.hIcon); 00183 00184 return pNewItem; 00185 } 00186 00187 BOOL 00188 CNewMenu::LoadAllItems() 00189 { 00190 DWORD dwIndex = 0; 00191 WCHAR wszName[MAX_PATH]; 00192 SHELLNEW_ITEM *pNewItem; 00193 SHELLNEW_ITEM *pCurItem = NULL; 00194 00195 /* If there are any unload them */ 00196 UnloadAllItems(); 00197 00198 /* Enumerate all extesions */ 00199 while (RegEnumKeyW(HKEY_CLASSES_ROOT, dwIndex++, wszName, _countof(wszName)) == ERROR_SUCCESS) 00200 { 00201 if (wszName[0] != L'.') 00202 continue; 00203 00204 pNewItem = LoadItem(wszName); 00205 if (pNewItem) 00206 { 00207 if (wcsicmp(pNewItem->pwszExt, L".lnk") == 0) 00208 { 00209 /* Link handler */ 00210 m_pLinkItem = pNewItem; 00211 } 00212 else 00213 { 00214 /* Add at the end of list */ 00215 if (pCurItem) 00216 { 00217 pCurItem->pNext = pNewItem; 00218 pCurItem = pNewItem; 00219 } 00220 else 00221 pCurItem = m_pItems = pNewItem; 00222 } 00223 } 00224 } 00225 00226 if (!m_pLinkItem) 00227 { 00228 m_pLinkItem = (SHELLNEW_ITEM *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM)); 00229 if (m_pLinkItem) 00230 { 00231 m_pLinkItem->Type = SHELLNEW_TYPE_NULLFILE; 00232 m_pLinkItem->pwszDesc = _wcsdup(L"Link"); 00233 m_pLinkItem->pwszExt = _wcsdup(L".lnk"); 00234 } 00235 } 00236 00237 if (m_pItems == NULL) 00238 return FALSE; 00239 else 00240 return TRUE; 00241 } 00242 00243 UINT 00244 CNewMenu::InsertShellNewItems(HMENU hMenu, UINT idCmdFirst, UINT Pos) 00245 { 00246 MENUITEMINFOW mii; 00247 WCHAR wszBuf[256]; 00248 UINT idCmd = idCmdFirst; 00249 00250 if (m_pItems == NULL) 00251 { 00252 if (!LoadAllItems()) 00253 return 0; 00254 } 00255 00256 ZeroMemory(&mii, sizeof(mii)); 00257 mii.cbSize = sizeof(mii); 00258 00259 /* Insert new folder action */ 00260 if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEWFOLDER, wszBuf, _countof(wszBuf))) 00261 wszBuf[0] = 0; 00262 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; 00263 mii.fType = MFT_STRING; 00264 mii.dwTypeData = wszBuf; 00265 mii.cch = wcslen(mii.dwTypeData); 00266 mii.wID = idCmd; 00267 if (m_hbmFolder) 00268 { 00269 mii.fMask |= MIIM_CHECKMARKS; 00270 mii.hbmpChecked = mii.hbmpUnchecked = m_hbmFolder; 00271 } 00272 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii)) 00273 ++idCmd; 00274 00275 /* Insert new shortcut action */ 00276 if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEWLINK, wszBuf, _countof(wszBuf))) 00277 wszBuf[0] = 0; 00278 mii.dwTypeData = wszBuf; 00279 mii.cch = wcslen(mii.dwTypeData); 00280 mii.wID = idCmd; 00281 if (m_hbmLink) 00282 { 00283 mii.fMask |= MIIM_CHECKMARKS; 00284 mii.hbmpChecked = mii.hbmpUnchecked = m_hbmLink; 00285 } 00286 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii)) 00287 ++idCmd; 00288 00289 /* Insert seperator for custom new action */ 00290 mii.fMask = MIIM_TYPE | MIIM_ID; 00291 mii.fType = MFT_SEPARATOR; 00292 mii.wID = -1; 00293 InsertMenuItemW(hMenu, Pos++, TRUE, &mii); 00294 00295 /* Insert rest of items */ 00296 mii.fType = MFT_STRING; 00297 mii.fState = MFS_ENABLED; 00298 00299 SHELLNEW_ITEM *pCurItem = m_pItems; 00300 while (pCurItem) 00301 { 00302 TRACE("szDesc %s\n", debugstr_w(pCurItem->pwszDesc)); 00303 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; 00304 mii.dwTypeData = pCurItem->pwszDesc; 00305 mii.cch = wcslen(mii.dwTypeData); 00306 mii.wID = idCmd; 00307 if (pCurItem->hBitmap) 00308 { 00309 mii.fMask |= MIIM_CHECKMARKS; 00310 mii.hbmpChecked = mii.hbmpUnchecked = pCurItem->hBitmap; 00311 } 00312 if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii)) 00313 ++idCmd; 00314 pCurItem = pCurItem->pNext; 00315 } 00316 00317 return idCmd - idCmdFirst; 00318 } 00319 00320 CNewMenu::SHELLNEW_ITEM *CNewMenu::FindItemFromIdOffset(UINT IdOffset) 00321 { 00322 if (IdOffset == 0) 00323 return NULL; /* Folder */ 00324 00325 if (IdOffset == 1) 00326 return m_pLinkItem; /* shortcut */ 00327 00328 /* Find shell new item */ 00329 SHELLNEW_ITEM *pItem = m_pItems; 00330 for (UINT i = 2; pItem; ++i) 00331 { 00332 if (i == IdOffset) 00333 break; 00334 00335 pItem = pItem->pNext; 00336 } 00337 00338 return pItem; 00339 } 00340 00341 HRESULT CNewMenu::CreateNewFolder(IShellView *psv) 00342 { 00343 WCHAR wszName[MAX_PATH]; 00344 CComPtr<ISFHelper> psfhlp; 00345 CComPtr<IFolderView> pFolderView; 00346 CComPtr<IShellFolder> pParentFolder; 00347 HRESULT hr; 00348 00349 //if (m_pSite == NULL) 00350 // return E_FAIL; 00351 00352 /* Get current folder */ 00353 hr = IUnknown_QueryService(psv, SID_IFolderView, IID_IFolderView, (void **)&pFolderView); 00354 if (FAILED(hr)) 00355 return hr; 00356 00357 hr = pFolderView->GetFolder(IID_IShellFolder, (void **)&pParentFolder); 00358 if (FAILED(hr)) 00359 return hr; 00360 00361 hr = pParentFolder->QueryInterface(IID_ISFHelper, (LPVOID*)&psfhlp); 00362 if (FAILED(hr)) 00363 return hr; 00364 00365 LPITEMIDLIST pidl; 00366 00367 /* Get unique name and create a folder */ 00368 hr = psfhlp->GetUniqueName(wszName, _countof(wszName)); 00369 if (hr != S_OK) 00370 return hr; 00371 hr = psfhlp->AddFolder(0, wszName, &pidl); 00372 if (hr != S_OK) 00373 { 00374 WCHAR wszBuf[256]; 00375 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create folder: %s", wszName); 00376 MessageBoxW(NULL, wszBuf, L"Cannot create folder", MB_OK|MB_ICONERROR); 00377 return hr; 00378 } 00379 00380 /* Do a labeledit */ 00381 psv->Refresh(); 00382 psv->SelectItem(pidl, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | 00383 SVSI_FOCUSED | SVSI_SELECT); 00384 00385 SHFree(pidl); 00386 return S_OK; 00387 } 00388 00389 HRESULT CNewMenu::CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi, IShellView *psv) 00390 { 00391 LPITEMIDLIST pidl; 00392 STRRET strTemp; 00393 WCHAR wszBuf[MAX_PATH]; 00394 WCHAR wszPath[MAX_PATH]; 00395 CComPtr<IFolderView> pFolderView; 00396 CComPtr<IShellFolder> pParentFolder; 00397 CComPtr<IPersistFolder3> psf; 00398 HRESULT hr; 00399 00400 /* Get current folder */ 00401 hr = IUnknown_QueryService(psv, SID_IFolderView, IID_IFolderView, (void **)&pFolderView); 00402 if (FAILED(hr)) 00403 return hr; 00404 00405 hr = pFolderView->GetFolder(IID_IShellFolder, (void **)&pParentFolder); 00406 if (FAILED(hr)) 00407 return hr; 00408 00409 if (pParentFolder->QueryInterface(IID_IPersistFolder2, (LPVOID*)&psf) != S_OK) 00410 { 00411 ERR("Failed to get interface IID_IPersistFolder2\n"); 00412 return E_FAIL; 00413 } 00414 00415 if (psf->GetCurFolder(&pidl) != S_OK) 00416 { 00417 ERR("IPersistFolder2_GetCurFolder failed\n"); 00418 return E_FAIL; 00419 } 00420 00421 /* Get folder path */ 00422 if (pParentFolder == NULL || pParentFolder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strTemp) != S_OK) 00423 { 00424 ERR("IShellFolder_GetDisplayNameOf failed\n"); 00425 return E_FAIL; 00426 } 00427 StrRetToBufW(&strTemp, pidl, wszPath, _countof(wszPath)); 00428 00429 switch (pItem->Type) 00430 { 00431 case SHELLNEW_TYPE_COMMAND: 00432 { 00433 LPWSTR Ptr, pwszCmd; 00434 WCHAR wszTemp[MAX_PATH]; 00435 STARTUPINFOW si; 00436 PROCESS_INFORMATION pi; 00437 00438 if (!ExpandEnvironmentStringsW((LPWSTR)pItem->pData, wszBuf, MAX_PATH)) 00439 { 00440 TRACE("ExpandEnvironmentStrings failed\n"); 00441 break; 00442 } 00443 00444 /* Expand command parameter, FIXME: there can be more modifiers */ 00445 Ptr = wcsstr(wszBuf, L"%1"); 00446 if (Ptr) 00447 { 00448 Ptr[1] = 's'; 00449 StringCbPrintfW(wszTemp, sizeof(wszTemp), wszBuf, wszPath); 00450 pwszCmd = wszTemp; 00451 } 00452 else 00453 pwszCmd = wszBuf; 00454 00455 /* Create process */ 00456 ZeroMemory(&si, sizeof(si)); 00457 si.cb = sizeof(si); 00458 if (CreateProcessW(NULL, pwszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 00459 { 00460 CloseHandle(pi.hProcess); 00461 CloseHandle(pi.hThread); 00462 } else 00463 ERR("Failed to create process\n"); 00464 break; 00465 } 00466 case SHELLNEW_TYPE_DATA: 00467 case SHELLNEW_TYPE_FILENAME: 00468 case SHELLNEW_TYPE_NULLFILE: 00469 { 00470 BOOL bSuccess = TRUE; 00471 LPWSTR pwszFilename = NULL; 00472 size_t cchFilenameMax = 0; 00473 00474 /* Build new file name */ 00475 LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszBuf, _countof(wszBuf)); 00476 StringCchCatExW(wszPath, _countof(wszPath), L"\\", &pwszFilename, &cchFilenameMax, 0); 00477 StringCchPrintfW(pwszFilename, cchFilenameMax, L"%s %s%s", wszBuf, pItem->pwszDesc, pItem->pwszExt); 00478 00479 /* Find unique name */ 00480 for (UINT i = 2; PathFileExistsW(wszPath); ++i) 00481 { 00482 StringCchPrintfW(pwszFilename, cchFilenameMax, L"%s %s (%u)%s", wszBuf, pItem->pwszDesc, i, pItem->pwszExt); 00483 TRACE("New Filename %ls\n", pwszFilename); 00484 } 00485 00486 /* Create new file */ 00487 HANDLE hFile = CreateFileW(wszPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 00488 if (hFile != INVALID_HANDLE_VALUE) 00489 { 00490 if (pItem->Type == SHELLNEW_TYPE_DATA) 00491 { 00492 /* Write a content */ 00493 DWORD cbWritten; 00494 WriteFile(hFile, pItem->pData, pItem->cbData, &cbWritten, NULL); 00495 } 00496 00497 /* Close file now */ 00498 CloseHandle(hFile); 00499 } else 00500 bSuccess = FALSE; 00501 00502 if (pItem->Type == SHELLNEW_TYPE_FILENAME) 00503 { 00504 /* Copy file */ 00505 if (!CopyFileW((LPWSTR)pItem->pData, wszPath, FALSE)) 00506 ERR("Copy file failed: %ls\n", (LPWSTR)pItem->pData); 00507 } 00508 00509 /* Show message if we failed */ 00510 if (bSuccess) 00511 { 00512 TRACE("Notifying fs %s\n", debugstr_w(wszPath)); 00513 SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, (LPCVOID)wszPath, NULL); 00514 psv->Refresh(); 00515 00516 LPITEMIDLIST pidl; 00517 hr = _ILCreateFromPathW(wszPath, &pidl); 00518 if (SUCCEEDED(hr)) 00519 { 00520 psv->SelectItem(pidl, SVSI_DESELECTOTHERS|SVSI_EDIT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED|SVSI_SELECT); 00521 ILFree(pidl); 00522 } 00523 } 00524 else 00525 { 00526 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create file: %s", pwszFilename); 00527 MessageBoxW(NULL, wszBuf, L"Cannot create file", MB_OK|MB_ICONERROR); // FIXME 00528 } 00529 break; 00530 } 00531 case SHELLNEW_TYPE_INVALID: 00532 ERR("Invalid type\n"); 00533 break; 00534 } 00535 00536 return S_OK; 00537 } 00538 00539 HRESULT STDMETHODCALLTYPE CNewMenu::SetSite(IUnknown *pUnkSite) 00540 { 00541 m_pSite = pUnkSite; 00542 return S_OK; 00543 } 00544 00545 HRESULT STDMETHODCALLTYPE CNewMenu::GetSite(REFIID riid, void **ppvSite) 00546 { 00547 if (ppvSite == NULL) 00548 return E_POINTER; 00549 *ppvSite = m_pSite; 00550 if (m_pSite != NULL) 00551 m_pSite->AddRef(); 00552 return S_OK; 00553 } 00554 00555 HRESULT 00556 WINAPI 00557 CNewMenu::QueryContextMenu(HMENU hMenu, 00558 UINT indexMenu, 00559 UINT idCmdFirst, 00560 UINT idCmdLast, 00561 UINT uFlags) 00562 { 00563 WCHAR wszNew[200]; 00564 MENUITEMINFOW mii; 00565 UINT cItems = 0; 00566 00567 TRACE("%p %p %u %u %u %u\n", this, 00568 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); 00569 00570 if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszNew, _countof(wszNew))) 00571 return E_FAIL; 00572 00573 m_hSubMenu = CreateMenu(); 00574 if (!m_hSubMenu) 00575 return E_FAIL; 00576 00577 cItems = InsertShellNewItems(m_hSubMenu, idCmdFirst, 0); 00578 00579 memset(&mii, 0, sizeof(mii)); 00580 mii.cbSize = sizeof(mii); 00581 mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE | MIIM_SUBMENU; 00582 mii.fType = MFT_STRING; 00583 mii.wID = -1; 00584 mii.dwTypeData = wszNew; 00585 mii.cch = wcslen(mii.dwTypeData); 00586 mii.fState = MFS_ENABLED; 00587 mii.hSubMenu = m_hSubMenu; 00588 00589 if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii)) 00590 return E_FAIL; 00591 00592 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems); 00593 } 00594 00595 HRESULT 00596 WINAPI 00597 CNewMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) 00598 { 00599 IShellBrowser *lpSB = NULL; 00600 CComPtr<IShellView> lpSV = NULL; 00601 HRESULT hr = E_FAIL; 00602 00603 /* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */ 00604 lpSB = (LPSHELLBROWSER)SendMessageA(lpici->hwnd, CWM_GETISHELLBROWSER, 0, 0); 00605 if (lpSB) 00606 lpSB->QueryActiveShellView(&lpSV); 00607 00608 if (LOWORD(lpici->lpVerb) == 0) 00609 hr = CreateNewFolder(lpSV); 00610 else 00611 { 00612 SHELLNEW_ITEM *pItem = FindItemFromIdOffset(LOWORD(lpici->lpVerb)); 00613 if (pItem) 00614 hr = CreateNewItem(pItem, lpici, lpSV); 00615 } 00616 00617 TRACE("CNewMenu::InvokeCommand %x\n", hr); 00618 return hr; 00619 } 00620 00621 HRESULT 00622 WINAPI 00623 CNewMenu::GetCommandString(UINT_PTR idCmd, 00624 UINT uType, 00625 UINT *pwReserved, 00626 LPSTR pszName, 00627 UINT cchMax) 00628 { 00629 FIXME("%p %lu %u %p %p %u\n", this, 00630 idCmd, uType, pwReserved, pszName, cchMax ); 00631 00632 return E_NOTIMPL; 00633 } 00634 00635 HRESULT 00636 WINAPI 00637 CNewMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) 00638 { 00639 return S_OK; 00640 } 00641 00642 HRESULT WINAPI 00643 CNewMenu::Initialize(LPCITEMIDLIST pidlFolder, 00644 IDataObject *pdtobj, HKEY hkeyProgID) 00645 { 00646 /* Load folder and shortcut icons */ 00647 HICON hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_FOLDER), IMAGE_ICON, 0, 0, LR_SHARED); 00648 m_hbmFolder = hIcon ? IconToBitmap(hIcon) : NULL; 00649 hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_SHORTCUT), IMAGE_ICON, 0, 0, LR_SHARED); 00650 m_hbmLink = hIcon ? IconToBitmap(hIcon) : NULL; 00651 00652 return S_OK; 00653 } Generated on Sun May 27 2012 04:26:23 for ReactOS by
1.7.6.1
|