clsutil.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 14k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //*********************************************************************
  2. //*                  Microsoft Windows                               **
  3. //*            Copyright(c) Microsoft Corp., 1994-1995               **
  4. //*********************************************************************
  5. //
  6. //  CLSUTIL.C - some small, useful C++ classes to wrap memory allocation,
  7. //              registry access, etc.
  8. //
  9. //  HISTORY:
  10. //  
  11. //  12/07/94    jeremys        Borrowed from WNET common library
  12. //
  13. #include "inetcplp.h"
  14. BOOL BUFFER::Alloc( UINT cbBuffer )
  15. {
  16.     _lpBuffer = (LPTSTR)::GlobalAlloc(GPTR,cbBuffer);
  17.     if (_lpBuffer != NULL) {
  18.         _cb = cbBuffer;
  19.         return TRUE;
  20.     }
  21.     return FALSE;
  22. }
  23. BOOL BUFFER::Realloc( UINT cbNew )
  24. {
  25.     LPVOID lpNew = ::GlobalReAlloc((HGLOBAL)_lpBuffer, cbNew,
  26.         GMEM_MOVEABLE | GMEM_ZEROINIT);
  27.     if (lpNew == NULL)
  28.         return FALSE;
  29.     _lpBuffer = (LPTSTR)lpNew;
  30.     _cb = cbNew;
  31.     return TRUE;
  32. }
  33. BUFFER::BUFFER( UINT cbInitial /* =0 */ )
  34.   : BUFFER_BASE(),
  35.     _lpBuffer( NULL )
  36. {
  37.     if (cbInitial)
  38.         Alloc( cbInitial );
  39. }
  40. BUFFER::~BUFFER()
  41. {
  42.     if (_lpBuffer != NULL) {
  43.         GlobalFree((HGLOBAL) _lpBuffer);
  44.         _lpBuffer = NULL;
  45.     }
  46. }
  47. BOOL BUFFER::Resize( UINT cbNew )
  48. {
  49.     BOOL fSuccess;
  50.     if (QuerySize() == 0)
  51.         fSuccess = Alloc( cbNew );
  52.     else {
  53.         fSuccess = Realloc( cbNew );
  54.     }
  55.     if (fSuccess)
  56.         _cb = cbNew;
  57.     return fSuccess;
  58. }
  59. RegEntry::RegEntry(const TCHAR *pszSubKey, HKEY hkey, REGSAM regsam)
  60. {
  61.     _error = RegCreateKeyEx(hkey, pszSubKey, 0, NULL, 0, regsam, NULL, &_hkey, NULL);
  62.     if (_error) {
  63.         bhkeyValid = FALSE;
  64.     }
  65.     else {
  66.         bhkeyValid = TRUE;
  67.     }
  68. }
  69. RegEntry::~RegEntry()
  70.     if (bhkeyValid) {
  71.         RegCloseKey(_hkey); 
  72.     }
  73. }
  74. long RegEntry::SetValue(const TCHAR *pszValue, const TCHAR *string)
  75. {
  76.     if (bhkeyValid) {
  77.         _error = RegSetValueEx(_hkey, pszValue, 0, REG_SZ,
  78.                     (LPBYTE)string, (lstrlen(string)+1)*sizeof(TCHAR));
  79.     }
  80.     return _error;
  81. }
  82. long RegEntry::SetValue(const TCHAR *pszValue, unsigned long dwNumber)
  83. {
  84.     if (bhkeyValid) {
  85.         _error = RegSetValueEx(_hkey, pszValue, 0, REG_BINARY,
  86.                     (LPBYTE)&dwNumber, sizeof(dwNumber));
  87.     }
  88.     return _error;
  89. }
  90. long RegEntry::DeleteValue(const TCHAR *pszValue)
  91. {
  92.     if (bhkeyValid) {
  93.         _error = RegDeleteValue(_hkey, (LPTSTR) pszValue);
  94.     }
  95.     return _error;
  96. }
  97. TCHAR *RegEntry::GetString(const TCHAR *pszValue, TCHAR *string, unsigned long length)
  98. {
  99.     DWORD     dwType;   
  100.     
  101.     if (bhkeyValid) {
  102.         _error = RegQueryValueEx(_hkey, (LPTSTR) pszValue, 0, &dwType, (LPBYTE)string,
  103.                     &length);
  104.     }
  105.     if (_error) {
  106.         *string = '';
  107.          return NULL;
  108.     }
  109.     return string;
  110. }
  111. long RegEntry::GetNumber(const TCHAR *pszValue, long dwDefault)
  112. {
  113.      DWORD     dwType;  
  114.      long    dwNumber = 0L;
  115.      DWORD    dwSize = sizeof(dwNumber);
  116.     if (bhkeyValid) {
  117.         _error = RegQueryValueEx(_hkey, (LPTSTR) pszValue, 0, &dwType, (LPBYTE)&dwNumber,
  118.                     &dwSize);
  119.     }
  120.     if (_error)
  121.         dwNumber = dwDefault;
  122.     
  123.     return dwNumber;
  124. }
  125. long RegEntry::MoveToSubKey(const TCHAR *pszSubKeyName)
  126. {
  127.     HKEY    _hNewKey;
  128.     if (bhkeyValid) {
  129.         _error = RegOpenKeyEx ( _hkey,
  130.                                 pszSubKeyName,
  131.                                 0,
  132.                                 KEY_READ|KEY_WRITE,
  133.                                 &_hNewKey );
  134.         if (_error == ERROR_SUCCESS) {
  135.             RegCloseKey(_hkey);
  136.             _hkey = _hNewKey;
  137.         }
  138.     }
  139.     return _error;
  140. }
  141. long RegEntry::FlushKey()
  142. {
  143.     if (bhkeyValid) {
  144.         _error = RegFlushKey(_hkey);
  145.     }
  146.     return _error;
  147. }
  148. RegEnumValues::RegEnumValues(RegEntry *pReqRegEntry)
  149.  : pRegEntry(pReqRegEntry),
  150.    iEnum(0),
  151.    pchName(NULL),
  152.    pbValue(NULL)
  153. {
  154.     _error = pRegEntry->GetError();
  155.     if (_error == ERROR_SUCCESS) {
  156.         _error = RegQueryInfoKey ( pRegEntry->GetKey(), // Key
  157.                                    NULL,                // Buffer for class string
  158.                                    NULL,                // Size of class string buffer
  159.                                    NULL,                // Reserved
  160.                                    NULL,                // Number of subkeys
  161.                                    NULL,                // Longest subkey name
  162.                                    NULL,                // Longest class string
  163.                                    &cEntries,           // Number of value entries
  164.                                    &cMaxValueName,      // Longest value name
  165.                                    &cMaxData,           // Longest value data
  166.                                    NULL,                // Security descriptor
  167.                                    NULL );              // Last write time
  168.     }
  169.     if (_error == ERROR_SUCCESS) {
  170.         if (cEntries != 0) {
  171.             cMaxValueName = cMaxValueName + 1; // REG_SZ needs one more for null
  172.             cMaxData = cMaxData + 1;           // REG_SZ needs one more for null
  173.             pchName = new TCHAR[cMaxValueName];
  174.             if (!pchName) {
  175.                 _error = ERROR_NOT_ENOUGH_MEMORY;
  176.             }
  177.             else {
  178.                 if (cMaxData) {
  179.                     pbValue = new BYTE[cMaxData];
  180.                     if (!pbValue) {
  181.                         _error = ERROR_NOT_ENOUGH_MEMORY;
  182.                     }
  183.                 }
  184.             }
  185.         }
  186.     }
  187. }
  188. RegEnumValues::~RegEnumValues()
  189. {
  190.     delete pchName;
  191.     delete pbValue;
  192. }
  193. long RegEnumValues::Next()
  194. {
  195.     if (_error != ERROR_SUCCESS) {
  196.         return _error;
  197.     }
  198.     if (cEntries == iEnum) {
  199.         return ERROR_NO_MORE_ITEMS;
  200.     }
  201.     DWORD   cchName = cMaxValueName;
  202.     dwDataLength = cMaxData;
  203.     _error = RegEnumValue ( pRegEntry->GetKey(), // Key
  204.                             iEnum,               // Index of value
  205.                             pchName,             // Address of buffer for value name
  206.                             &cchName,            // Address for size of buffer
  207.                             NULL,                // Reserved
  208.                             &dwType,             // Data type
  209.                             pbValue,             // Address of buffer for value data
  210.                             &dwDataLength );     // Address for size of data
  211.     iEnum++;
  212.     return _error;
  213. }
  214. int __cdecl _purecall(void)
  215. {
  216.    return(0);
  217. }
  218. void * _cdecl operator new(size_t size)
  219. {
  220.     return (void *)::GlobalAlloc(GPTR,size); 
  221. }
  222. void _cdecl operator delete(void *ptr)
  223. {
  224.     GlobalFree(ptr);
  225. }
  226. //////////////////////////////////////////////////////////////////////////////
  227. //
  228. //  CAccessibleWrapper implementation
  229. //
  230. //////////////////////////////////////////////////////////////////////////////
  231. CAccessibleWrapper::CAccessibleWrapper( IAccessible * pAcc )
  232.     : m_ref( 1 ),
  233.       m_pAcc( pAcc ),
  234.       m_pEnumVar( NULL ),
  235.       m_pOleWin( NULL )
  236. {
  237.     m_pAcc->AddRef();
  238. }
  239. CAccessibleWrapper::~CAccessibleWrapper()
  240. {
  241.     m_pAcc->Release();
  242.     if( m_pEnumVar )
  243.         m_pEnumVar->Release();
  244.     if( m_pOleWin )
  245.         m_pOleWin->Release();
  246. }
  247. // IUnknown
  248. // Implement refcounting ourselves
  249. // Also implement QI ourselves, so that we return a ptr back to the wrapper.
  250. STDMETHODIMP  CAccessibleWrapper::QueryInterface(REFIID riid, void** ppv)
  251. {
  252.     HRESULT hr;
  253.     *ppv = NULL;
  254.     if ((riid == IID_IUnknown)  ||
  255.         (riid == IID_IDispatch) ||
  256.         (riid == IID_IAccessible))
  257.     {
  258.         *ppv = (IAccessible *) this;
  259.     }
  260.     else if( riid == IID_IEnumVARIANT )
  261.     {
  262.         // Get the IEnumVariant from the object we are sub-classing so we can delegate
  263.         // calls.
  264.         if( ! m_pEnumVar )
  265.         {
  266.             hr = m_pAcc->QueryInterface( IID_IEnumVARIANT, (void **) & m_pEnumVar );
  267.             if( FAILED( hr ) )
  268.             {
  269.                 m_pEnumVar = NULL;
  270.                 return hr;
  271.             }
  272.             // Paranoia (in case QI returns S_OK with NULL...)
  273.             if( ! m_pEnumVar )
  274.                 return E_NOINTERFACE;
  275.         }
  276.         *ppv = (IEnumVARIANT *) this;
  277.     }
  278.     else if( riid == IID_IOleWindow )
  279.     {
  280.         // Get the IOleWindow from the object we are sub-classing so we can delegate
  281.         // calls.
  282.         if( ! m_pOleWin )
  283.         {
  284.             hr = m_pAcc->QueryInterface( IID_IOleWindow, (void **) & m_pOleWin );
  285.             if( FAILED( hr ) )
  286.             {
  287.                 m_pOleWin = NULL;
  288.                 return hr;
  289.             }
  290.             // Paranoia (in case QI returns S_OK with NULL...)
  291.             if( ! m_pOleWin )
  292.                 return E_NOINTERFACE;
  293.         }
  294.         *ppv = (IOleWindow*) this;
  295.     }
  296.     else
  297.         return(E_NOINTERFACE);
  298.     AddRef();
  299.     return(NOERROR);
  300. }
  301. STDMETHODIMP_(ULONG) CAccessibleWrapper::AddRef()
  302. {
  303.     return ++m_ref;
  304. }
  305. STDMETHODIMP_(ULONG) CAccessibleWrapper::Release()
  306. {
  307.     ULONG ulRet = --m_ref;
  308.     if( ulRet == 0 )
  309.         delete this;
  310.     return ulRet;
  311. }
  312. // IDispatch
  313. // - pass all through m_pAcc
  314. STDMETHODIMP  CAccessibleWrapper::GetTypeInfoCount(UINT* pctinfo)
  315. {
  316.     return m_pAcc->GetTypeInfoCount(pctinfo);
  317. }
  318. STDMETHODIMP  CAccessibleWrapper::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
  319. {
  320.     return m_pAcc->GetTypeInfo(itinfo, lcid, pptinfo);
  321. }
  322. STDMETHODIMP  CAccessibleWrapper::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames,
  323.             LCID lcid, DISPID* rgdispid)
  324. {
  325.     return m_pAcc->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
  326. }
  327. STDMETHODIMP  CAccessibleWrapper::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
  328.             DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo,
  329.             UINT* puArgErr)
  330. {
  331.     return m_pAcc->Invoke(dispidMember, riid, lcid, wFlags,
  332.             pdispparams, pvarResult, pexcepinfo,
  333.             puArgErr);
  334. }
  335. // IAccessible
  336. // - pass all through m_pAcc
  337. STDMETHODIMP  CAccessibleWrapper::get_accParent(IDispatch ** ppdispParent)
  338. {
  339.     return m_pAcc->get_accParent(ppdispParent);
  340. }
  341. STDMETHODIMP  CAccessibleWrapper::get_accChildCount(long* pChildCount)
  342. {
  343.     return m_pAcc->get_accChildCount(pChildCount);
  344. }
  345. STDMETHODIMP  CAccessibleWrapper::get_accChild(VARIANT varChild, IDispatch ** ppdispChild)
  346. {
  347.     return m_pAcc->get_accChild(varChild, ppdispChild);
  348. }
  349. STDMETHODIMP  CAccessibleWrapper::get_accName(VARIANT varChild, BSTR* pszName)
  350. {
  351.     return m_pAcc->get_accName(varChild, pszName);
  352. }
  353. STDMETHODIMP  CAccessibleWrapper::get_accValue(VARIANT varChild, BSTR* pszValue)
  354. {
  355.     return m_pAcc->get_accValue(varChild, pszValue);
  356. }
  357. STDMETHODIMP  CAccessibleWrapper::get_accDescription(VARIANT varChild, BSTR* pszDescription)
  358. {
  359.     return m_pAcc->get_accDescription(varChild, pszDescription);
  360. }
  361. STDMETHODIMP  CAccessibleWrapper::get_accRole(VARIANT varChild, VARIANT *pvarRole)
  362. {
  363.     return m_pAcc->get_accRole(varChild, pvarRole);
  364. }
  365. STDMETHODIMP  CAccessibleWrapper::get_accState(VARIANT varChild, VARIANT *pvarState)
  366. {
  367.     return m_pAcc->get_accState(varChild, pvarState);
  368. }
  369. STDMETHODIMP  CAccessibleWrapper::get_accHelp(VARIANT varChild, BSTR* pszHelp)
  370. {
  371.     return m_pAcc->get_accHelp(varChild, pszHelp);
  372. }
  373. STDMETHODIMP  CAccessibleWrapper::get_accHelpTopic(BSTR* pszHelpFile, VARIANT varChild, long* pidTopic)
  374. {
  375.     return m_pAcc->get_accHelpTopic(pszHelpFile, varChild, pidTopic);
  376. }
  377. STDMETHODIMP  CAccessibleWrapper::get_accKeyboardShortcut(VARIANT varChild, BSTR* pszKeyboardShortcut)
  378. {
  379.     return m_pAcc->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
  380. }
  381. STDMETHODIMP  CAccessibleWrapper::get_accFocus(VARIANT * pvarFocusChild)
  382. {
  383.     return m_pAcc->get_accFocus(pvarFocusChild);
  384. }
  385. STDMETHODIMP  CAccessibleWrapper::get_accSelection(VARIANT * pvarSelectedChildren)
  386. {
  387.     return m_pAcc->get_accSelection(pvarSelectedChildren);
  388. }
  389. STDMETHODIMP  CAccessibleWrapper::get_accDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
  390. {
  391.     return m_pAcc->get_accDefaultAction(varChild, pszDefaultAction);
  392. }
  393. STDMETHODIMP  CAccessibleWrapper::accSelect(long flagsSel, VARIANT varChild)
  394. {
  395.     return m_pAcc->accSelect(flagsSel, varChild);
  396. }
  397. STDMETHODIMP  CAccessibleWrapper::accLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
  398. {
  399.     return m_pAcc->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild);
  400. }
  401. STDMETHODIMP  CAccessibleWrapper::accNavigate(long navDir, VARIANT varStart, VARIANT * pvarEndUpAt)
  402. {
  403.     return m_pAcc->accNavigate(navDir, varStart, pvarEndUpAt);
  404. }
  405. STDMETHODIMP  CAccessibleWrapper::accHitTest(long xLeft, long yTop, VARIANT * pvarChildAtPoint)
  406. {
  407.     return m_pAcc->accHitTest(xLeft, yTop, pvarChildAtPoint);
  408. }
  409. STDMETHODIMP  CAccessibleWrapper::accDoDefaultAction(VARIANT varChild)
  410. {
  411.     return m_pAcc->accDoDefaultAction(varChild);
  412. }
  413. STDMETHODIMP  CAccessibleWrapper::put_accName(VARIANT varChild, BSTR szName)
  414. {
  415.     return m_pAcc->put_accName(varChild, szName);
  416. }
  417. STDMETHODIMP  CAccessibleWrapper::put_accValue(VARIANT varChild, BSTR pszValue)
  418. {
  419.     return m_pAcc->put_accValue(varChild, pszValue);
  420. }
  421. // IEnumVARIANT
  422. // - pass all through m_pEnumVar
  423. STDMETHODIMP  CAccessibleWrapper::Next(ULONG celt, VARIANT* rgvar, ULONG * pceltFetched)
  424. {
  425.     return m_pEnumVar->Next(celt, rgvar, pceltFetched);
  426. }
  427. STDMETHODIMP  CAccessibleWrapper::Skip(ULONG celt)
  428. {
  429.     return m_pEnumVar->Skip(celt);
  430. }
  431. STDMETHODIMP  CAccessibleWrapper::Reset()
  432. {
  433.     return m_pEnumVar->Reset();
  434. }
  435. STDMETHODIMP  CAccessibleWrapper::Clone(IEnumVARIANT ** ppenum)
  436. {
  437.     return m_pEnumVar->Clone(ppenum);
  438. }
  439. // IOleWindow
  440. // - pass all through m_pOleWin
  441. STDMETHODIMP  CAccessibleWrapper::GetWindow(HWND* phwnd)
  442. {
  443.     return m_pOleWin->GetWindow(phwnd);
  444. }
  445. STDMETHODIMP  CAccessibleWrapper::ContextSensitiveHelp(BOOL fEnterMode)
  446. {
  447.     return m_pOleWin->ContextSensitiveHelp(fEnterMode);
  448. }