/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: GWIAEVNT.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 12/29/1999 * * DESCRIPTION: Generic reusable WIA event handler that posts the specified * message to the specified window. * * The message will be sent with the following arguments: * * * WPARAM = NULL * LPARAM = CGenericWiaEventHandler::CEventMessage *pEventMessage * * pEventMessage MUST be freed in the message handler using delete * * pEventMessage is allocated using an overloaded new operator, to ensure that * the same allocator and de-allocator are used. * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include "gwiaevnt.h" CGenericWiaEventHandler::CGenericWiaEventHandler(void) : m_hWnd(NULL), m_nWiaEventMessage(0), m_cRef(0) { } STDMETHODIMP CGenericWiaEventHandler::Initialize( HWND hWnd, UINT nWiaEventMessage ) { m_hWnd = hWnd; m_nWiaEventMessage = nWiaEventMessage; return S_OK; } STDMETHODIMP CGenericWiaEventHandler::QueryInterface( REFIID riid, LPVOID *ppvObject ) { WIA_PUSHFUNCTION(TEXT("CWiaDefaultUI::QueryInterface")); if (IsEqualIID( riid, IID_IUnknown )) { *ppvObject = static_cast(this); } else if (IsEqualIID( riid, IID_IWiaEventCallback )) { *ppvObject = static_cast(this); } else { *ppvObject = NULL; return(E_NOINTERFACE); } reinterpret_cast(*ppvObject)->AddRef(); return(S_OK); } STDMETHODIMP_(ULONG) CGenericWiaEventHandler::AddRef(void) { DllAddRef(); return(InterlockedIncrement(&m_cRef)); } STDMETHODIMP_(ULONG) CGenericWiaEventHandler::Release(void) { DllRelease(); LONG nRefCount = InterlockedDecrement(&m_cRef); if (!nRefCount) { delete this; } return(nRefCount); } STDMETHODIMP CGenericWiaEventHandler::ImageEventCallback( const GUID *pEventGUID, BSTR bstrEventDescription, BSTR bstrDeviceID, BSTR bstrDeviceDescription, DWORD dwDeviceType, BSTR bstrFullItemName, ULONG *pulEventType, ULONG ulReserved ) { WIA_PUSHFUNCTION(TEXT("CGenericWiaEventHandler::ImageEventCallback")); // // Make sure (as best we can) that everything is OK before we allocate any memory // if (m_hWnd && m_nWiaEventMessage && IsWindow(m_hWnd)) { // // Allocate the new message // CEventMessage *pEventMessage = new CEventMessage( *pEventGUID, bstrEventDescription, bstrDeviceID, bstrDeviceDescription, dwDeviceType, bstrFullItemName ); if (pEventMessage) { // // Send the message to the notify window // LRESULT lRes = SendMessage( m_hWnd, m_nWiaEventMessage, NULL, reinterpret_cast(pEventMessage) ); // // If the callee didn't handle the message, delete it // if (HANDLED_EVENT_MESSAGE != lRes) { delete pEventMessage; } } } return S_OK; } HRESULT CGenericWiaEventHandler::RegisterForWiaEvent( LPCWSTR pwszDeviceId, const GUID &guidEvent, IUnknown **ppUnknown, HWND hWnd, UINT nMsg ) { WIA_PUSHFUNCTION(TEXT("CGenericWiaEventHandler::RegisterForWiaEvent")); // // Create the device manager // CComPtr pWiaDevMgr; HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr ); if (SUCCEEDED(hr) && pWiaDevMgr) { // // Create our event handler // CGenericWiaEventHandler *pEventHandler = new CGenericWiaEventHandler(); if (pEventHandler) { // // Initialize it with the window handle and message we will be sending // hr = pEventHandler->Initialize( hWnd, nMsg ); if (SUCCEEDED(hr)) { // // Get the callback interface pointer // CComPtr pWiaEventCallback; hr = pEventHandler->QueryInterface( IID_IWiaEventCallback, (void**)&pWiaEventCallback ); if (SUCCEEDED(hr) && pWiaEventCallback) { // // Register for the event // hr = pWiaDevMgr->RegisterEventCallbackInterface( 0, pwszDeviceId ? CSimpleBStr(pwszDeviceId).BString() : NULL, &guidEvent, pWiaEventCallback, ppUnknown ); if (!SUCCEEDED(hr)) { WIA_PRINTHRESULT((hr,TEXT("pWiaDevMgr->RegisterEventCallbackInterface failed"))); } } else { WIA_PRINTHRESULT((hr,TEXT("pEventHandler->QueryInterface( IID_IWiaEventCallback, ... ) failed"))); } } else { WIA_PRINTHRESULT((hr,TEXT("pEventHandler->Initialize failed"))); } } else { hr = E_OUTOFMEMORY; WIA_PRINTHRESULT((hr,TEXT("Unable to allocate pEventHandler"))); } } else { WIA_PRINTHRESULT((hr,TEXT("CoCreateInstance of dev mgr failed"))); } return hr; }