📄 wiadriver.cpp
字号:
/**************************************************************************
*
* Copyright (c) 2003 Microsoft Corporation
*
* Title: wiadriver.cpp
*
* Description: This file contains the implementation of IStiUSD and IWiaMiniDrv
* in the class CWIADriver.
* The file also contains all COM DLL entry point functions and an
* implementation of IClassFactory, CWIADriverClassFactory.
*
***************************************************************************/
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <initguid.h>
#include "stdafx.h"
#include <strsafe.h>
#include <limits.h>
HINSTANCE g_hInst = NULL;
///////////////////////////////////////////////////////////////////////////////
// WIA driver GUID
///////////////////////////////////////////////////////////////////////////////
// {EEA1E6F7-A59C-487a-BFFA-BD8AA99FE501}
DEFINE_GUID(CLSID_WIADriver, 0xeea1e6f7, 0xa59c, 0x487a, 0xbf, 0xfa, 0xbd, 0x8a, 0xa9, 0x9f, 0xe5, 0x3);
#define HANDLED_PRIVATE_STATUS_ERROR_1 MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 1001)
#define UNHANDLED_PRIVATE_STATUS_ERROR_1 MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 1002)
#define UNHANDLED_PRIVATE_STATUS_MESSAGE_1 MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 1001)
///////////////////////////////////////////////////////////////////////////
// Construction/Destruction Section
///////////////////////////////////////////////////////////////////////////
CWIADriver::CWIADriver(__in_opt LPUNKNOWN punkOuter) : m_cRef(1),
m_punkOuter(NULL),
m_pIDrvItemRoot(NULL),
m_lClientsConnected(0),
m_pFormats(NULL),
m_ulNumFormats(0),
m_bstrDeviceID(NULL),
m_bstrRootFullItemName(NULL),
m_ulImageLibraryToken(0),
m_pIStiDevice(NULL)
{
if(punkOuter)
{
m_punkOuter = punkOuter;
}
memset(m_wszStoragePath,0,sizeof(m_wszStoragePath));
//
// Intialize GDI+ image library for image manipulation
//
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
if(GdiplusStartup(&m_ulImageLibraryToken, &gdiplusStartupInput, NULL) != Gdiplus::Ok)
{
WIAS_ERROR((g_hInst, "GDI+ image library could not be initialized"));
}
}
CWIADriver::~CWIADriver()
{
HRESULT hr = S_OK;
if(m_bstrDeviceID)
{
SysFreeString(m_bstrDeviceID);
m_bstrDeviceID = NULL;
}
if(m_bstrRootFullItemName)
{
SysFreeString(m_bstrRootFullItemName);
m_bstrRootFullItemName = NULL;
}
//
// Free cached driver capability array
//
m_CapabilityManager.Destroy();
//
// Free cached driver format array
//
if(m_pFormats)
{
WIAS_TRACE((g_hInst,"Deleting WIA format array memory"));
delete [] m_pFormats;
m_pFormats = NULL;
m_ulNumFormats = 0;
}
//
// Unlink and release the cached IWiaDrvItem root item interface.
//
DestroyDriverItemTree();
//
// Unintialize/shutdown GDI+ image library
//
if(m_ulImageLibraryToken)
{
Gdiplus::GdiplusShutdown(m_ulImageLibraryToken);
m_ulImageLibraryToken = 0;
}
}
///////////////////////////////////////////////////////////////////////////
// Standard COM Section
///////////////////////////////////////////////////////////////////////////
HRESULT CWIADriver::QueryInterface(__in REFIID riid, __out LPVOID * ppvObj)
{
if(!m_punkOuter)
{
return E_NOINTERFACE;
}
return m_punkOuter->QueryInterface(riid,ppvObj);
}
ULONG CWIADriver::AddRef()
{
if(!m_punkOuter)
{
return 0;
}
return m_punkOuter->AddRef();
}
ULONG CWIADriver::Release()
{
if(!m_punkOuter)
{
return 0;
}
return m_punkOuter->Release();
}
///////////////////////////////////////////////////////////////////////////
// IStiUSD Interface Section (for all WIA drivers)
///////////////////////////////////////////////////////////////////////////
HRESULT CWIADriver::Initialize(__in PSTIDEVICECONTROL pHelDcb,
DWORD dwStiVersion,
__in HKEY hParametersKey)
{
HRESULT hr = E_INVALIDARG;
if((pHelDcb)&&(hParametersKey))
{
//
// Open DeviceData section in the registry
//
HKEY hDeviceDataKey = NULL;
if(RegOpenKeyEx(hParametersKey,REG_ENTRY_DEVICEDATA,0,KEY_QUERY_VALUE|KEY_READ,&hDeviceDataKey) == ERROR_SUCCESS)
{
DWORD dwSize = sizeof(m_wszStoragePath);
DWORD dwType = REG_SZ;
if(RegQueryValueEx(hDeviceDataKey,REG_ENTRY_STORAGEPATH,NULL,&dwType,(BYTE*)m_wszStoragePath,&dwSize) == ERROR_SUCCESS)
{
WIAS_TRACE((g_hInst,"WIA storage path = %ws",m_wszStoragePath));
hr = S_OK;
}
else
{
WIAS_ERROR((g_hInst, "Failed to read (%ws) entry under %ws section of device registry",REG_ENTRY_STORAGEPATH,REG_ENTRY_DEVICEDATA));
}
hr = S_OK;
//
// close open DeviceData registry key
//
RegCloseKey(hDeviceDataKey);
hDeviceDataKey = NULL;
}
hr = m_CapabilityManager.Initialize(g_hInst);
if(FAILED(hr))
{
WIAS_ERROR((g_hInst, "Failed to initialize the WIA driver capability manager object, hr = 0x%lx",hr));
}
}
else
{
hr = E_INVALIDARG;
WIAS_ERROR((g_hInst, "Invalid parameters were passed, hr = 0x%lx",hr));
}
return hr;
}
HRESULT CWIADriver::GetCapabilities(__out PSTI_USD_CAPS pDevCaps)
{
HRESULT hr = E_INVALIDARG;
if(pDevCaps)
{
memset(pDevCaps, 0, sizeof(STI_USD_CAPS));
pDevCaps->dwVersion = STI_VERSION_3;
pDevCaps->dwGenericCaps = STI_GENCAP_WIA |
STI_USD_GENCAP_NATIVE_PUSHSUPPORT |
STI_GENCAP_NOTIFICATIONS |
STI_GENCAP_POLLING_NEEDED;
WIAS_TRACE((g_hInst,"========================================================"));
WIAS_TRACE((g_hInst,"STI Capabilities information reported to the WIA Service"));
WIAS_TRACE((g_hInst,"Version: 0x%lx",pDevCaps->dwVersion));
WIAS_TRACE((g_hInst,"GenericCaps: 0x%lx", pDevCaps->dwGenericCaps));
WIAS_TRACE((g_hInst,"========================================================"));
hr = S_OK;
}
else
{
hr = E_INVALIDARG;
WIAS_ERROR((g_hInst, "Invalid parameters were passed, hr = 0x%lx",hr));
}
return hr;
}
HRESULT CWIADriver::GetStatus(__inout PSTI_DEVICE_STATUS pDevStatus)
{
HRESULT hr = E_INVALIDARG;
if(pDevStatus)
{
//
// assume successful status checks
//
hr = S_OK;
if(pDevStatus->StatusMask & STI_DEVSTATUS_ONLINE_STATE)
{
//
// check if the device is ON-LINE
//
WIAS_TRACE((g_hInst,"Checking device online status..."));
pDevStatus->dwOnlineState = 0L;
if(SUCCEEDED(hr))
{
pDevStatus->dwOnlineState |= STI_ONLINESTATE_OPERATIONAL;
WIAS_TRACE((g_hInst,"The device is online"));
}
else
{
WIAS_TRACE((g_hInst,"The device is offline"));
}
}
if(pDevStatus->StatusMask & STI_DEVSTATUS_EVENTS_STATE)
{
//
// check for polled events
//
pDevStatus->dwEventHandlingState &= ~STI_EVENTHANDLING_PENDING;
hr = S_FALSE; // no are events detected
if(hr == S_OK)
{
pDevStatus->dwEventHandlingState |= STI_EVENTHANDLING_PENDING;
WIAS_TRACE((g_hInst,"The device reported a polled event"));
}
}
}
else
{
hr = E_INVALIDARG;
WIAS_ERROR((g_hInst, "Invalid parameters were passed, hr = 0x%lx",hr));
}
return hr;
}
HRESULT CWIADriver::DeviceReset()
{
return S_OK;
}
HRESULT CWIADriver::Diagnostic(__out LPDIAG pBuffer)
{
HRESULT hr = E_INVALIDARG;
if(pBuffer)
{
memset(pBuffer,0,sizeof(DIAG));
hr = S_OK;
}
else
{
hr = E_INVALIDARG;
WIAS_ERROR((g_hInst, "Invalid parameters were passed, hr = 0x%lx",hr));
}
return hr;
}
HRESULT CWIADriver::Escape( STI_RAW_CONTROL_CODE EscapeFunction,
__in_bcount(cbInDataSize) LPVOID lpInData,
DWORD cbInDataSize,
__out_bcount(cbOutDataSize) LPVOID pOutData,
DWORD dwOutDataSize,
__out LPDWORD pdwActualData)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -