📄 isf.cpp
字号:
/*****************************************************************************\
FILE: isf.cpp
DESCRIPTION:
This is a base class that implements the default behavior of IShellFolder.
\*****************************************************************************/
#include "priv.h"
#include "isf.h"
#include <shlobj.h>
/*****************************************************************************\
FUNCTION: IShellFolder::ParseDisplayName
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::ParseDisplayName(HWND hwnd, LPBC pbcReserved, LPOLESTR pwszDisplayName,
ULONG * pchEaten, LPITEMIDLIST * ppidl, ULONG *pdwAttributes)
{
if (pdwAttributes)
*pdwAttributes = 0;
if (ppidl)
*ppidl = NULL;
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::EnumObjects
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::EnumObjects(HWND hwndOwner, DWORD grfFlags, IEnumIDList ** ppenumIDList)
{
if (ppenumIDList)
*ppenumIDList = NULL;
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::BindToObject
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, LPVOID * ppvObj)
{
if (ppvObj)
*ppvObj = NULL;
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::BindToStorage
DESCRIPTION:
This should be implemented so people can use the File.Open and File.SaveAs
dialogs with this ShellFolder.
\*****************************************************************************/
HRESULT CBaseFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, LPVOID * ppvObj)
{
if (ppvObj)
*ppvObj = NULL;
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::CompareIDs
DESCRIPTION:
This should be implemented so people can use the File.Open and File.SaveAs
dialogs with this ShellFolder.
\*****************************************************************************/
HRESULT CBaseFolder::CompareIDs(LPARAM ici, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::CreateViewObject
DESCRIPTION:
This should be implemented so people can use the File.Open and File.SaveAs
dialogs with this ShellFolder.
\*****************************************************************************/
HRESULT CBaseFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID * ppvObj)
{
HRESULT hr = E_NOINTERFACE;
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IShellView))
hr = _CreateShellView(hwndOwner, ppvObj);
else if (IsEqualIID(riid, IID_IContextMenu))
hr = _GetUIObjectOf(hwndOwner, 0, NULL, riid, 0, ppvObj, TRUE);
else
hr = E_NOINTERFACE;
return hr;
}
BOOL IsShellIntegration(void)
{
BOOL fResult = FALSE;
HINSTANCE hInst = LoadLibrary(TEXT("shell32.dll"));
if (EVAL(hInst))
{
LPVOID pv = GetProcAddress(hInst, "DllGetVersion");
if (pv)
fResult = TRUE;
FreeLibrary(hInst);
}
return fResult;
}
HRESULT CBaseFolder::_CreateShellView(HWND hwndOwner, void ** ppvObj, LONG lEvents, FOLDERVIEWMODE fvm,
IShellFolderViewCB * psfvCallBack, LPCITEMIDLIST pidl, LPFNVIEWCALLBACK pfnCallback)
{
HRESULT hr;
IShellFolder * psf;
hr = this->QueryInterface(IID_IShellFolder, (LPVOID *) &psf);
if (EVAL(SUCCEEDED(hr)))
{
SFV_CREATE sfvCreate = // SHCreateShellFolderView struct
{
sizeof(SFV_CREATE),
psf, // psf
NULL, // psvOuter
psfvCallBack // psfvcb - (IShellFolderViewCB *)
};
// SHCreateShellFolderView isn't in the original shell. We can't rely on the
// the Delayload code because it's exported by ordinal and the original
// shell had a different exports by the same number.
if (IsShellIntegration())
hr = _SHCreateShellFolderView(&sfvCreate, (LPSHELLVIEW FAR*)ppvObj);
else
hr = E_FAIL; // Force us to go into the next try.
// If we aren't running on a machine with Shell Integration, SHCreateShellFolderView will fail.
if (FAILED(hr))
{
CSFV csfv;
csfv.cbSize = sizeof(csfv);
csfv.pshf = psf;
csfv.psvOuter = (IShellView *) psfvCallBack; // Hack but it works...
csfv.pidl = pidl; // This is feed to SFVM_GETNOTIFY so it needs to be a pidlTarget.
csfv.lEvents = lEvents;
csfv.pfnCallback = pfnCallback;
csfv.fvm = fvm; // vs. FVM_ICON, ...
hr = SHCreateShellFolderViewEx(&csfv, (LPSHELLVIEW FAR*)ppvObj);
if (SUCCEEDED(hr))
psfvCallBack->AddRef(); // We gave them a ref.
}
psf->Release();
}
return hr;
}
/*****************************************************************************\
FUNCTION: IShellFolder::GetAttributesOf
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::GetAttributesOf(UINT cpidl, LPCITEMIDLIST *apidl, ULONG *rgfInOut)
{
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::GetUIObjectOf
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST rgpidl[],
REFIID riid, UINT * prgfInOut, LPVOID * ppvObj)
{
return E_NOTIMPL;
}
/*****************************************************************************\
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::_GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST rgpidl[],
REFIID riid, UINT * prgfInOut, LPVOID * ppvOut, BOOL fFromCreateViewObject)
{
return GetUIObjectOf(hwndOwner, cidl, rgpidl, riid, prgfInOut, ppvOut);
}
/*****************************************************************************\
FUNCTION: IShellFolder::GetDisplayNameOf
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD shgno, LPSTRRET pStrRet)
{
return E_NOTIMPL;
}
/*****************************************************************************\
FUNCTION: IShellFolder::SetNameOf
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR pwszName,
DWORD dwReserved, LPITEMIDLIST *ppidlOut)
{
return E_NOTIMPL;
}
//===========================
// *** IShellFolder2 Interface ***
//===========================
//===========================
// *** IPersist Interface ***
//===========================
/*****************************************************************************\
FUNCTION: IPersist::GetClassID
DESCRIPTION:
\*****************************************************************************/
HRESULT CBaseFolder::GetClassID(LPCLSID pClassID)
{
HRESULT hr = E_INVALIDARG;
if (EVAL(pClassID))
{
if (EVAL(m_pClassID))
{
*pClassID = *m_pClassID;
hr = S_OK;
}
else
hr = E_FAIL;
}
return hr;
}
//===========================
// *** IPersistFolder Interface ***
//===========================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -