#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; }