mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
5.3 KiB
177 lines
5.3 KiB
/*******************************************************************************
|
|
*
|
|
* (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<IWiaEventCallback*>(this);
|
|
}
|
|
else if (IsEqualIID( riid, IID_IWiaEventCallback ))
|
|
{
|
|
*ppvObject = static_cast<IWiaEventCallback*>(this);
|
|
}
|
|
else
|
|
{
|
|
*ppvObject = NULL;
|
|
return(E_NOINTERFACE);
|
|
}
|
|
reinterpret_cast<IUnknown*>(*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<LPARAM>(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<IWiaDevMgr> 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<IWiaEventCallback> 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;
|
|
}
|
|
|