Leaked source code of windows server 2003
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.

104 lines
2.5 KiB

  1. /*****************************************************************************\
  2. FILE: util.cpp
  3. DESCRIPTION:
  4. Shared stuff that operates on all classes.
  5. BryanSt 5/30/2000
  6. Copyright (C) Microsoft Corp 2000-2000. All rights reserved.
  7. \*****************************************************************************/
  8. #include "precomp.h"
  9. #pragma hdrstop
  10. #include "util.h"
  11. BOOL IUnknown_CompareCLSID(IN IUnknown * punk, IN CLSID clsid)
  12. {
  13. BOOL fIsEqual = FALSE;
  14. if (punk)
  15. {
  16. CLSID clsidPageID;
  17. HRESULT hr = IUnknown_GetClassID(punk, &clsidPageID);
  18. if (SUCCEEDED(hr) && IsEqualCLSID(clsidPageID, clsid))
  19. {
  20. fIsEqual = TRUE;
  21. }
  22. }
  23. return fIsEqual;
  24. }
  25. HRESULT IEnumUnknown_FindCLSID(IN IUnknown * punk, IN CLSID clsid, OUT IUnknown ** ppunkFound)
  26. {
  27. HRESULT hr = E_INVALIDARG;
  28. if (punk && ppunkFound)
  29. {
  30. IEnumUnknown * pEnum;
  31. *ppunkFound = NULL;
  32. hr = punk->QueryInterface(IID_PPV_ARG(IEnumUnknown, &pEnum));
  33. if (SUCCEEDED(hr))
  34. {
  35. IUnknown * punkToTry;
  36. ULONG ulFetched;
  37. while (SUCCEEDED(pEnum->Next(1, &punkToTry, &ulFetched)) &&
  38. (1 == ulFetched))
  39. {
  40. if (IUnknown_CompareCLSID(punkToTry, clsid))
  41. {
  42. *ppunkFound = punkToTry;
  43. break;
  44. }
  45. punkToTry->Release();
  46. }
  47. pEnum->Release();
  48. }
  49. }
  50. return hr;
  51. }
  52. HRESULT GetPageByCLSID(IUnknown * punkSite, const GUID * pClsid, IPropertyBag ** ppPropertyBag)
  53. {
  54. HRESULT hr = E_FAIL;
  55. *ppPropertyBag = NULL;
  56. if (punkSite)
  57. {
  58. IThemeUIPages * pThemeUI;
  59. hr = punkSite->QueryInterface(IID_PPV_ARG(IThemeUIPages, &pThemeUI));
  60. if (SUCCEEDED(hr))
  61. {
  62. IEnumUnknown * pEnumUnknown;
  63. hr = pThemeUI->GetBasePagesEnum(&pEnumUnknown);
  64. if (SUCCEEDED(hr))
  65. {
  66. IUnknown * punk;
  67. // This may not exit due to policy
  68. hr = IEnumUnknown_FindCLSID(pEnumUnknown, *pClsid, &punk);
  69. if (SUCCEEDED(hr))
  70. {
  71. hr = punk->QueryInterface(IID_PPV_ARG(IPropertyBag, ppPropertyBag));
  72. punk->Release();
  73. }
  74. pEnumUnknown->Release();
  75. }
  76. pThemeUI->Release();
  77. }
  78. }
  79. return hr;
  80. }