117 lines
3.1 KiB
C++
117 lines
3.1 KiB
C++
|
#include "precomp.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "util.h"
|
||
|
#include "dll.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
class CMyDocsCopyHook : public ICopyHook
|
||
|
{
|
||
|
public:
|
||
|
CMyDocsCopyHook();
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
|
||
|
STDMETHOD_(ULONG, AddRef)();
|
||
|
STDMETHOD_(ULONG, Release)();
|
||
|
|
||
|
// ICopyHook
|
||
|
STDMETHOD_(UINT,CopyCallback)(HWND hwnd, UINT wFunc, UINT wFlags,
|
||
|
LPCTSTR pszSrcFile, DWORD dwSrcAttribs,
|
||
|
LPCTSTR pszDestFile, DWORD dwDestAttribs);
|
||
|
private:
|
||
|
~CMyDocsCopyHook();
|
||
|
LONG _cRef;
|
||
|
};
|
||
|
|
||
|
STDMETHODIMP CMyDocsCopyHook::QueryInterface(REFIID riid, void **ppv)
|
||
|
{
|
||
|
static const QITAB qit[] = {
|
||
|
QITABENT(CMyDocsCopyHook, ICopyHook), // IID_ICopyHook
|
||
|
{ 0 },
|
||
|
};
|
||
|
return QISearch(this, qit, riid, ppv);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_ (ULONG) CMyDocsCopyHook::AddRef()
|
||
|
{
|
||
|
return InterlockedIncrement(&_cRef);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_ (ULONG) CMyDocsCopyHook::Release()
|
||
|
{
|
||
|
if (InterlockedDecrement(&_cRef))
|
||
|
return _cRef;
|
||
|
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
CMyDocsCopyHook::CMyDocsCopyHook() : _cRef(1)
|
||
|
{
|
||
|
DllAddRef();
|
||
|
}
|
||
|
|
||
|
CMyDocsCopyHook::~CMyDocsCopyHook()
|
||
|
{
|
||
|
DllRelease();
|
||
|
}
|
||
|
|
||
|
// ICopyHook methods
|
||
|
UINT CMyDocsCopyHook::CopyCallback(HWND hwnd, UINT wFunc, UINT wFlags,
|
||
|
LPCTSTR pszSrcFile, DWORD dwSrcAttribs,
|
||
|
LPCTSTR pszDestFile, DWORD dwDestAttribs)
|
||
|
{
|
||
|
UINT uRes = IDYES;
|
||
|
|
||
|
if ((wFunc == FO_COPY) || (wFunc == FO_MOVE))
|
||
|
{
|
||
|
TCHAR szPersonal[MAX_PATH];
|
||
|
|
||
|
if (S_OK == SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_DONT_VERIFY, NULL, SHGFP_TYPE_CURRENT, szPersonal) &&
|
||
|
lstrcmpi(pszSrcFile, szPersonal) == 0)
|
||
|
{
|
||
|
// the source is the personal directory, now check if the
|
||
|
// destination is on the desktop...
|
||
|
DWORD dwRes = IsPathGoodMyDocsPath(hwnd, pszDestFile);
|
||
|
|
||
|
if (dwRes == PATH_IS_NONEXISTENT)
|
||
|
{
|
||
|
lstrcpyn(szPersonal, pszDestFile, ARRAYSIZE(szPersonal));
|
||
|
if (PathRemoveFileSpec(szPersonal))
|
||
|
{
|
||
|
dwRes = IsPathGoodMyDocsPath(hwnd, szPersonal);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (dwRes == PATH_IS_DESKTOP)
|
||
|
{
|
||
|
// keep the user from moving the personal folder to the desktop
|
||
|
TCHAR szVerb[ 32 ];
|
||
|
LoadString(g_hInstance, (wFunc == FO_COPY) ? IDS_COPY : IDS_MOVE, szVerb, ARRAYSIZE(szVerb));
|
||
|
|
||
|
uRes = IDNO;
|
||
|
|
||
|
GetFolderDisplayName(CSIDL_PERSONAL, szPersonal, ARRAYSIZE(szPersonal));
|
||
|
|
||
|
ShellMessageBox(g_hInstance, hwnd,
|
||
|
(LPTSTR)IDS_NODRAG_DESKTOP_NOT_HIDDEN, szPersonal,
|
||
|
MB_OK | MB_ICONSTOP, szPersonal, szVerb);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return uRes;
|
||
|
}
|
||
|
|
||
|
HRESULT CMyDocsCopyHook_CreateInstance(IUnknown *punkOuter, IUnknown **ppunk, LPCOBJECTINFO poi)
|
||
|
{
|
||
|
CMyDocsCopyHook * pMDCH = new CMyDocsCopyHook();
|
||
|
if (pMDCH)
|
||
|
{
|
||
|
*ppunk = SAFECAST(pMDCH, ICopyHook*);
|
||
|
return S_OK;
|
||
|
}
|
||
|
*ppunk = NULL;
|
||
|
return E_OUTOFMEMORY;
|
||
|
}
|