propvar.h
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 17k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //-------------------------------------------------------------------------//
  2. //
  3. //  PropVar.h
  4. //
  5. //-------------------------------------------------------------------------//
  6. #ifndef __PROPVAR_H__
  7. #define __PROPVAR_H__
  8. #include "PTServer.h"
  9. //-------------------------------------------------------------------------//
  10. enum PROPVARIANT_ALLOCTYPE
  11. {
  12.     PVAT_NOALLOC,
  13.     PVAT_SYSALLOC,
  14.     PVAT_STRINGALLOC,
  15.     PVAT_COMPLEX,
  16.     PVAT_UNKNOWN,
  17. } ;
  18. //  PropVariantCompare flags
  19. #define PVCF_IGNORECASE     0x00000001
  20. #define PVCF_IGNORETIME     0x00000002
  21. #define PVCF_IGNOREDATE     0x00000004
  22. HRESULT  PropVariantSize( IN const PROPVARIANT&, OUT ULONG& cbSize, OUT OPTIONAL PROPVARIANT_ALLOCTYPE* = NULL ) ;
  23. int      PropVariantCompare( IN const PROPVARIANT& var1, IN const PROPVARIANT& var2, ULONG uFlags ) ;
  24. HRESULT  PropVariantHash( IN const PROPVARIANT& var, OUT ULONG& hash ) ;
  25. HRESULT  PropVariantWriteRegistry( HKEY hKey, LPCTSTR pszValueName, IN const PROPVARIANT& var ) ;
  26. HRESULT  PropVariantReadRegistry( HKEY hKey, LPCTSTR pszValueName, OUT PROPVARIANT& var ) ;
  27. HRESULT  PropVariantWriteMem( IN const PROPVARIANT& var, OUT BYTE* pBuf, IN ULONG cbBuf ) ;
  28. HRESULT  PropVariantReadMem( IN BYTE* pBuf, OUT PROPVARIANT& var ) ;
  29. HRESULT  PropVariantToVariant( IN const PROPVARIANT* pvarSrc, OUT VARIANT* pvarDst ) ;
  30. HRESULT  PropVariantToBstr( const PROPVARIANT* pvar, UINT nCodePage, ULONG dwFlags, LPCTSTR pszFmt, OUT BSTR* pbstrText ) ;
  31. HRESULT  PropVariantFromBstr( IN const BSTR bstrText, UINT nCodePage, ULONG dwFlags, LPCTSTR pszFmt, OUT PROPVARIANT* pvar ) ;
  32. HRESULT  PropVariantToString( const PROPVARIANT* pvar, UINT nCodePage, ULONG dwFlags, LPCTSTR pszFmt, OUT LPTSTR pszText, IN ULONG cchTextMax ) ;
  33. HRESULT  PropVariantFromString( IN LPCTSTR pszText, UINT nCodePage, ULONG dwFlags, LPCTSTR pszFmt, OUT PROPVARIANT* pvar ) ;
  34. //  nullifies time fields in a date/time structures:
  35. void     SystemTimeMakeTimeless( SYSTEMTIME* pst );
  36. HRESULT  PropVariantMakeTimeless( PROPVARIANT* pvar );
  37. //-------------------------------------------------------------------------//
  38. typedef class CPropVariant : public PROPVARIANT
  39. //-------------------------------------------------------------------------//
  40. {
  41. //  Constructors
  42. public:
  43.     CPropVariant() ;
  44.     CPropVariant( const CPropVariant& varSrc ) ; // not defined by base
  45.     CPropVariant( const PROPVARIANT& varSrc ) ;  // not defined by base
  46.     CPropVariant( const BYTE&, VARTYPE vt = VT_UI1 ) ;
  47.     CPropVariant( const SHORT& ) ;
  48.     CPropVariant( const USHORT& ) ;
  49.     CPropVariant( const bool& ) ;
  50.     CPropVariant( const LONG&, VARTYPE vt = VT_I4 ) ;
  51.     CPropVariant( const ULONG&, VARTYPE vt = VT_UI4 ) ;
  52.     CPropVariant( const FLOAT& ) ;
  53.     CPropVariant( const LARGE_INTEGER& ) ;
  54.     CPropVariant( const ULARGE_INTEGER& ) ;
  55.     CPropVariant( const DOUBLE&, VARTYPE vt = VT_R8 /*or VT_DATE*/ ) ;
  56.     CPropVariant( const CY& ) ;
  57.     CPropVariant( const DATE& ) ;
  58.     CPropVariant( const FILETIME& ) ;
  59.     CPropVariant( const CLSID& ) ;
  60.     CPropVariant( const BLOB& ) ;
  61.     CPropVariant( const CLIPDATA& ) ;
  62.     CPropVariant( IStream* ) ;
  63.     CPropVariant( IStorage* ) ;
  64.     CPropVariant( const BSTR& ) ;
  65.     CPropVariant( const LPSTR ) ;
  66.     CPropVariant( const LPWSTR ) ;
  67.     CPropVariant( const CAUB& ) ;
  68.     CPropVariant( const CAI& ) ;
  69.     CPropVariant( const CAUI& ) ;
  70.     CPropVariant( const CABOOL& ) ;
  71.     CPropVariant( const CAL& ) ;
  72.     CPropVariant( const CAUL& ) ;
  73.     CPropVariant( const CAFLT& ) ;
  74.     CPropVariant( const CASCODE& ) ;
  75.     CPropVariant( const CAH& ) ;
  76.     CPropVariant( const CAUH& ) ;
  77.     CPropVariant( const CADBL& ) ;
  78.     CPropVariant( const CACY& ) ;
  79.     CPropVariant( const CADATE& ) ;
  80.     CPropVariant( const CAFILETIME& ) ;
  81.     CPropVariant( const CACLSID& ) ;
  82.     CPropVariant( const CACLIPDATA& ) ;
  83.     CPropVariant( const CABSTR& ) ;
  84.     CPropVariant( const CALPSTR& ) ;
  85.     CPropVariant( const CALPWSTR& ) ;
  86.     CPropVariant( const CAPROPVARIANT& ) ;
  87. //  Destructor
  88. public:
  89.     virtual ~CPropVariant() ;
  90. //  Attach/Detach.
  91.     void Attach( IN OUT PROPVARIANT* pSrc ) ;
  92.     void Detach( OUT PROPVARIANT* pDest ) ;
  93. // Assignment Operators
  94. public:
  95.     CPropVariant& operator=( const CPropVariant& ) ;
  96.     CPropVariant& operator=( const PROPVARIANT& ) ;
  97.     CPropVariant& operator=( const BYTE& ) ;
  98.     CPropVariant& operator=( const SHORT& ) ;
  99.     CPropVariant& operator=( const USHORT& ) ;
  100.     CPropVariant& operator=( const bool& ) ;
  101.     CPropVariant& operator=( const LONG& ) ;
  102.     CPropVariant& operator=( const ULONG& ) ;
  103.     CPropVariant& operator=( const FLOAT& ) ;
  104.     CPropVariant& operator=( const LARGE_INTEGER& ) ;
  105.     CPropVariant& operator=( const ULARGE_INTEGER& ) ;
  106.     CPropVariant& operator=( const DOUBLE& ) ;
  107.     CPropVariant& operator=( const CY& ) ;
  108.     CPropVariant& operator=( const FILETIME& ) ;
  109.     CPropVariant& operator=( const CLSID& ) ;
  110.     CPropVariant& operator=( const BLOB& ) ;
  111.     CPropVariant& operator=( const CLIPDATA& ) ;
  112.     CPropVariant& operator=( IStream* ) ;
  113.     CPropVariant& operator=( IStorage* ) ;
  114.     CPropVariant& operator=( const BSTR& ) ;
  115.     CPropVariant& operator=( const LPSTR ) ;
  116.     CPropVariant& operator=( const LPWSTR ) ;
  117.     CPropVariant& operator=( const CAUB& ) ;
  118.     CPropVariant& operator=( const CAI& ) ;
  119.     CPropVariant& operator=( const CAUI& ) ;
  120.     CPropVariant& operator=( const CABOOL& ) ;
  121.     CPropVariant& operator=( const CAL& ) ;
  122.     CPropVariant& operator=( const CAUL& ) ;
  123.     CPropVariant& operator=( const CAFLT& ) ;
  124.     CPropVariant& operator=( const CASCODE& ) ;
  125.     CPropVariant& operator=( const CAH& ) ;
  126.     CPropVariant& operator=( const CAUH& ) ;
  127.     CPropVariant& operator=( const CADBL& ) ;
  128.     CPropVariant& operator=( const CACY& ) ;
  129.     CPropVariant& operator=( const CADATE& ) ;
  130.     CPropVariant& operator=( const CAFILETIME& ) ;
  131.     CPropVariant& operator=( const CACLSID& ) ;
  132.     CPropVariant& operator=( const CACLIPDATA& ) ;
  133.     CPropVariant& operator=( const CABSTR& ) ;
  134.     CPropVariant& operator=( const CALPSTR& ) ;
  135.     CPropVariant& operator=( const CALPWSTR& ) ;
  136.     CPropVariant& operator=( const CAPROPVARIANT& ) ;
  137. public:
  138.     VARTYPE Type() const    { return vt ; }
  139.     void    SetType( VARTYPE vtNew ) ;
  140.     //  Retrieves a display string for the value.  The caller
  141.     //  is responsible for freeing the string with SysFreeString().
  142.     virtual HRESULT GetDisplayText( OUT BSTR& bstrText, IN OPTIONAL LPCTSTR pszFmt = NULL, IN OPTIONAL ULONG dwFlags = 0L ) const ;
  143.     //  Copies the variant's display string to the caller-provided buffer.
  144.     virtual HRESULT GetDisplayText( OUT LPTSTR pszText, IN int cchText, IN OPTIONAL LPCTSTR pszFmt = NULL, IN OPTIONAL ULONG dwFlags = 0L ) const ;
  145.     //  Updates the variant's value given a display string
  146.     HRESULT AssignFromDisplayText( IN const BSTR bstrText, IN OPTIONAL LPCTSTR pszFmt = NULL ) ;
  147.     HRESULT AssignFromDisplayText( IN LPCTSTR pszText, IN OPTIONAL LPCTSTR pszFmt = NULL ) ;
  148.     //  Comparison methods
  149.     int     Compare( const PROPVARIANT& varOther, ULONG uFlags ) const ;
  150.     int     CompareText( const CPropVariant& varOther, ULONG uFlags, IN OPTIONAL LPCTSTR pszFmt = NULL, IN OPTIONAL ULONG dwFlags = 0L ) const ;
  151.     //  Registry functions
  152.     HRESULT WriteValue( HKEY hKey, LPCTSTR pszValueName ) const ;
  153.     HRESULT ReadValue( HKEY hKey, LPCTSTR pszValueName ) ;
  154.     //  Hashing methods
  155.     ULONG   Hash() const ;
  156.     
  157.     //  Release resources and reinitialize.
  158.     void    Clear() ;
  159. protected:
  160.     //  Implementation
  161.     void    CommonConstruct() ;
  162.     PVOID   AllocAndCopy( const VOID* pvSrc, DWORD cb ) const ;
  163.     BSTR    AllocString( LPCWSTR src ) const ;
  164.     BSTR    AllocStringLen( LPCWSTR src, UINT cch ) const ;
  165. } *PCOMPROPVARIANT, *LPCOMPROPVARIANT ;
  166. //-------------------------------------------------------------------------//
  167. //  CPropVariant specialization with built-in maintenance of display text.
  168. typedef class CDisplayPropVariant : public CPropVariant
  169. //-------------------------------------------------------------------------//
  170. {
  171. public:
  172.                 CDisplayPropVariant() ;
  173.                 CDisplayPropVariant( const PROPVARIANT& p ) ;
  174.     virtual     ~CDisplayPropVariant() ;
  175.     
  176.     HRESULT     CreateDisplayText( IN OPTIONAL LPCTSTR pszFmt = NULL, IN OPTIONAL ULONG dwFlags = 0L ) ;
  177.     void        SetDisplayTextT( IN LPCTSTR pszDisplay ) ;
  178.     void        SetDisplayText( IN BSTR bstrDisplay ) ;
  179.     const BSTR  DisplayText() const ;
  180. protected:
  181.     BSTR        m_bstrDisplay ;
  182. } *PDISPLAYPROPVARIANT, *LPPDISPLAYPROPVARIANT ;
  183. //-------------------------------------------------------------------------//
  184. //  C++ wrap for property unique identifier
  185. class CPropertyUID : public tagPUID
  186. //-------------------------------------------------------------------------//
  187. {
  188. public:
  189.     //  Construction
  190.     CPropertyUID() ;
  191.     CPropertyUID( const struct tagPUID& src ) ;
  192.     
  193.     //  Assignment
  194.     void Set( REFFMTID _fmtid, PROPID _propid, VARTYPE _vt ) ;
  195.     const struct tagPUID& operator= ( const struct tagPUID& src ) ;
  196.     //  Comparison
  197.     BOOL operator==( const struct tagPUID& other ) const ;
  198.     BOOL operator!=( const struct tagPUID& other ) const ;
  199.     //  Hashing
  200.     ULONG Hash() const ;
  201. } ;
  202. //-------------------------------------------------------------------------//
  203. //  Inline implementation, class CPropVariant
  204. inline void CPropVariant::CommonConstruct()    {
  205.     ::PropVariantInit( this ) ;
  206. }
  207. inline CPropVariant::CPropVariant()    {
  208.     CommonConstruct() ;
  209. }
  210. inline CPropVariant::CPropVariant( const CPropVariant& src )   {
  211.     CommonConstruct() ;
  212.     operator=(src) ;
  213. }
  214. inline CPropVariant::CPropVariant( const PROPVARIANT& src )   {
  215.     CommonConstruct() ;
  216.     operator=(src) ;
  217. }
  218. inline CPropVariant::CPropVariant( const BYTE& src, VARTYPE vtSrc )   {
  219.     CommonConstruct() ;
  220.     operator=(src) ;
  221.     vt = vtSrc ;
  222. }
  223. inline CPropVariant::CPropVariant( const SHORT& src )   {
  224.     CommonConstruct() ;
  225.     operator=(src) ;
  226. }
  227. inline CPropVariant::CPropVariant( const USHORT& src )   {
  228.     CommonConstruct() ;
  229.     operator=(src) ;
  230. }
  231. inline CPropVariant::CPropVariant( const bool& src )   {
  232.     CommonConstruct() ;
  233.     operator=(src) ;
  234. }
  235. inline CPropVariant::CPropVariant( const LONG& src, VARTYPE vtSrc )   {
  236.     CommonConstruct() ;
  237.     operator=(src) ;
  238.     vt = vtSrc ;
  239. }
  240. inline CPropVariant::CPropVariant( const ULONG& src, VARTYPE vtSrc )   {
  241.     CommonConstruct() ;
  242.     operator=(src) ;
  243.     vt = vtSrc ;
  244. }
  245. inline CPropVariant::CPropVariant( const FLOAT& src )   {
  246.     CommonConstruct() ;
  247.     operator=(src) ;
  248. }
  249. inline CPropVariant::CPropVariant( const LARGE_INTEGER& src )   {
  250.     CommonConstruct() ;
  251.     operator=(src) ;
  252. }
  253. inline CPropVariant::CPropVariant( const ULARGE_INTEGER& src )   {
  254.     CommonConstruct() ;
  255.     operator=(src) ;
  256. }
  257. inline CPropVariant::CPropVariant( const DOUBLE& src, VARTYPE vtSrc )   {
  258.     CommonConstruct() ;
  259.     operator=(src) ;
  260.     vt = vtSrc ;
  261. }
  262. inline CPropVariant::CPropVariant( const CY& src )   {
  263.     CommonConstruct() ;
  264.     operator=(src) ;
  265. }
  266. inline CPropVariant::CPropVariant( const DATE& src )   {
  267.     CommonConstruct() ;
  268.     operator=(src) ;
  269. }
  270. inline CPropVariant::CPropVariant( const FILETIME& src )   {
  271.     CommonConstruct() ;
  272.     operator=(src) ;
  273. }
  274. inline CPropVariant::CPropVariant( const CLSID& src )   {
  275.     CommonConstruct() ;
  276.     operator=(src) ;
  277. }
  278. inline CPropVariant::CPropVariant( const BLOB& src )   {
  279.     CommonConstruct() ;
  280.     operator=(src) ;
  281. }
  282. inline CPropVariant::CPropVariant( const CLIPDATA& src )   {
  283.     CommonConstruct() ;
  284.     operator=(src) ;
  285. }
  286. inline CPropVariant::CPropVariant( IStream* pSrc )   {
  287.     CommonConstruct() ;
  288.     operator=(pSrc) ;
  289. }
  290. inline CPropVariant::CPropVariant( IStorage* pSrc )   {
  291.     CommonConstruct() ;
  292.     operator=(pSrc) ;
  293. }
  294. inline CPropVariant::CPropVariant( const BSTR& src )   {
  295.     CommonConstruct() ;
  296.     operator=((BSTR)src) ;
  297. }
  298. inline CPropVariant::CPropVariant( const LPSTR src )   {
  299.     CommonConstruct() ;
  300.     operator=(src) ;
  301. }
  302. inline CPropVariant::CPropVariant( const LPWSTR src )    {
  303.     CommonConstruct() ;
  304.     operator=((LPWSTR)src) ;
  305. }
  306. inline CPropVariant::CPropVariant( const CAUB& src )   {
  307.     CommonConstruct() ;
  308.     operator=(src) ;
  309. }
  310. inline CPropVariant::CPropVariant( const CAI& src )   {
  311.     CommonConstruct() ;
  312.     operator=(src) ;
  313. }
  314. inline CPropVariant::CPropVariant( const CAUI& src )   {
  315.     CommonConstruct() ;
  316.     operator=(src) ;
  317. }
  318. inline CPropVariant::CPropVariant( const CABOOL& src )   {
  319.     CommonConstruct() ;
  320.     operator=(src) ;
  321. }
  322. inline CPropVariant::CPropVariant( const CAL& src )   {
  323.     CommonConstruct() ;
  324.     operator=(src) ;
  325. }
  326. inline CPropVariant::CPropVariant( const CAUL& src )   {
  327.     CommonConstruct() ;
  328.     operator=(src) ;
  329. }
  330. inline CPropVariant::CPropVariant( const CAFLT& src )   {
  331.     CommonConstruct() ;
  332.     operator=(src) ;
  333. }
  334. inline CPropVariant::CPropVariant( const CASCODE& src )   {
  335.     CommonConstruct() ;
  336.     operator=(src) ;
  337. }
  338. inline CPropVariant::CPropVariant( const CAH& src )   {
  339.     CommonConstruct() ;
  340.     operator=(src) ;
  341. }
  342. inline CPropVariant::CPropVariant( const CAUH& src )   {
  343.     CommonConstruct() ;
  344.     operator=(src) ;
  345. }
  346. inline CPropVariant::CPropVariant( const CADBL& src )   {
  347.     CommonConstruct() ;
  348.     operator=(src) ;
  349. }
  350. inline CPropVariant::CPropVariant( const CACY& src )   {
  351.     CommonConstruct() ;
  352.     operator=(src) ;
  353. }
  354. inline CPropVariant::CPropVariant( const CADATE& src )   {
  355.     CommonConstruct() ;
  356.     operator=(src) ;
  357. }
  358. inline CPropVariant::CPropVariant( const CAFILETIME& src )   {
  359.     CommonConstruct() ;
  360.     operator=(src) ;
  361. }
  362. inline CPropVariant::CPropVariant( const CACLSID& src )   {
  363.     CommonConstruct() ;
  364.     operator=(src) ;
  365. }
  366. inline CPropVariant::CPropVariant( const CACLIPDATA& src )   {
  367.     CommonConstruct() ;
  368.     operator=(src) ;
  369. }
  370. inline CPropVariant::CPropVariant( const CABSTR& src )   {
  371.     CommonConstruct() ;
  372.     operator=(src) ;
  373. }
  374. inline CPropVariant::CPropVariant( const CALPSTR& src )   {
  375.     CommonConstruct() ;
  376.     operator=(src) ;
  377. }
  378. inline CPropVariant::CPropVariant( const CALPWSTR& src )   {
  379.     CommonConstruct() ;
  380.     operator=(src) ;
  381. }
  382. inline CPropVariant::CPropVariant( const CAPROPVARIANT& src )   {
  383.     CommonConstruct() ;
  384.     operator=(src) ;
  385. }
  386. inline CPropVariant::~CPropVariant()   {
  387.     Clear() ;
  388. }
  389. inline void CPropVariant::SetType( VARTYPE vtNew ){
  390.     vt = vtNew ;
  391. }
  392. inline BSTR CPropVariant::AllocString( LPCWSTR src ) const  {
  393.     return SysAllocString( src ) ;
  394. }
  395. inline BSTR CPropVariant::AllocStringLen( LPCWSTR src, UINT cch ) const {
  396.     return SysAllocStringLen( src, cch ) ;
  397. }
  398. inline PVOID CPropVariant::AllocAndCopy( const VOID* pvSrc, DWORD cb ) const    {
  399.     PVOID pvDest ;
  400.     if( (pvDest = CoTaskMemAlloc( cb ))!=NULL )
  401.         memcpy( pvDest, pvSrc, cb ) ;
  402.     return pvDest ;
  403. }
  404. inline void  CPropVariant::Clear()   {
  405.     ::PropVariantClear( this ) ;
  406.     ::PropVariantInit( this ) ;
  407. }
  408. inline int CPropVariant::Compare( const PROPVARIANT& varOther, ULONG uFlags ) const {
  409.     return ::PropVariantCompare( *this, varOther, uFlags ) ;
  410. }
  411. inline ULONG CPropVariant::Hash() const {
  412.     ULONG dwHash ;
  413.     if( SUCCEEDED( ::PropVariantHash( *this, dwHash ) ) )
  414.         return dwHash ;
  415.     return 0L ;
  416. }
  417. //-------------------------------------------------------------------------//
  418. //  Inline implementation, class CDisplayPropVariant : public CPropVariant
  419. inline CDisplayPropVariant::CDisplayPropVariant() 
  420.     :   m_bstrDisplay(NULL) {
  421. }
  422. inline CDisplayPropVariant::CDisplayPropVariant( const PROPVARIANT& p ) 
  423.     :   CPropVariant( p ), m_bstrDisplay(NULL) {
  424. }
  425. inline CDisplayPropVariant::~CDisplayPropVariant() { 
  426.     SetDisplayText(NULL) ; 
  427. }
  428. inline const BSTR CDisplayPropVariant::DisplayText() const { 
  429.     return m_bstrDisplay ;
  430. }
  431. //-------------------------------------------------------------------------//
  432. //  Inline implementation, class CPropertyUID
  433. inline CPropertyUID::CPropertyUID() {
  434.     propid  = 0 ;
  435.     vt      = 0 ;
  436.     memset( &fmtid, 0, sizeof(fmtid) ) ;
  437. }
  438. inline CPropertyUID::CPropertyUID( const struct tagPUID& src )  {
  439.     operator=( src ) ;
  440. }
  441. inline void CPropertyUID::Set( REFFMTID _fmtid, PROPID _propid, VARTYPE _vt )    {
  442.     fmtid  = _fmtid ;
  443.     propid = _propid ;
  444.     vt     = _vt ;
  445. }
  446. inline const struct tagPUID& CPropertyUID::operator = ( const struct tagPUID& src )  {   
  447.     if( &src==this ) return *this ;
  448.     fmtid = src.fmtid ; propid = src.propid ; vt = src.vt ;
  449.     return *this ;
  450. }
  451. inline BOOL CPropertyUID::operator==( const struct tagPUID& other ) const  {
  452.     return propid == other.propid && 
  453.            memcmp( &fmtid, &other.fmtid, sizeof(fmtid) )==0 ;
  454. }
  455. inline BOOL CPropertyUID::operator!=( const struct tagPUID& other ) const  {
  456.     return !operator==(other) ;
  457. }
  458. #endif __PROPVAR_H__