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

Windows Kernel

Development Platform:

Visual C++

  1. //*******************************************************************************************
  2. //
  3. // Filename : Icon.cpp
  4. //
  5. // Implementation file for CCabItemIcon
  6. //
  7. // Copyright (c) 1994 - 1996 Microsoft Corporation. All rights reserved
  8. //
  9. //*******************************************************************************************
  10. #include "pch.h"
  11. #include "thisdll.h"
  12. #include "icon.h"
  13. // *** IUnknown methods ***
  14. STDMETHODIMP CCabItemIcon::QueryInterface(
  15.    REFIID riid, 
  16.    LPVOID FAR* ppvObj)
  17. {
  18. *ppvObj = NULL;
  19. LPUNKNOWN pObj;
  20.  
  21. if (riid == IID_IUnknown)
  22. {
  23. pObj = (LPUNKNOWN)((IExtractIcon*)this); 
  24. }
  25. else if (riid == IID_IExtractIcon)
  26. {
  27. pObj = (LPUNKNOWN)((IExtractIcon*)this); 
  28. }
  29. else
  30. {
  31.     return(E_NOINTERFACE);
  32. }
  33. pObj->AddRef();
  34. *ppvObj = (LPVOID)pObj;
  35. return(NOERROR);
  36. }
  37. STDMETHODIMP_(ULONG) CCabItemIcon::AddRef(void)
  38. {
  39. return(m_cRef.AddRef());
  40. }
  41. STDMETHODIMP_(ULONG) CCabItemIcon::Release(void)
  42. {
  43. if (!m_cRef.Release())
  44. {
  45.     delete this;
  46. return(0);
  47. }
  48. return(m_cRef.GetRef());
  49. }
  50. const TCHAR c_szCabViewLoc[] = TEXT("CABVIEW::");
  51. // *** IExtractIcon methods ***
  52. STDMETHODIMP CCabItemIcon::GetIconLocation(
  53. UINT   uFlags,
  54. LPTSTR szIconFile,
  55. UINT   cchMax,
  56. int   * piIndex,
  57. UINT  * pwFlags)
  58. {
  59. LPCTSTR pszExt = PathFindExtension(m_szName);
  60. if (!pszExt || !pszExt[0])
  61. {
  62. return(E_UNEXPECTED);
  63. }
  64. TCHAR szClass[80];
  65. // NOTE: lLen is size in bytes - not characters!
  66. LONG lLen = sizeof(szClass);
  67. if (RegQueryValue(HKEY_CLASSES_ROOT, pszExt, szClass, &lLen) != ERROR_SUCCESS)
  68. {
  69. // This extension has no icon
  70. return(E_UNEXPECTED);
  71. }
  72. if (cchMax < ARRAYSIZE(c_szCabViewLoc) + lstrlen(pszExt))
  73. {
  74. return(E_INVALIDARG);
  75. }
  76. lstrcpy(szIconFile, c_szCabViewLoc);
  77. lstrcpy(szIconFile+(ARRAYSIZE(c_szCabViewLoc)-1), pszExt);
  78. CharUpper(szIconFile);
  79. *piIndex = uFlags&GIL_OPENICON ? 1 : 0;
  80. *pwFlags = GIL_PERCLASS | GIL_NOTFILENAME;
  81. return(NOERROR);
  82. }
  83. STDMETHODIMP CCabItemIcon::Extract(
  84. LPCTSTR  pszFile,
  85. UINT  nIconIndex,
  86. HICON   *phiconLarge,
  87. HICON   *phiconSmall,
  88. UINT     nIconSize)
  89. {
  90. UINT uFlags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
  91. switch (nIconIndex)
  92. {
  93. case 0:
  94. break;
  95. case 1:
  96. uFlags |= SHGFI_OPENICON;
  97. break;
  98. default:
  99. return(E_INVALIDARG);
  100. }
  101. TCHAR szExt[ARRAYSIZE(c_szCabViewLoc) + 5];
  102. lstrcpyn(szExt, pszFile, ARRAYSIZE(szExt));
  103. szExt[ARRAYSIZE(c_szCabViewLoc)-1] = TEXT('');
  104. if (lstrcmp(szExt, c_szCabViewLoc) != 0)
  105. {
  106. return(E_INVALIDARG);
  107. }
  108. lstrcpyn(szExt, pszFile+(ARRAYSIZE(c_szCabViewLoc)-1), ARRAYSIZE(szExt));
  109. LPTSTR pszExt = PathFindExtension(m_szName);
  110. if (lstrcmpi(szExt, pszExt) != 0)
  111. {
  112. return(E_INVALIDARG);
  113. }
  114. SHFILEINFO sfi;
  115. if (!SHGetFileInfo(m_szName, 0, &sfi, sizeof(sfi), uFlags | SHGFI_LARGEICON))
  116. {
  117. return(E_UNEXPECTED);
  118. }
  119. *phiconLarge = sfi.hIcon;
  120. if (SHGetFileInfo(m_szName, 0, &sfi, sizeof(sfi), uFlags | SHGFI_SMALLICON))
  121. {
  122. *phiconSmall = sfi.hIcon;
  123. }
  124. else
  125. {
  126. *phiconSmall = NULL;
  127. }
  128. return(S_OK);
  129. }