예제 #1
0
IShellFolder * CPropertiesCtrl::GetFolderByPath( IShellFolder * piParent, const TCHAR * sPathFolder, LPITEMIDLIST * ppItem, CSCADString& sName, IExtractIcon ** ppiIcon )
{
	if( !sPathFolder || !*sPathFolder )
		return NULL;

	OLECHAR olePath[MAX_PATH];
	OLECHAR * sPath;
	ULONG chEaten;
	ULONG dwAttributes;
	HRESULT hr;
	_STRRET strret;
	LPSHELLFOLDER piResFolder = NULL;
	bool bMustRelease = false;
	CComPtr<IShellFolder> piFolder;
	CComPtr<IMalloc> piMalloc;

	if( !piParent )
	{
		SHGetDesktopFolder( &piFolder );
		bMustRelease = true;
	}
	else
		piFolder = piParent;

	if( !piFolder )
		return NULL;

#ifndef UNICODE

	MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, sPathFolder, -1, olePath, MAX_PATH );
	sPath = (OLECHAR*)olePath;

#else
	
	sPath = sPathFolder;

#endif //UNICODE

	hr = piFolder->ParseDisplayName( NULL, NULL, sPath, &chEaten, ppItem, &dwAttributes );
	   
	if( FAILED( hr ) )
		return NULL;

	hr = piFolder->GetDisplayNameOf( *ppItem, SHGDN_NORMAL, &strret );
	SHGetMalloc( &piMalloc );
	sName = StrRetToStr(*ppItem, strret, true, piMalloc );
	*ppiIcon = NULL;
	hr = piFolder->GetUIObjectOf( NULL, 1, (LPCITEMIDLIST*)ppItem, IID_IExtractIcon, NULL, (void**)ppiIcon );
	hr = piFolder->BindToObject( *ppItem, 0, IID_IShellFolder, (void**)&piResFolder );

	return piResFolder;
}
예제 #2
0
stdstring ItemIDList::toString()
{
	IShellFolder *shellFolder = NULL;
	IShellFolder *parentFolder = NULL;
	STRRET name;
	TCHAR * szDisplayName = NULL;
	stdstring ret;
	HRESULT hr;

	hr = ::SHGetDesktopFolder(&shellFolder);
	if (!SUCCEEDED(hr))
		return ret;
	if (parent_)
	{
		hr = shellFolder->BindToObject(parent_, 0, IID_IShellFolder, (void**) &parentFolder);
		if (!SUCCEEDED(hr))
			parentFolder = shellFolder;
	}
	else
	{
		parentFolder = shellFolder;
	}

	if ((parentFolder != 0)&&(item_ != 0))
	{
		hr = parentFolder->GetDisplayNameOf(item_, SHGDN_NORMAL | SHGDN_FORPARSING, &name);
		if (!SUCCEEDED(hr))
		{
			parentFolder->Release();
			return ret;
		}
		hr = StrRetToStr (&name, item_, &szDisplayName);
		if (!SUCCEEDED(hr))
			return ret;
	}
	parentFolder->Release();
	if (szDisplayName == NULL)
	{
		CoTaskMemFree(szDisplayName);
		return ret;			//to avoid a crash!
	}
	ret = szDisplayName;
	CoTaskMemFree(szDisplayName);
	return ret;
}
예제 #3
0
/////////////////////////////////////////////////////////////////////////////
// IShellInit Functions
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CShellExt::XShellInit::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdobj, HKEY hkeyProgID)
{
    METHOD_PROLOGUE(CShellExt, ShellInit);

    HRESULT hres = E_FAIL;
    FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    STGMEDIUM medium;

    // We must have a data object
    if ((pdobj == NULL) && (pidlFolder == NULL))
        return E_FAIL;

    pThis->m_bIsSymlink=false;
    pThis->m_bIsMountpoint=false;
    pThis->m_bIsPathInAFS=false;
    pThis->m_bDirSelected=false;

    if (pdobj) {
        //  Use the given IDataObject to get a list of filenames (CF_HDROP)
        hres = pdobj->GetData(&fmte, &medium);
        if (FAILED(hres)) {
        return E_FAIL;
        }

        int nNumFiles = DragQueryFile((HDROP)medium.hGlobal, 0xFFFFFFFF, NULL, 0);
        if (nNumFiles == 0)
            hres = E_FAIL;
        else {
            pThis->m_bDirSelected = FALSE;

            for (int ii = 0; ii < nNumFiles; ii++) {
                CString strFileName;

                // Get the size of the file name string
                int nNameLen = DragQueryFile((HDROP)medium.hGlobal, ii, 0, 0);

                // Make room for it in our string object
                LPTSTR pszFileNameBuf = strFileName.GetBuffer(nNameLen + 1);	// +1 for the terminating NULL
                ASSERT(pszFileNameBuf);

                // Get the file name
                DragQueryFile((HDROP)medium.hGlobal, ii, pszFileNameBuf, nNameLen + 1);

                strFileName.ReleaseBuffer();
                if (!IsPathInAfs(strFileName)) {
                pThis->m_astrFileNames.RemoveAll();
                pThis->m_bIsPathInAFS=false;
                break;
                } else {
                pThis->m_bIsSymlink=pThis->m_bIsSymlink||IsSymlink(strFileName);
                pThis->m_bIsMountpoint=pThis->m_bIsMountpoint||IsMountPoint(strFileName);
                pThis->m_bIsPathInAFS=true;
                }

                if (IsADir(strFileName))
                pThis->m_bDirSelected = TRUE;

                pThis->m_astrFileNames.Add(strFileName);
            }
            //	Release the data
            ReleaseStgMedium(&medium);
        }
    }
    if ((pThis->m_astrFileNames.GetSize() == 0)&&(pidlFolder)) {
        // if there are no valid files selected, try the folder background
        IShellFolder *parentFolder = NULL;
        STRRET name;
        TCHAR * szDisplayName = NULL;

        hres = ::SHGetDesktopFolder(&parentFolder);
        if (FAILED(hres))
            return hres;

        hres = parentFolder->GetDisplayNameOf(pidlFolder, SHGDN_NORMAL | SHGDN_FORPARSING, &name);
        if (FAILED(hres)) {
            parentFolder->Release();
            return hres;
        }

        hres = StrRetToStr (&name, pidlFolder, &szDisplayName);
        if (FAILED(hres))
            return hres;
        parentFolder->Release();
        if (szDisplayName) {
            pThis->m_bDirSelected = TRUE;
            CString strFileName = CString(szDisplayName);
            if (IsPathInAfs(strFileName)) {
                pThis->m_bIsSymlink=IsSymlink(strFileName);
                pThis->m_bIsMountpoint=IsMountPoint(strFileName);
                pThis->m_bIsPathInAFS=true;
                pThis->m_astrFileNames.Add(strFileName);
            }
            CoTaskMemFree(szDisplayName);
        }
    }
	if (pThis->m_astrFileNames.GetSize() > 0)
	    hres = NOERROR;
	else
	    hres = E_FAIL;

    return hres;
}
예제 #4
0
HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
{
    HRESULT hr;

    CComPtr<IEnumIDList> eidl;
    hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
    if (FAILED_UNEXPECTEDLY(hr))
        return hr;

    HDPA dpaSort = DPA_Create(10);

    LPITEMIDLIST item = NULL;
    hr = eidl->Next(1, &item, NULL);
    while (hr == S_OK)
    {
        if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE)
        {
            DPA_AppendPtr(dpaSort, ILClone(item));
        }

        hr = eidl->Next(1, &item, NULL);
    }

    // If no items were added, show the "empty" placeholder
    if (DPA_GetPtrCount(dpaSort) == 0)
    {
        DPA_Destroy(dpaSort);
        return AddPlaceholder();
    }

    TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort));

    DPA_Sort(dpaSort, PidlListSort, (LPARAM) m_shellFolder.p);

    for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
    {
        PWSTR MenuString;

        INT index = 0;
        INT indexOpen = 0;

        STRRET sr = { STRRET_CSTR, { 0 } };

        item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);

        hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
        if (FAILED_UNEXPECTEDLY(hr))
        {
            DPA_Destroy(dpaSort);
            return hr;
        }

        StrRetToStr(&sr, NULL, &MenuString);

        index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);

        LPCITEMIDLIST itemc = item;

        SFGAOF attrs = SFGAO_FOLDER;
        hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);

        DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(item);

        // Fetch next item already, so we know if the current one is the last
        i++;

        AddButton(i, MenuString, attrs & SFGAO_FOLDER, index, dwData, i >= DPA_GetPtrCount(dpaSort));

        CoTaskMemFree(MenuString);
    }

    DPA_Destroy(dpaSort);
    return hr;
}
예제 #5
0
BOOL CPropertiesCtrl::OnExpanding( HTREEITEM hItem, UINT nCode )
{
	int i, nChild = 0;
	CFTCItemData * pItemData = (CFTCItemData*)GetItemData( hItem );

	switch( nCode )
	{
		case TVE_EXPAND:
			{
				CWaitCursor cur;
				nChild = GetChildCount( hItem );
				for( i = 0; i < nChild; i++ )
				{
					DelItemRecursive( GetNextItem( hItem, TVGN_CHILD ) );
					Invalidate();
				}

				CComPtr<IEnumIDList> piIDList;
				ULONG nRes = 0;
				ITEMIDLIST * pItem = NULL;
				HRESULT hr = pItemData->m_piFolder->EnumObjects( NULL, SHCONTF_FOLDERS, &piIDList );
				_STRRET strret;
				CSCADString sPath, sName;
				IExtractIcon * piEI = NULL;
				IShellFolder * piChildFolder = NULL;

				if( hr != NOERROR )
				{
					Invalidate();
					return FALSE;
				}
				for( hr = piIDList->Next( 1, &pItem, &nRes ); hr == NOERROR && nRes > 0; hr = piIDList->Next( 1, &pItem, &nRes ) )
				{
					hr = pItemData->m_piFolder->GetDisplayNameOf( pItem, SHGDN_INFOLDER, &strret );
					sName = StrRetToStr(pItem, strret, true, m_piMalloc );
					hr = pItemData->m_piFolder->GetDisplayNameOf( pItem, SHGDN_NORMAL | SHGDN_FORPARSING, &strret );
					sPath = StrRetToStr(pItem, strret, true, m_piMalloc );
					hr = pItemData->m_piFolder->GetUIObjectOf( NULL, 1, (LPCITEMIDLIST*)&pItem, IID_IExtractIcon, NULL, (void**)&piEI );
					hr = pItemData->m_piFolder->BindToObject( pItem, NULL, IID_IShellFolder, (void**)&piChildFolder );
					if( piChildFolder )
					{
						if( !piEI )
						{
							//hr = piChildFolder->CreateViewObject( NULL, IID_IExtractIcon, (void**)&piEI );
						}
						//InsertFolder( pItem, piChildFolder, piEI, sName, sPath, hItem );
						piChildFolder->Release();
						piChildFolder = NULL;
					}
					if( piEI )
					{
						piEI->Release();
						piEI = NULL;
					}
				}
			}
			return TRUE;
		default:
			nChild = GetChildCount( hItem );
			for( i = 0; i < nChild; i++ )
				DelItemRecursive( GetNextItem( hItem, TVGN_CHILD ) );
			if( !IsFolderEmpty( pItemData->m_piFolder ) )
				InsertItem( _T(""), hItem, TVI_LAST );
			break;
	}

	return TRUE;
}