/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION * * TITLE: APDROPT.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 5/22/2001 * * DESCRIPTION: Autoplay drop target * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include "apdropt.h" #include "wiadefui.h" #include "runwiz.h" CWiaAutoPlayDropTarget::CWiaAutoPlayDropTarget() : m_cRef(1) { WIA_PUSHFUNCTION(TEXT("CWiaAutoPlayDropTarget::CWiaAutoPlayDropTarget")); DllAddRef(); } CWiaAutoPlayDropTarget::~CWiaAutoPlayDropTarget() { WIA_PUSHFUNCTION(TEXT("CWiaAutoPlayDropTarget::~CWiaAutoPlayDropTarget")); DllRelease(); } STDMETHODIMP_(ULONG) CWiaAutoPlayDropTarget::AddRef() { WIA_PUSHFUNCTION(TEXT("CWiaAutoPlayDropTarget::AddRef")); return InterlockedIncrement(&m_cRef); } STDMETHODIMP_(ULONG) CWiaAutoPlayDropTarget::Release() { WIA_PUSHFUNCTION(TEXT("CWiaAutoPlayDropTarget::Release")); LONG nRefCount = InterlockedDecrement(&m_cRef); if (!nRefCount) { delete this; } return nRefCount; } HRESULT CWiaAutoPlayDropTarget::QueryInterface( REFIID riid, void **ppvObject ) { WIA_PUSHFUNCTION(TEXT("CWiaAutoPlayDropTarget::QueryInterface")); if (IsEqualIID( riid, IID_IUnknown )) { *ppvObject = static_cast(this); } else if (IsEqualIID( riid, IID_IDropTarget )) { *ppvObject = static_cast(this); } else { *ppvObject = NULL; return(E_NOINTERFACE); } reinterpret_cast(*ppvObject)->AddRef(); return(S_OK); } HRESULT CWiaAutoPlayDropTarget::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect) { *pdwEffect = DROPEFFECT_COPY; return S_OK; } HRESULT CWiaAutoPlayDropTarget::DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect) { *pdwEffect = DROPEFFECT_COPY; return S_OK; } HRESULT CWiaAutoPlayDropTarget::DragLeave(void) { return S_OK; } HRESULT GetPathFromDataObject( IDataObject *pDataObject, LPTSTR pszPath, UINT cchPath ) { FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; STGMEDIUM medium = {0}; HRESULT hr = pDataObject->GetData(&fmte, &medium); if (SUCCEEDED(hr)) { if (DragQueryFile((HDROP)medium.hGlobal, 0, pszPath, cchPath)) hr = S_OK; else hr = E_FAIL; ReleaseStgMedium(&medium); } return hr; } HRESULT CWiaAutoPlayDropTarget::Drop( IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect ) { WIA_PUSH_FUNCTION((TEXT("CWiaAutoPlayDropTarget::Drop"))); // // Validate pointer arguments // if (!pDataObject || !pdwEffect) { return E_POINTER; } // // Get the path // WCHAR szPath[MAX_PATH] = {0}; HRESULT hr = GetPathFromDataObject( pDataObject, szPath, ARRAYSIZE(szPath) ); *pdwEffect = DROPEFFECT_COPY; if (SUCCEEDED(hr)) { WIA_TRACE((TEXT("szPath: %ws"), szPath )); // // Make sure we have a string // if (lstrlen(szPath)) { // // Create the device name, of the form {D:\\}, where D is the drive letter // WCHAR szDeviceID[MAX_PATH] = {0}; wnsprintf( szDeviceID, ARRAYSIZE(szDeviceID), TEXT("{%ws}"), szPath ); // // Run the wizard // hr = RunWiaWizard::RunWizard( szDeviceID ); } else { hr = E_INVALIDARG; } } return hr; }