/************************************************************************** * ISvItemCm_fnRelease */ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu *iface) { ICOM_THIS(ItemCmImpl, iface); TRACE("(%p)->()\n",This); shell32_ObjCount--; if (!--(This->ref)) { TRACE(" destroying IContextMenu(%p)\n",This); if(This->pSFParent) IShellFolder_Release(This->pSFParent); if(This->pidl) SHFree(This->pidl); /*make sure the pidl is freed*/ _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(),0,This); return 0; } return This->ref; }
/* * for internal use */ HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj) { PIDLIST_ABSOLUTE pidlFolder; PUITEMID_CHILD *apidl; UINT cidl; HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); if (FAILED_UNEXPECTEDLY(hr)) return hr; if (cidl > 1) { ERR("SHMultiFileProperties is not yet implemented\n"); SHFree(pidlFolder); _ILFreeaPidl(apidl, cidl); return E_FAIL; } STRRET strFile; hr = psf->GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strFile); if (SUCCEEDED(hr)) { hr = SH_ShowPropertiesDialog(strFile.pOleStr, pidlFolder, apidl); if (FAILED(hr)) ERR("SH_ShowPropertiesDialog failed\n"); } else { ERR("Failed to get display name\n"); } SHFree(pidlFolder); _ILFreeaPidl(apidl, cidl); return hr; }
static ULONG WINAPI RecycleBinMenu_Release(IContextMenu2 *iface) { RecycleBinMenu *This = impl_from_IContextMenu2(iface); UINT result; TRACE("(%p)\n", This); result = InterlockedDecrement(&This->refCount); if (result == 0) { TRACE("Destroying object\n"); _ILFreeaPidl(This->apidl,This->cidl); IShellFolder_Release(This->folder); SHFree(This); } return result; }
/************************************************************************** * IDataObject_Release */ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) { ICOM_THIS(IDataObjectImpl,iface); TRACE("(%p)->()\n",This); shell32_ObjCount--; if (!--(This->ref)) { TRACE(" destroying IDataObject(%p)\n",This); _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(),0,This); return 0; } return This->ref; }
/************************************************************************** * IDataObject_Release */ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) { IDataObjectImpl *This = (IDataObjectImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(%u)\n", This, refCount + 1); if (!refCount) { TRACE(" destroying IDataObject(%p)\n",This); _ILFreeaPidl(This->apidl, This->cidl); ILFree(This->pidl), HeapFree(GetProcessHeap(),0,This); } return refCount; }
HRESULT CALLBACK RegFolderContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg != DFM_INVOKECOMMAND || wParam != DFM_CMD_PROPERTIES) return S_OK; PIDLIST_ABSOLUTE pidlFolder; PUITEMID_CHILD *apidl; UINT cidl; HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); if (FAILED_UNEXPECTEDLY(hr)) return hr; if (_ILIsMyComputer(apidl[0])) { if (32 >= (UINT)ShellExecuteW(hwnd, L"open", L"rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl", NULL, NULL, SW_SHOWNORMAL)) hr = E_FAIL; } else if (_ILIsDesktop(apidl[0])) { if (32 >= (UINT)ShellExecuteW(hwnd, L"open", L"rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL)) hr = E_FAIL; } else if (_ILIsNetHood(apidl[0])) { // FIXME path! if (32 >= (UINT)ShellExecuteW(NULL, L"open", L"explorer.exe", L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}", NULL, SW_SHOWDEFAULT)) hr = E_FAIL; } else if (_ILIsBitBucket(apidl[0])) { /* FIXME: detect the drive path of bitbucket if appropiate */ if (!SH_ShowRecycleBinProperties(L'C')) hr = E_FAIL; } SHFree(pidlFolder); _ILFreeaPidl(apidl, cidl); return hr; }
static ULONG WINAPI ContextMenu_Release(IContextMenu3 *iface) { ContextMenu *This = impl_from_IContextMenu3(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); if (!ref) { if(This->parent) IShellFolder_Release(This->parent); SHFree(This->pidl); _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(), 0, This); } return ref; }
/************************************************************************** * ISvItemCm_fnRelease */ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface) { ItemCmImpl *This = impl_from_IContextMenu2(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%i)\n", This, refCount + 1); if (!refCount) { TRACE(" destroying IContextMenu(%p)\n",This); if(This->pSFParent) IShellFolder_Release(This->pSFParent); SHFree(This->pidl); /*make sure the pidl is freed*/ _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(),0,This); } return refCount; }
IDataObjectImpl::~IDataObjectImpl() { TRACE(" destroying IDataObject(%p)\n",this); _ILFreeaPidl(apidl, cidl); ILFree(pidl); }
HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND) return S_OK; PIDLIST_ABSOLUTE pidlFolder; PUITEMID_CHILD *apidl; UINT cidl; HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); if (FAILED_UNEXPECTEDLY(hr)) return hr; char szDrive[8] = {0}; if (!_ILGetDrive(apidl[0], szDrive, sizeof(szDrive))) { ERR("pidl is not a drive\n"); SHFree(pidlFolder); _ILFreeaPidl(apidl, cidl); return E_FAIL; } if (uMsg == DFM_MERGECONTEXTMENU) { QCMINFO *pqcminfo = (QCMINFO *)lParam; DWORD dwFlags; if (GetVolumeInformationA(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0)) { /* Disable format if read only */ if (!(dwFlags & FILE_READ_ONLY_VOLUME) && GetDriveTypeA(szDrive) != DRIVE_REMOTE) { _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0x7ABC, MFT_STRING, MAKEINTRESOURCEW(IDS_FORMATDRIVE), MFS_ENABLED); } } } else if (uMsg == DFM_INVOKECOMMAND) { if(wParam == 0x7ABC) { SHFormatDrive(hwnd, szDrive[0] - 'A', SHFMT_ID_DEFAULT, 0); } else if (wParam == DFM_CMD_PROPERTIES) { WCHAR wszBuf[4]; wcscpy(wszBuf, L"A:\\"); wszBuf[0] = (WCHAR)szDrive[0]; if (!SH_ShowDriveProperties(wszBuf, pidlFolder, apidl)) hr = E_FAIL; } } SHFree(pidlFolder); _ILFreeaPidl(apidl, cidl); return hr; }
CIDLDataObj::~CIDLDataObj() { TRACE(" destroying IDataObject(%p)\n",this); _ILFreeaPidl(apidl, cidl); ILFree(pidl); }
static BOOL DoPaste(ContextMenu *This) { BOOL bSuccess = FALSE; IDataObject * pda; TRACE("\n"); if(SUCCEEDED(OleGetClipboard(&pda))) { STGMEDIUM medium; FORMATETC formatetc; TRACE("pda=%p\n", pda); /* Set the FORMATETC structure*/ InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLISTW), TYMED_HGLOBAL); /* Get the pidls from IDataObject */ if(SUCCEEDED(IDataObject_GetData(pda,&formatetc,&medium))) { LPITEMIDLIST * apidl; LPITEMIDLIST pidl; IShellFolder *psfFrom = NULL, *psfDesktop; LPIDA lpcida = GlobalLock(medium.u.hGlobal); TRACE("cida=%p\n", lpcida); apidl = _ILCopyCidaToaPidl(&pidl, lpcida); /* bind to the source shellfolder */ SHGetDesktopFolder(&psfDesktop); if(psfDesktop) { IShellFolder_BindToObject(psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID*)&psfFrom); IShellFolder_Release(psfDesktop); } if (psfFrom) { /* get source and destination shellfolder */ ISFHelper *psfhlpdst, *psfhlpsrc; IShellFolder_QueryInterface(This->parent, &IID_ISFHelper, (void**)&psfhlpdst); IShellFolder_QueryInterface(psfFrom, &IID_ISFHelper, (void**)&psfhlpsrc); /* do the copy/move */ if (psfhlpdst && psfhlpsrc) { ISFHelper_CopyItems(psfhlpdst, psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl); /* FIXME handle move ISFHelper_DeleteItems(psfhlpsrc, lpcida->cidl, apidl); */ } if(psfhlpdst) ISFHelper_Release(psfhlpdst); if(psfhlpsrc) ISFHelper_Release(psfhlpsrc); IShellFolder_Release(psfFrom); } _ILFreeaPidl(apidl, lpcida->cidl); SHFree(pidl); /* release the medium*/ ReleaseStgMedium(&medium); } IDataObject_Release(pda); } #if 0 HGLOBAL hMem; OpenClipboard(NULL); hMem = GetClipboardData(CF_HDROP); if(hMem) { char * pDropFiles = GlobalLock(hMem); if(pDropFiles) { int len, offset = sizeof(DROPFILESTRUCT); while( pDropFiles[offset] != 0) { len = strlen(pDropFiles + offset); TRACE("%s\n", pDropFiles + offset); offset += len+1; } } GlobalUnlock(hMem); } CloseClipboard(); #endif return bSuccess; }