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.

120 lines
3.4 KiB

  1. ////////////////////////////////////////////////////////////////////////
  2. //
  3. // CExtractIcon
  4. //
  5. // IExtractIcon implementation
  6. //
  7. ////////////////////////////////////////////////////////////////////////
  8. #include "pch.hxx"
  9. #include "cexticon.h"
  10. CExtractIcon::CExtractIcon(int iIcon, int iIconOpen, UINT uFlags, LPSTR szModule)
  11. {
  12. DOUT("CExtractIcon::CExtractIcon");
  13. m_cRef = 1;
  14. m_iIcon = iIcon;
  15. m_iIconOpen = iIconOpen;
  16. m_uFlags = uFlags;
  17. if (szModule)
  18. StrCpyN(m_szModule, szModule, ARRAYSIZE(m_szModule));
  19. else
  20. GetModuleFileName(g_hInst, m_szModule, sizeof(m_szModule)/sizeof(char));
  21. }
  22. CExtractIcon::~CExtractIcon()
  23. {
  24. }
  25. ////////////////////////////////////////////////////////////////////////
  26. //
  27. // IUnknown
  28. //
  29. ////////////////////////////////////////////////////////////////////////
  30. HRESULT STDMETHODCALLTYPE CExtractIcon::QueryInterface(REFIID riid, void **ppvObject)
  31. {
  32. if (IsEqualIID(riid, IID_IUnknown))
  33. {
  34. *ppvObject = (void *)this;
  35. }
  36. else if (IsEqualIID(riid, IID_IExtractIconA))
  37. {
  38. *ppvObject = (IExtractIconA *)this;
  39. }
  40. else if (IsEqualIID(riid, IID_IExtractIconW))
  41. {
  42. *ppvObject = (IExtractIconW *)this;
  43. }
  44. else
  45. {
  46. *ppvObject = NULL;
  47. return E_NOINTERFACE;
  48. }
  49. m_cRef++;
  50. return NOERROR;
  51. }
  52. ULONG STDMETHODCALLTYPE CExtractIcon::AddRef(void)
  53. {
  54. DOUT("CExtractIcon::AddRef() ==> %d", m_cRef+1);
  55. return ++m_cRef;
  56. }
  57. ULONG STDMETHODCALLTYPE CExtractIcon::Release(void)
  58. {
  59. DOUT("CExtractIcon::Release() ==> %d", m_cRef-1);
  60. if (--m_cRef==0)
  61. {
  62. delete this;
  63. return 0;
  64. }
  65. else
  66. return m_cRef;
  67. }
  68. ////////////////////////////////////////////////////////////////////////
  69. //
  70. // IExtractIconA
  71. //
  72. ////////////////////////////////////////////////////////////////////////
  73. HRESULT STDMETHODCALLTYPE CExtractIcon::GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax,
  74. int *piIndex, UINT *pwFlags)
  75. {
  76. StrCpyN(szIconFile, m_szModule, cchMax);
  77. *piIndex = (uFlags & GIL_OPENICON) ? m_iIconOpen : m_iIcon;
  78. *pwFlags = m_uFlags;
  79. return NOERROR;
  80. }
  81. HRESULT STDMETHODCALLTYPE CExtractIcon::Extract(LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge,
  82. HICON *phiconSmall, UINT nIcons)
  83. {
  84. // let the explorer extract the icon
  85. return S_FALSE;
  86. }
  87. #ifndef WIN16 // WIN16FF
  88. ////////////////////////////////////////////////////////////////////////
  89. //
  90. // IExtractIconW
  91. //
  92. ////////////////////////////////////////////////////////////////////////
  93. HRESULT STDMETHODCALLTYPE CExtractIcon::GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax,
  94. int *piIndex, UINT *pwFlags)
  95. {
  96. MultiByteToWideChar(CP_ACP, 0, m_szModule, -1, szIconFile, cchMax);
  97. *piIndex = (uFlags & GIL_OPENICON) ? m_iIconOpen : m_iIcon;
  98. *pwFlags = m_uFlags;
  99. return NOERROR;
  100. }
  101. HRESULT STDMETHODCALLTYPE CExtractIcon::Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge,
  102. HICON *phiconSmall, UINT nIcons)
  103. {
  104. // let the explorer extract the icon
  105. return S_FALSE;
  106. }
  107. #endif // !WIN16