1232 lines
40 KiB
C++
1232 lines
40 KiB
C++
/****************************************************************************
|
|
*
|
|
* (C) COPYRIGHT 2000, MICROSOFT CORP.
|
|
*
|
|
* FILE: wiautil.h
|
|
*
|
|
* VERSION: 1.0
|
|
*
|
|
* DATE: 11/17/2000
|
|
*
|
|
* DESCRIPTION:
|
|
* Definitions for WIA driver helper classes and functions.
|
|
* NOTE: This header requires wiamindr.h to be included.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
/**************************************************************************\
|
|
* CWiauFormatConverter
|
|
*
|
|
* Helper class for converting images to BMP format.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
typedef struct _BMP_IMAGE_INFO
|
|
{
|
|
INT Width; // Width of the image in pixels
|
|
INT Height; // Height of the image in lines
|
|
INT ByteWidth; // Width of the image in bytes
|
|
INT Size; // Total size of the image, including headers
|
|
} BMP_IMAGE_INFO, *PBMP_IMAGE_INFO;
|
|
|
|
typedef enum
|
|
{
|
|
SKIP_OFF,
|
|
SKIP_FILEHDR,
|
|
SKIP_BOTHHDR
|
|
|
|
} SKIP_AMOUNT;
|
|
|
|
class CWiauFormatConverter
|
|
{
|
|
public:
|
|
CWiauFormatConverter();
|
|
~CWiauFormatConverter();
|
|
|
|
/**************************************************************************\
|
|
* Init
|
|
*
|
|
* Intializes this class and GDI+ for converting images. This method
|
|
* should be called just once.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT Init();
|
|
|
|
|
|
/**************************************************************************\
|
|
* IsFormatSupported
|
|
*
|
|
* This method will verify that GDI+ supports the image format
|
|
* that is to be converted.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* pguidFormat - pointer to GUID format from gdiplusimaging.h
|
|
*
|
|
\**************************************************************************/
|
|
|
|
BOOL IsFormatSupported(const GUID *pguidFormat);
|
|
|
|
|
|
/**************************************************************************\
|
|
* ConvertToBmp
|
|
*
|
|
* This method will convert an image to BMP format. The caller can pass
|
|
* a result buffer in ppDest and the size in piDestSize. Alternatively
|
|
* the caller can set *ppDest to NULL and *piDestSize to zero to
|
|
* indicate that this method should allocate the memory. The caller is
|
|
* responsible for freeing the memory with "delete []".
|
|
*
|
|
* Arguments:
|
|
*
|
|
* pSource - pointer to memory location of source image
|
|
* iSourceSize - size of source image
|
|
* ppDest - location to receive memory location of result image
|
|
* piDestSize - location to receive size of result image
|
|
* pBmpImageInfo - location to receive stats about the BMP
|
|
* iSkipAmt - Indicates how much of the BMP header to skip:
|
|
* SKIP_OFF = skip neither header
|
|
* SKIP_FILEHDR = skip the file header
|
|
* SKIP_BOTHHDR = skip the file and info headers
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT ConvertToBmp(BYTE *pSource, INT iSourceSize, BYTE **ppDest, INT *piDestSize,
|
|
BMP_IMAGE_INFO *pBmpImageInfo, SKIP_AMOUNT iSkipAmt = SKIP_OFF);
|
|
|
|
|
|
private:
|
|
ULONG_PTR m_Token;
|
|
UINT m_EncoderCount;
|
|
BYTE *m_pEncoderInfo;
|
|
GUID m_guidCodecBmp;
|
|
};
|
|
|
|
|
|
/**************************************************************************\
|
|
* CWiauPropertyList
|
|
*
|
|
* Helper class for definining and initializing WIA properties
|
|
*
|
|
\**************************************************************************/
|
|
|
|
class CWiauPropertyList
|
|
{
|
|
private:
|
|
|
|
int m_NumAlloc; // number of slots allocated
|
|
int m_NumProps; // number of properties defined
|
|
PROPID *m_pId; // property ids
|
|
LPOLESTR *m_pNames; // property names
|
|
PROPVARIANT *m_pCurrent; // current value
|
|
PROPSPEC *m_pPropSpec; // property spec (used for WriteMultiple)
|
|
WIA_PROPERTY_INFO *m_pAttrib; // property attributes
|
|
|
|
public:
|
|
|
|
CWiauPropertyList();
|
|
~CWiauPropertyList();
|
|
|
|
/**************************************************************************\
|
|
* Init
|
|
*
|
|
* Initializes the property info object.
|
|
*
|
|
* Arguments:
|
|
* NumProps - number of properties to reserve space for. This number can
|
|
* be larger than the actual number used, but cannot be smaller.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT Init(INT NumProps);
|
|
|
|
|
|
/**************************************************************************\
|
|
* DefineProperty
|
|
*
|
|
* Adds a property definition to the object.
|
|
*
|
|
* Arguments:
|
|
* index - pointer to an int that will be set to the property index
|
|
* within the object, useful for passing to other property
|
|
* info methods
|
|
* PropId - property ID constant
|
|
* PropName - property name string
|
|
* Access - determines access to the property, usually either
|
|
* WIA_PROP_READ or WIA_PROP_RW
|
|
* SubType - indicates subtype of the property, usually either
|
|
* WIA_PROP_NONE, WIA_PROP_FLAG, WIA_PROP_RANGE, or WIA_PROP_LIST
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT DefineProperty(int *pIdx, PROPID PropId, LPOLESTR PropName,
|
|
ULONG Access, ULONG SubType);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SendToWia
|
|
*
|
|
* Calls the WIA service to define all of the properties currently
|
|
* contained in the object. Should be called once after all properties
|
|
* are defined and set.
|
|
*
|
|
* Arguments:
|
|
* pWiasContext - pointer to the context passed into drvInitItemProperties
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT SendToWia(BYTE *pWiasContext);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetAccessSubType
|
|
*
|
|
* Used to reset the access and subtype of a property.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* Access - determines access to the property, usually either
|
|
* WIA_PROP_READ or WIA_PROP_RW
|
|
* SubType - indicates subtype of the property, usually either
|
|
* WIA_PROP_NONE, WIA_PROP_FLAG, WIA_PROP_RANGE, or WIA_PROP_LIST
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetAccessSubType(INT index, ULONG Access, ULONG SubType);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (flag)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_I4 and subtype to WIA_PROP_FLAG.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* validFlags - combination of all valid flags
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue, LONG validFlags);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (signed long, range)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_I4 and subtype to WIA_PROP_RANGE.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* minValue - minimum value for the range
|
|
* maxValue - maximum value for the range
|
|
* stepValue - step value for the range
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue,
|
|
LONG minValue, LONG maxValue, LONG stepValue);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (signed long, list)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_I4 and subtype to WIA_PROP_LIST.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* numValues - number of values in the list
|
|
* pValues - pointer to the value list (must be valid until SendToWia
|
|
* is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, LONG defaultValue, LONG currentValue,
|
|
INT numValues, PLONG pValues);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (BSTR, list)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_BSTR and subtype to WIA_PROP_LIST.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* numValues - number of values in the list
|
|
* pValues - pointer to the value list (must be valid until SendToWia
|
|
* is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, BSTR defaultValue, BSTR currentValue,
|
|
INT numValues, BSTR *pValues);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (float, range)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_R4 and subtype to WIA_PROP_RANGE.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* minValue - minimum value for the range
|
|
* maxValue - maximum value for the range
|
|
* stepValue - step value for the range
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, FLOAT defaultValue, FLOAT currentValue,
|
|
FLOAT minValue, FLOAT maxValue, FLOAT stepValue);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (float, list)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_R4 and subtype to WIA_PROP_LIST.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* numValues - number of values in the list
|
|
* pValues - pointer to the value list (must be valid until SendToWia
|
|
* is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, FLOAT defaultValue, FLOAT currentValue,
|
|
INT numValues, PFLOAT pValues);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetValidValues (CLSID, list)
|
|
*
|
|
* Sets the type and current, default, and valid values of a property.
|
|
* Also sets property type to VT_CLSID and subtype to WIA_PROP_LIST.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* defaultValue - default setting of this property on the device
|
|
* currentValue - current setting of this property on the device
|
|
* numValues - number of values in the list
|
|
* pValues - pointer to the value list (must be valid until SendToWia
|
|
* is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetValidValues(INT index, CLSID *defaultValue, CLSID *currentValue,
|
|
INT numValues, CLSID **pValues);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (signed long)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to VT_I4.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - current setting of this property on the device
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, LONG value);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (BSTR)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to VT_BSTR.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - current setting of this property on the device
|
|
* (must be valid until SendToWia is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, BSTR value);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (float)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to VT_R4.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - current setting of this property on the device
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, FLOAT value);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (CLSID)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to VT_CLSID.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - current setting of this property on the device
|
|
* (must be valid until SendToWia is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, CLSID *pValue);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (SYSTEMTIME)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to
|
|
* VT_UI2 | VT_VECTOR.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - current setting of this property on the device
|
|
* (must be valid until SendToWia is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, PSYSTEMTIME value);
|
|
|
|
|
|
/**************************************************************************\
|
|
* SetCurrentValue (byte array)
|
|
*
|
|
* Sets the current value for a property. Also sets the type to
|
|
* VT_UI1 | VT_VECTOR.
|
|
*
|
|
* Arguments:
|
|
* index - the property index, from DefineProperty
|
|
* value - pointer to current setting of this property on the device
|
|
* (must be valid until SendToWia is called)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID SetCurrentValue(INT index, BYTE *value, INT size);
|
|
|
|
|
|
/**************************************************************************\
|
|
* GetPropId
|
|
*
|
|
* Returns the property id given a property index.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
PROPID GetPropId(INT index) { return m_pId[index]; }
|
|
|
|
|
|
/**************************************************************************\
|
|
* LookupPropId
|
|
*
|
|
* Finds the property index given a property ID.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
INT LookupPropId(PROPID PropId);
|
|
};
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauGetDrvItemContext
|
|
*
|
|
* This helper function gets the driver item context, and optionally
|
|
* return the driver item
|
|
*
|
|
* Arguments:
|
|
*
|
|
* pWiasContext - pointer to the item context
|
|
* ppItemCtx - location to store pointer to driver item context
|
|
* ppDrvItem - location to store pointer to driver item (can be NULL)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauGetDrvItemContext(BYTE *pWiasContext, VOID **ppItemCtx, IWiaDrvItem **ppDrvItem = NULL);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauSetImageItemSize
|
|
*
|
|
* Calulates the size and width in bytes for an image based on the current
|
|
* WIA_IPA_FORMAT setting, and writes the new values to the appropriate
|
|
* properties. If the format is not BMP, this function assumes that the
|
|
* value passed in lSize is correct for the current format.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* pWiasContext - pointer to item context
|
|
* lWidth - width of the image in pixels
|
|
* lHeight - height of the image in lines
|
|
* lDepth - depth of the image in bits
|
|
* lSize - size of the image as stored on the device
|
|
* pwszExt - optional pointer to the 3 letter extension for the
|
|
* item's native format (if this is NULL, the extension
|
|
* property won't be updated)
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauSetImageItemSize(BYTE *pWiasContext, LONG lWidth, LONG lHeight, LONG lDepth,
|
|
LONG lSize, PWSTR pwszExt = NULL);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauPropsInPropSpec
|
|
*
|
|
* Returns true if one or more of the property ids in pProps are
|
|
* contained in pPropSpecs.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* NumPropSpecs - number of property specs in the array
|
|
* pPropSpecs - the property specs array
|
|
* NumProps - number of property ids to search for
|
|
* pProps - pointer to the array of property ids to search for
|
|
*
|
|
\**************************************************************************/
|
|
|
|
BOOL wiauPropsInPropSpec(LONG NumPropSpecs, const PROPSPEC *pPropSpecs, int NumProps, PROPID *pProps);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauPropInPropSpec
|
|
*
|
|
* Returns true if the PropId property ID is in the passed pPropSpecs
|
|
* array. Optionally will return the index of where the ID was found.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* NumPropSpecs - number of property specs in the array
|
|
* pPropSpecs - the property specs array
|
|
* PropId - property id to search for
|
|
* pIdx - optional pointer to the location to store the index
|
|
*
|
|
\**************************************************************************/
|
|
|
|
BOOL wiauPropInPropSpec(LONG NumPropSpecs, const PROPSPEC *pPropSpecs, PROPID PropId, int *pIdx = NULL);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauGetValidFormats
|
|
*
|
|
* Calls drvGetWiaFormatInfo and makes a list of valid formats given
|
|
* a tymed value. Caller is responsible for freeing the format array
|
|
* with []delete.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* pDrv - Pointer to WIA minidriver object (use "this")
|
|
* pWiasContext - WIA service context
|
|
* TymedValue - tymed value to search for
|
|
* pNumFormats - pointer to value to receive number of formats
|
|
* ppFormatArray - pointer to a location to receive array address
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauGetValidFormats(IWiaMiniDrv *pDrv, BYTE *pWiasContext, LONG TymedValue,
|
|
int *pNumFormats, GUID **ppFormatArray);
|
|
|
|
/**************************************************************************\
|
|
* wiauGetResourceString
|
|
*
|
|
* This helper gets a resource string and returns it as a BSTR
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hInst - Handle to module instance
|
|
* lResourceID - Resource ID of the target BSTR value
|
|
* pbstrStr - Location to store the retrieved string (caller must
|
|
* free this string with SysFreeString())
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauGetResourceString(HINSTANCE hInst, LONG lResourceID, BSTR *pbstrStr);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegOpenDataW
|
|
*
|
|
* Opens the DeviceData key. Call this function only in the STI Initialize
|
|
* function. Call RegCloseKey when finished.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkeyAncestor - HKey of parent (use hkey passed into Initialize)
|
|
* phkeyDeviceData - Location to store opened hkey
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegOpenDataW(HKEY hkeyAncestor, HKEY *phkeyDeviceData);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegOpenDataA
|
|
*
|
|
* Opens the DeviceData key. Call this function only in the STI Initialize
|
|
* function. Call RegCloseKey when finished.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkeyAncestor - HKey of parent (use hkey passed into Initialize)
|
|
* phkeyDeviceData - Location to store opened hkey
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegOpenDataA(HKEY hkeyAncestor, HKEY *phkeyDeviceData);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegGetStrW
|
|
*
|
|
* Use to get string value from the DeviceData section of the registry.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkey - Use hkey returned from wiauRegOpenData
|
|
* pwszValueName - Name of registry entry
|
|
* pwszValue - Location to store returned string
|
|
* pdwLength - Size of location in bytes
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegGetStrW(HKEY hkKey, PCWSTR pwszValueName, PWSTR pwszValue, DWORD *pdwLength);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegGetStrA
|
|
*
|
|
* Use to get string value from the DeviceData section of the registry.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkey - Use hkey returned from wiauRegOpenData
|
|
* pszValueName - Name of registry entry
|
|
* pszValue - Location to store returned string
|
|
* pdwLength - Size of location in bytes
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegGetStrA(HKEY hkKey, PCSTR pszValueName, PSTR pszValue, DWORD *pdwLength);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegGetDwordW
|
|
*
|
|
* Use to get DWORD value from the DeviceData section of the registry.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkey - Use hkey returned from wiauRegOpenData
|
|
* pwszValueName - Name of registry entry
|
|
* pdwValue - Location to store returned DWORD
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegGetDwordW(HKEY hkKey, PCWSTR pwszValueName, DWORD *pdwValue);
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauRegGetDwordA
|
|
*
|
|
* Use to get DWORD value from the DeviceData section of the registry.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hkey - Use hkey returned from wiauRegOpenData
|
|
* pszValueName - Name of registry entry
|
|
* pdwValue - Location to store returned DWORD
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauRegGetDwordA(HKEY hkKey, PCSTR pszValueName, DWORD *pdwValue);
|
|
|
|
|
|
/**************************************************************************\
|
|
* WiauStrW2C
|
|
*
|
|
* Converts a wide character string to an ANSI character string
|
|
*
|
|
* Arguments:
|
|
* pwszSrc - wide character string to be converted
|
|
* pszDst - location to store the ANSI conversion
|
|
* iSize - size of the buffer pointed to by pszDst, in bytes
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauStrW2C(WCHAR *pwszSrc, CHAR *pszDst, INT iSize);
|
|
|
|
|
|
/**************************************************************************\
|
|
* WiauStrC2W
|
|
*
|
|
* Converts an ANSI character string to a wide character string
|
|
*
|
|
* Arguments:
|
|
* pszSrc - ANSI string to convert
|
|
* wpszDst - location to store the wide string
|
|
* iSize - size of the buffer pointed to by wpszDst, in bytes
|
|
*
|
|
\**************************************************************************/
|
|
HRESULT wiauStrC2W(CHAR *pszSrc, WCHAR *pwszDst, INT iSize);
|
|
|
|
|
|
/**************************************************************************\
|
|
* WiauStrW2W
|
|
*
|
|
* Copies a wide character string to another wide character string
|
|
*
|
|
* Arguments:
|
|
* pwszSrc - wide character string to be copied
|
|
* pwszDst - location to copy to
|
|
* iSize - size of the buffer pointed to by pwszDst, in bytes
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauStrW2W(WCHAR *pwszSrc, WCHAR *pwszDst, INT iSize);
|
|
|
|
|
|
/**************************************************************************\
|
|
* WiauStrC2C
|
|
*
|
|
* Copies an ANSI character string to another ANSI character string
|
|
*
|
|
* Arguments:
|
|
* pszSrc - ANSI string to be copied
|
|
* pszDst - location to copy to
|
|
* iSize - size of the buffer pointed to by pszDst, in bytes
|
|
*
|
|
\**************************************************************************/
|
|
|
|
HRESULT wiauStrC2C(CHAR *pszSrc, CHAR *pszDst, INT iSize);
|
|
|
|
|
|
#ifdef UNICODE
|
|
|
|
#define wiauRegOpenData wiauRegOpenDataW
|
|
#define wiauRegGetStr wiauRegGetStrW
|
|
#define wiauRegGetDword wiauRegGetDwordW
|
|
|
|
#define wiauStrT2C wiauStrW2C
|
|
#define wiauStrC2T wiauStrC2W
|
|
#define wiauStrT2W wiauStrW2W
|
|
#define wiauStrW2T wiauStrW2W
|
|
#define WIAU_DEBUG_TSTR "S"
|
|
|
|
#else
|
|
|
|
#define wiauRegOpenData wiauRegOpenDataA
|
|
#define wiauRegGetStr wiauRegGetStrA
|
|
#define wiauRegGetDword wiauRegGetDwordA
|
|
|
|
#define wiauStrT2C wiauStrC2C
|
|
#define wiauStrC2T wiauStrC2C
|
|
#define wiauStrT2W wiauStrC2W
|
|
#define wiauStrW2T wiauStrW2C
|
|
#define WIAU_DEBUG_TSTR "s"
|
|
|
|
#endif // UNICODE
|
|
|
|
|
|
/**************************************************************************\
|
|
* WIA Debugging
|
|
*
|
|
* Definitions for debug messages. To use WIA debugging:
|
|
* 1. Set registry HKLM\System\CurrentControlSet\Control\StillImage\Debug\<ModuleName>,
|
|
* DWORD value "DebugFlags" to the combination of the WIAUDBG_* flags
|
|
* desired. The application and possibly the WIA service will need to be
|
|
* restarted to pick up the new settings. The key is auto created the
|
|
* first time the module is executed. (Note: <ModuleName> above is the
|
|
* name of the DLL or EXE, e.g. wiavusd.dll has a registry key of
|
|
* "HKLM\System\CurrentControlSet\Control\StillImage\Debug\wiavusd.dll".)
|
|
* 2. Or in the debugger, set g_dwDebugFlags to the combination of the
|
|
* WIAUDBG_* flags desired. This can be done anytime during the debug
|
|
* session.
|
|
* 3. From the module, call wiauDbgSetFlags(<flags>), where <flags> is the
|
|
* combination of the WIAUDBG_* flags desired.
|
|
*
|
|
* Messages will be logged to the debugger and the file
|
|
* %systemroot%\\wiadebug.log, unless the WIAUDBG_DONT_LOG_* flags are set.
|
|
* Setting both flags will turn off all messages.
|
|
*
|
|
* All strings should be ASCII. Use %S in the format string to print a
|
|
* Unicode string.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#define _STIDEBUG_H_ // WIA debugging is incompatible with stidebug.h, so don't include it
|
|
|
|
//
|
|
// Predefined debug flags
|
|
//
|
|
|
|
const DWORD WIAUDBG_ERRORS = 0x00000001;
|
|
const DWORD WIAUDBG_WARNINGS = 0x00000002;
|
|
const DWORD WIAUDBG_TRACES = 0x00000004;
|
|
const DWORD WIAUDBG_FNS = 0x00000008; // Function entry and exit
|
|
const DWORD WIAUDBG_DUMP = 0x00000010; // Dump data
|
|
const DWORD WIAUDBG_PRINT_TIME = 0x08000000; // Prints time for each message
|
|
const DWORD WIAUDBG_PRINT_INFO = 0x10000000; // Turns on thread, file, line info
|
|
const DWORD WIAUDBG_DONT_LOG_TO_DEBUGGER = 0x20000000;
|
|
const DWORD WIAUDBG_DONT_LOG_TO_FILE = 0x40000000;
|
|
const DWORD WIAUDBG_BREAK_ON_ERRORS = 0x80000000; // Do DebugBreak on errors
|
|
|
|
//
|
|
// Don't log at all
|
|
//
|
|
const DWORD WIAUDBG_DONT_LOG = WIAUDBG_DONT_LOG_TO_FILE | WIAUDBG_DONT_LOG_TO_DEBUGGER;
|
|
|
|
//
|
|
// Set default flags
|
|
//
|
|
#ifdef DEBUG
|
|
const DWORD WIAUDBG_DEFAULT_FLAGS = WIAUDBG_ERRORS;
|
|
#else
|
|
const DWORD WIAUDBG_DEFAULT_FLAGS = WIAUDBG_DONT_LOG;
|
|
#endif
|
|
|
|
//
|
|
// FormatMessage flags
|
|
//
|
|
const DWORD WIAUDBG_MFMT_FLAGS = FORMAT_MESSAGE_IGNORE_INSERTS |
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_MAX_WIDTH_MASK;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// WIA Debugging has very little overhead and should be put into retail
|
|
// code for drivers. If it's really desired to remove it, define NO_WIA_DEBUG.
|
|
//
|
|
|
|
#ifdef NO_WIA_DEBUG
|
|
|
|
#define g_dwDebugFlags 0
|
|
#define wiauDbgInit(a)
|
|
#define wiauDbgHelper(a,b,c,d)
|
|
#define wiauDbgHelper2 wiauNull3
|
|
#define wiauDbgFlags wiauNull4
|
|
#define wiauDbgError wiauNull2
|
|
#define wiauDbgErrorHr wiauNull3hr
|
|
#define wiauDbgWarning wiauNull2
|
|
#define wiauDbgTrace wiauNull2
|
|
#define wiauDbgDump wiauNull2
|
|
#define wiauDbgSetFlags(a) 0
|
|
#define wiauDbgLegacyError wiauNull1
|
|
#define wiauDbgLegacyWarning wiauNull1
|
|
#define wiauDbgLegacyTrace wiauNull1
|
|
#define wiauDbgLegacyError2 wiauNull2h
|
|
#define wiauDbgLegacyTrace2 wiauNull2h
|
|
#define wiauDbgLegacyHresult2 wiauNullHHr
|
|
|
|
inline void wiauNull1(LPCSTR a, ...) {}
|
|
inline void wiauNull2(LPCSTR a, LPCSTR b,...) {}
|
|
inline void wiauNull2h(HINSTANCE hInstance, LPCSTR b,...) {}
|
|
inline void wiauNull3(LPCSTR a, LPCSTR b, LPCSTR c, ...) {}
|
|
inline void wiauNull3hr(HRESULT a, LPCSTR b, LPCSTR c, ...) {}
|
|
inline void wiauNull4(DWORD a, LPCSTR b, LPCSTR c, LPCSTR d, ...) {}
|
|
inline void wiauNullHHr(HINSTANCE hInstance, HRESULT hr) {}
|
|
|
|
|
|
#else // NO_WIA_DEBUG
|
|
|
|
extern DWORD g_dwDebugFlags;
|
|
extern HANDLE g_hDebugFile;
|
|
extern DWORD g_dwDebugFileSizeLimit;
|
|
extern BOOL g_bDebugInited;
|
|
|
|
|
|
/**************************************************************************\
|
|
* wiauDbgInit
|
|
*
|
|
* Call to initialize WIA debugging. If it's not called, all DLLs will
|
|
* inherit the debug flags of the process that creates them.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* hInstance - DLL instance handle
|
|
*
|
|
\**************************************************************************/
|
|
|
|
void __stdcall wiauDbgInit(HINSTANCE hInstance);
|
|
void __stdcall wiauDbgHelper(LPCSTR prefix, LPCSTR fname, LPCSTR fmt, va_list marker);
|
|
void __stdcall wiauDbgHelper2(LPCSTR prefix, LPCSTR fname, LPCSTR fmt, ...);
|
|
|
|
inline void __stdcall wiauDbgFlags(DWORD flags, LPCSTR prefix,
|
|
LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and the flag is enabled
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & flags)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper(prefix, fname, fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgError(LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and error messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_ERRORS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("ERROR ", fname, fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
|
|
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) {
|
|
DebugBreak();
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgErrorHr(HRESULT hr, LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and error messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_ERRORS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("ERROR ", fname, fmt, marker);
|
|
va_end(marker);
|
|
|
|
CHAR szError[MAX_PATH]; \
|
|
if(!FormatMessageA(WIAUDBG_MFMT_FLAGS, NULL, hr, 0, szError, MAX_PATH, NULL))
|
|
{
|
|
strcpy(szError, "Unknown HRESULT");
|
|
}
|
|
wiauDbgHelper2("ERROR ", fname, "HRESULT = 0x%08x, %s", hr, szError);
|
|
}
|
|
|
|
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) {
|
|
DebugBreak();
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgWarning(LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and warning messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_WARNINGS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("WARN ", fname, fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgTrace(LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and trace messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_TRACES)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper(" ", fname, fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgDump(LPCSTR fname, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and trace messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_DUMP)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper(" ", fname, fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline DWORD __stdcall wiauDbgSetFlags(DWORD flags)
|
|
{
|
|
DWORD dwOld = g_dwDebugFlags;
|
|
g_dwDebugFlags = flags;
|
|
return dwOld;
|
|
}
|
|
|
|
|
|
inline void __stdcall wiauDbgLegacyError(LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and error messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_ERRORS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("ERROR ", "", fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
|
|
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) {
|
|
DebugBreak();
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgLegacyWarning(LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and warning messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_WARNINGS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("WARN ", "", fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgLegacyTrace(LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and trace messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_TRACES)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper(" ", "", fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgLegacyError2(HINSTANCE hInstance, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and error messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_ERRORS)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper("ERROR ", "", fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
|
|
if (g_dwDebugFlags & WIAUDBG_BREAK_ON_ERRORS) {
|
|
DebugBreak();
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgLegacyTrace2(HINSTANCE hInstance, LPCSTR fmt, ...)
|
|
{
|
|
va_list marker;
|
|
|
|
//
|
|
// See if log messages are enabled and trace messages are turned on
|
|
//
|
|
if (((g_dwDebugFlags & WIAUDBG_DONT_LOG) ^ WIAUDBG_DONT_LOG) &&
|
|
(g_dwDebugFlags & WIAUDBG_TRACES)) {
|
|
|
|
va_start(marker, fmt);
|
|
wiauDbgHelper(" ", "", fmt, marker);
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
inline void __stdcall wiauDbgLegacyHresult2(HINSTANCE hInstance, HRESULT hr)
|
|
{
|
|
wiauDbgErrorHr(hr, "", "");
|
|
}
|
|
|
|
#endif // NO_WIA_DEBUG
|
|
|
|
|
|
//
|
|
// Macros for mapping the old WIA logging to the new system
|
|
//
|
|
#ifdef WIA_MAP_OLD_DEBUG
|
|
|
|
#define CWiaLogProc
|
|
#define WIAS_LOGPROC(x, y, z, fname) CWiauDbgFn __CWiauDbgFnObject(fname)
|
|
#define WIAS_LERROR(x,y,params) wiauDbgLegacyError ## params
|
|
#define WIAS_LWARNING(x,y,params) wiauDbgLegacyWarning ## params
|
|
#define WIAS_LTRACE(x,y,z,params) wiauDbgLegacyTrace ## params
|
|
#define WIAS_LHRESULT(x,y) wiauDbgErrorHr(y, "", "")
|
|
|
|
#define WIAS_TRACE(x) wiauDbgLegacyTrace2 ## x
|
|
#define WIAS_ERROR(x) wiauDbgLegacyError2 ## x
|
|
#define WIAS_HRESULT(x) wiauDbgLegacyHresult2 ## x
|
|
#define WIAS_ASSERT(x, y) \
|
|
if (!(y)) { \
|
|
WIAS_ERROR((x, (char*) TEXT("ASSERTION FAILED: %hs(%d): %hs"), __FILE__,__LINE__,#x)); \
|
|
DebugBreak(); \
|
|
}
|
|
|
|
#endif // WIA_MAP_OLD_DEBUG
|
|
|
|
|
|
//
|
|
// Macros for checking return values and common error conditions
|
|
//
|
|
|
|
#define REQUIRE_SUCCESS(hr, fname, msg) \
|
|
if (FAILED(hr)) { \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgErrorHr(hr, fname, msg); \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_OK(hr, fname, msg) \
|
|
if ((hr) != S_OK) { \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgErrorHr(hr, fname, msg); \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_ARGS(args, hr, fname) \
|
|
if (args) { \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgError(fname, "Invalid arg"); \
|
|
hr = E_INVALIDARG; \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_ALLOC(var, hr, fname) \
|
|
if (!(var)) { \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgError(fname, "Memory allocation failed on " #var); \
|
|
hr = E_OUTOFMEMORY; \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_FILEHANDLE(handle, hr, fname, msg) \
|
|
if ((handle) == NULL || (handle) == INVALID_HANDLE_VALUE) { \
|
|
hr = HRESULT_FROM_WIN32(::GetLastError()); \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgErrorHr(hr, fname, msg); \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_FILEIO(ret, hr, fname, msg) \
|
|
if (!(ret)) { \
|
|
hr = HRESULT_FROM_WIN32(::GetLastError()); \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgErrorHr(hr, fname, msg); \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
#define REQUIRE_WIN32(err, hr, fname, msg) \
|
|
if ((err) != ERROR_SUCCESS) { \
|
|
hr = HRESULT_FROM_WIN32(err); \
|
|
if (g_dwDebugFlags & WIAUDBG_PRINT_INFO) { \
|
|
DWORD threadId = GetCurrentThreadId(); \
|
|
wiauDbgError(fname, "[%s(%d): Thread 0x%X (%d)]", __FILE__, __LINE__, threadId, threadId); \
|
|
} \
|
|
wiauDbgErrorHr(hr, fname, msg); \
|
|
goto Cleanup; \
|
|
}
|
|
|
|
|
|
//
|
|
// Macro and class for entry/exit point tracing
|
|
//
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#ifdef NO_WIA_DEBUG
|
|
|
|
#define DBG_FN(fname)
|
|
|
|
#else // NO_WIA_DEBUG
|
|
|
|
#define DBG_FN(fname) CWiauDbgFn __CWiauDbgFnObject(fname)
|
|
|
|
class CWiauDbgFn {
|
|
public:
|
|
|
|
CWiauDbgFn(LPCSTR fname)
|
|
{
|
|
m_fname = fname;
|
|
m_threadId = GetCurrentThreadId();
|
|
wiauDbgFlags(WIAUDBG_FNS, " ", m_fname, "Entering, thread 0x%x (%d)",
|
|
m_threadId, m_threadId);
|
|
|
|
}
|
|
|
|
~CWiauDbgFn()
|
|
{
|
|
wiauDbgFlags(WIAUDBG_FNS, " ", m_fname, "Exiting, thread 0x%x (%d)",
|
|
m_threadId, m_threadId);
|
|
}
|
|
|
|
private:
|
|
LPCSTR m_fname;
|
|
DWORD m_threadId;
|
|
};
|
|
#endif // NO_WIA_DEBUG
|
|
|
|
}
|
|
|
|
#else // __cplusplus
|
|
|
|
#define DBG_FN(fname) wiauDbgFlags(WIAUDBG_FNS, " ", fname, "Entering");
|
|
#endif // __cplusplus
|
|
|