Bug 1348177 - Part 1. Remove GetProcAddress for shell32 to use Vista+ API (image part). r?tnikkel draft
authorMakoto Kato <m_kato@ga2.so-net.ne.jp>
Fri, 17 Mar 2017 13:26:57 +0900
changeset 500378 32b95c5a28f35167f64b3882fb0208544dadfa62
parent 500240 39607304b774591fa6e32c4b06158d869483c312
child 500379 ff9abe9fe2dc33654b72d3df1bb109a2bb92eab8
child 500381 c8c288b15068ec93464216951f05f582945609fb
push id49709
push userm_kato@ga2.so-net.ne.jp
push dateFri, 17 Mar 2017 04:55:12 +0000
reviewerstnikkel
bugs1348177
milestone55.0a1
Bug 1348177 - Part 1. Remove GetProcAddress for shell32 to use Vista+ API (image part). r?tnikkel Since we drop XP support, it is unnecessary to use SHGetStockIconInfo via LoadLibrary. MozReview-Commit-ID: 4lvhVObHv5U
image/decoders/icon/win/nsIconChannel.cpp
--- a/image/decoders/icon/win/nsIconChannel.cpp
+++ b/image/decoders/icon/win/nsIconChannel.cpp
@@ -24,21 +24,16 @@
 #include "nsIFileURL.h"
 #include "nsIMIMEService.h"
 #include "nsCExternalHandlerService.h"
 #include "nsDirectoryServiceDefs.h"
 #include "nsProxyRelease.h"
 #include "nsContentSecurityManager.h"
 #include "nsContentUtils.h"
 
-#ifdef _WIN32_WINNT
-#undef _WIN32_WINNT
-#endif
-#define _WIN32_WINNT 0x0600
-
 // we need windows.h to read out registry information...
 #include <windows.h>
 #include <shellapi.h>
 #include <shlobj.h>
 #include <objbase.h>
 #include <wchar.h>
 
 using namespace mozilla;
@@ -419,51 +414,37 @@ nsIconChannel::GetHIconFromFile(HICON* h
 }
 
 nsresult
 nsIconChannel::GetStockHIcon(nsIMozIconURI* aIconURI,
                                       HICON* hIcon)
 {
   nsresult rv = NS_OK;
 
-  // We can only do this on Vista or above
-  HMODULE hShellDLL = ::LoadLibraryW(L"shell32.dll");
-  decltype(SHGetStockIconInfo)* pSHGetStockIconInfo =
-    (decltype(SHGetStockIconInfo)*) ::GetProcAddress(hShellDLL,
-                                                    "SHGetStockIconInfo");
-
-  if (pSHGetStockIconInfo) {
-    uint32_t desiredImageSize;
-    aIconURI->GetImageSize(&desiredImageSize);
-    nsAutoCString stockIcon;
-    aIconURI->GetStockIcon(stockIcon);
+  uint32_t desiredImageSize;
+  aIconURI->GetImageSize(&desiredImageSize);
+  nsAutoCString stockIcon;
+  aIconURI->GetStockIcon(stockIcon);
 
-    SHSTOCKICONID stockIconID = GetStockIconIDForName(stockIcon);
-    if (stockIconID == SIID_INVALID) {
-      return NS_ERROR_NOT_AVAILABLE;
-    }
-
-    UINT infoFlags = SHGSI_ICON;
-    infoFlags |= GetSizeInfoFlag(desiredImageSize);
-
-    SHSTOCKICONINFO sii = {0};
-    sii.cbSize = sizeof(sii);
-    HRESULT hr = pSHGetStockIconInfo(stockIconID, infoFlags, &sii);
-
-    if (SUCCEEDED(hr)) {
-      *hIcon = sii.hIcon;
-    } else {
-      rv = NS_ERROR_FAILURE;
-    }
-  } else {
-    rv = NS_ERROR_NOT_AVAILABLE;
+  SHSTOCKICONID stockIconID = GetStockIconIDForName(stockIcon);
+  if (stockIconID == SIID_INVALID) {
+    return NS_ERROR_NOT_AVAILABLE;
   }
 
-  if (hShellDLL) {
-    ::FreeLibrary(hShellDLL);
+  UINT infoFlags = SHGSI_ICON;
+  infoFlags |= GetSizeInfoFlag(desiredImageSize);
+
+  SHSTOCKICONINFO sii = {0};
+  sii.cbSize = sizeof(sii);
+  HRESULT hr = SHGetStockIconInfo(stockIconID, infoFlags, &sii);
+
+  if (SUCCEEDED(hr)) {
+    *hIcon = sii.hIcon;
+  } else {
+    rv = NS_ERROR_FAILURE;
   }
 
   return rv;
 }
 
 // Given a BITMAPINFOHEADER, returns the size of the color table.
 static int
 GetColorTableSize(BITMAPINFOHEADER* aHeader)