Source code of Windows XP (NT5)
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.

75 lines
938 B

  1. //
  2. // auto_sa.h SAFEARRAY
  3. //
  4. #pragma once
  5. class auto_sa
  6. {
  7. public:
  8. auto_sa()
  9. : _psa(0),
  10. _Owns(true)
  11. {}
  12. ~auto_sa()
  13. {
  14. if(_psa && _Owns)
  15. {
  16. _psa->cLocks= 0;
  17. ::SafeArrayDestroy(_psa);
  18. }
  19. }
  20. bool Ownership(bool fOwns)
  21. { return _Owns = fOwns; }
  22. operator SAFEARRAY *() { return _psa; }
  23. operator const SAFEARRAY *() const { return _psa; }
  24. auto_sa& operator=(auto_sa& rhs)
  25. {
  26. if(_psa == rhs._psa)
  27. return *this;
  28. clear();
  29. _Owns= rhs._Owns;
  30. _psa= rhs.release();
  31. return *this;
  32. }
  33. auto_sa& operator=(SAFEARRAY* psa)
  34. {
  35. clear();
  36. _psa= psa;
  37. _Owns= true;
  38. return *this;
  39. }
  40. operator bool()
  41. { return NULL != _psa; }
  42. operator !()
  43. { return NULL == _psa; }
  44. void clear()
  45. {
  46. if(_psa && _Owns)
  47. {
  48. _psa->cLocks= 0;
  49. ::SafeArrayDestroy(_psa);
  50. }
  51. _psa= NULL;
  52. }
  53. SAFEARRAY* release()
  54. {
  55. SAFEARRAY* psa= _psa;
  56. _psa= NULL;
  57. return psa;
  58. }
  59. protected:
  60. SAFEARRAY *_psa;
  61. bool _Owns;
  62. };