PROPSPEC.CXX
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //+-------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //  Copyright 1992 - 1997 Microsoft Corporation
  5. //
  6. //  File:       propspec.cxx
  7. //
  8. //  Contents:   C++ wrappers for FULLPROPSPEC
  9. //
  10. //--------------------------------------------------------------------------
  11. #include <pch.cxx>
  12. #pragma hdrstop
  13. #include <propspec.hxx>
  14. //+-------------------------------------------------------------------------
  15. //
  16. //  Member:     CFullPropSpec::CFullPropSpec, public
  17. //
  18. //  Synopsis:   Default constructor
  19. //
  20. //  Effects:    Defines property with null guid and propid 0
  21. //
  22. //--------------------------------------------------------------------------
  23. CFullPropSpec::CFullPropSpec()
  24. {
  25.     memset( &_guidPropSet, 0, sizeof( _guidPropSet ) );
  26.     _psProperty.ulKind = PRSPEC_PROPID;
  27.     _psProperty.propid = 0;
  28. }
  29. //+-------------------------------------------------------------------------
  30. //
  31. //  Member:     CFullPropSpec::CFullPropSpec, public
  32. //
  33. //  Synopsis:   Construct propid based propspec
  34. //
  35. //  Arguments:  [guidPropSet]  -- Property set
  36. //              [pidProperty] -- Property
  37. //
  38. //--------------------------------------------------------------------------
  39. CFullPropSpec::CFullPropSpec( GUID const & guidPropSet, PROPID pidProperty )
  40.         : _guidPropSet( guidPropSet )
  41. {
  42.     _psProperty.ulKind = PRSPEC_PROPID;
  43.     _psProperty.propid = pidProperty;
  44. }
  45. //+-------------------------------------------------------------------------
  46. //
  47. //  Member:     CFullPropSpec::CFullPropSpec, public
  48. //
  49. //  Synopsis:   Construct name based propspec
  50. //
  51. //  Arguments:  [guidPropSet] -- Property set
  52. //              [wcsProperty] -- Property
  53. //
  54. //--------------------------------------------------------------------------
  55. CFullPropSpec::CFullPropSpec( GUID const & guidPropSet,
  56.                               WCHAR const * wcsProperty )
  57.         : _guidPropSet( guidPropSet )
  58. {
  59.     _psProperty.ulKind = PRSPEC_PROPID;
  60.     SetProperty( wcsProperty );
  61. }
  62. //+-------------------------------------------------------------------------
  63. //
  64. //  Member:     CFullPropSpec::CFullPropSpec, public
  65. //
  66. //  Synopsis:   Copy constructor
  67. //
  68. //  Arguments:  [src] -- Source property spec
  69. //
  70. //--------------------------------------------------------------------------
  71. CFullPropSpec::CFullPropSpec( CFullPropSpec const & src )
  72.         : _guidPropSet( src._guidPropSet )
  73. {
  74.     _psProperty.ulKind = src._psProperty.ulKind;
  75.     if ( _psProperty.ulKind == PRSPEC_LPWSTR )
  76.     {
  77.         if ( src._psProperty.lpwstr )
  78.         {
  79.             _psProperty.ulKind = PRSPEC_PROPID;
  80.             SetProperty( src._psProperty.lpwstr );
  81.         }
  82.         else
  83.             _psProperty.lpwstr = 0;
  84.     }
  85.     else
  86.     {
  87.         _psProperty.propid = src._psProperty.propid;
  88.     }
  89. }
  90. inline void * operator new( size_t size, void * p )
  91. {
  92.     return( p );
  93. }
  94. //+-------------------------------------------------------------------------
  95. //
  96. //  Member:     CFullPropSpec::operator=, public
  97. //
  98. //  Synopsis:   Assignment operator
  99. //
  100. //  Arguments:  [Property] -- Source property
  101. //
  102. //--------------------------------------------------------------------------
  103. CFullPropSpec & CFullPropSpec::operator=( CFullPropSpec const & Property )
  104. {
  105.     //
  106.     // Clean up.
  107.     //
  108.     CFullPropSpec::~CFullPropSpec();
  109.     new (this) CFullPropSpec( Property );
  110.     return *this;
  111. }
  112. CFullPropSpec::~CFullPropSpec()
  113. {
  114.     if ( _psProperty.ulKind == PRSPEC_LPWSTR &&
  115.          _psProperty.lpwstr )
  116.     {
  117.         CoTaskMemFree( _psProperty.lpwstr );
  118.     }
  119. }
  120. void CFullPropSpec::SetProperty( PROPID pidProperty )
  121. {
  122.     if ( _psProperty.ulKind == PRSPEC_LPWSTR &&
  123.          0 != _psProperty.lpwstr )
  124.     {
  125.         CoTaskMemFree( _psProperty.lpwstr );
  126.     }
  127.     _psProperty.ulKind = PRSPEC_PROPID;
  128.     _psProperty.propid = pidProperty;
  129. }
  130. BOOL CFullPropSpec::SetProperty( WCHAR const * wcsProperty )
  131. {
  132.     if ( _psProperty.ulKind == PRSPEC_LPWSTR &&
  133.          0 != _psProperty.lpwstr )
  134.     {
  135.         CoTaskMemFree( _psProperty.lpwstr );
  136.     }
  137.     _psProperty.ulKind = PRSPEC_LPWSTR;
  138.     int len = (wcslen( wcsProperty ) + 1) * sizeof( WCHAR );
  139.     _psProperty.lpwstr = (WCHAR *)CoTaskMemAlloc( len );
  140.     if ( 0 != _psProperty.lpwstr )
  141.     {
  142.         memcpy( _psProperty.lpwstr,
  143.                 wcsProperty,
  144.                 len );
  145.         return( TRUE );
  146.     }
  147.     else
  148.     {
  149.         _psProperty.lpwstr = 0;
  150.         return( FALSE );
  151.     }
  152. }
  153. int CFullPropSpec::operator==( CFullPropSpec const & prop ) const
  154. {
  155.     if ( memcmp( &prop._guidPropSet,
  156.                  &_guidPropSet,
  157.                  sizeof( _guidPropSet ) ) != 0 ||
  158.          prop._psProperty.ulKind != _psProperty.ulKind )
  159.     {
  160.         return( 0 );
  161.     }
  162.     switch( _psProperty.ulKind )
  163.     {
  164.     case PRSPEC_LPWSTR:
  165.         return( _wcsicmp( GetPropertyName(), prop.GetPropertyName() ) == 0 );
  166.         break;
  167.     case PRSPEC_PROPID:
  168.         return( GetPropertyPropid() == prop.GetPropertyPropid() );
  169.         break;
  170.     default:
  171.         return( 0 );
  172.         break;
  173.     }
  174. }
  175. int CFullPropSpec::operator!=( CFullPropSpec const & prop ) const
  176. {
  177.     if (*this == prop)
  178.         return( 0 );
  179.     else
  180.         return( 1 );
  181. }