Bug 1348177 - Part 3. Remove GetProcAddress for shell32 to use Vista+/7+ API (widget part). r?jimm draft
authorMakoto Kato <m_kato@ga2.so-net.ne.jp>
Fri, 17 Mar 2017 11:05:04 +0900
changeset 500382 35bbff22d7000e2aed19a5fb1f48138960bc07e8
parent 500381 c8c288b15068ec93464216951f05f582945609fb
child 549625 d0a73619f81441ae557506e0b97fd36fb935dc13
push id49710
push userm_kato@ga2.so-net.ne.jp
push dateFri, 17 Mar 2017 04:59:10 +0000
reviewersjimm
bugs1348177
milestone55.0a1
Bug 1348177 - Part 3. Remove GetProcAddress for shell32 to use Vista+/7+ API (widget part). r?jimm It is unnecessary to use Vista/7+ API via GetProcAddress MozReview-Commit-ID: ELxCJev2jaZ
widget/windows/WinTaskbar.cpp
--- a/widget/windows/WinTaskbar.cpp
+++ b/widget/windows/WinTaskbar.cpp
@@ -28,18 +28,16 @@
 #include "nsPIDOMWindow.h"
 #include "nsAppDirectoryServiceDefs.h"
 #include "mozilla/Preferences.h"
 #include <io.h>
 #include <propvarutil.h>
 #include <propkey.h>
 #include <shellapi.h>
 
-const wchar_t kShellLibraryName[] =  L"shell32.dll";
-
 static NS_DEFINE_CID(kJumpListBuilderCID, NS_WIN_JUMPLISTBUILDER_CID);
 
 namespace {
 
 HWND
 GetHWNDFromDocShell(nsIDocShell *aShell) {
   nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(reinterpret_cast<nsISupports*>(aShell)));
 
@@ -71,52 +69,34 @@ SetWindowAppUserModelProp(mozIDOMWindow 
   if (aIdentifier.IsEmpty())
     return NS_ERROR_INVALID_ARG;
 
   HWND toplevelHWND = ::GetAncestor(GetHWNDFromDOMWindow(aParent), GA_ROOT);
 
   if (!toplevelHWND)
     return NS_ERROR_INVALID_ARG;
 
-  typedef HRESULT (WINAPI * SHGetPropertyStoreForWindowPtr)
-                    (HWND hwnd, REFIID riid, void** ppv);
-  SHGetPropertyStoreForWindowPtr funcGetProStore = nullptr;
-
-  HMODULE hDLL = ::LoadLibraryW(kShellLibraryName);
-  funcGetProStore = (SHGetPropertyStoreForWindowPtr)
-    GetProcAddress(hDLL, "SHGetPropertyStoreForWindow");
-
-  if (!funcGetProStore) {
-    FreeLibrary(hDLL);
-    return NS_ERROR_NO_INTERFACE;
-  }
-
-  IPropertyStore* pPropStore;
-  if (FAILED(funcGetProStore(toplevelHWND,
-                             IID_PPV_ARGS(&pPropStore)))) {
-    FreeLibrary(hDLL);
+  RefPtr<IPropertyStore> pPropStore;
+  if (FAILED(SHGetPropertyStoreForWindow(toplevelHWND, IID_IPropertyStore,
+                                         getter_AddRefs(pPropStore)))) {
     return NS_ERROR_INVALID_ARG;
   }
 
   PROPVARIANT pv;
   if (FAILED(InitPropVariantFromString(aIdentifier.get(), &pv))) {
-    pPropStore->Release();
-    FreeLibrary(hDLL);
     return NS_ERROR_UNEXPECTED;
   }
 
   nsresult rv = NS_OK;
   if (FAILED(pPropStore->SetValue(PKEY_AppUserModel_ID, pv)) ||
       FAILED(pPropStore->Commit())) {
     rv = NS_ERROR_FAILURE;
   }
 
   PropVariantClear(&pv);
-  pPropStore->Release();
-  FreeLibrary(hDLL);
 
   return rv;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 // default nsITaskbarPreviewController
 
 class DefaultController final : public nsITaskbarPreviewController
@@ -333,40 +313,21 @@ WinTaskbar::GetDefaultGroupId(nsAString 
     return NS_ERROR_UNEXPECTED;
 
   return NS_OK;
 }
 
 // (static) Called from AppShell
 bool
 WinTaskbar::RegisterAppUserModelID() {
-  SetCurrentProcessExplicitAppUserModelIDPtr funcAppUserModelID = nullptr;
-  bool retVal = false;
-
   nsAutoString uid;
   if (!GetAppUserModelID(uid))
     return false;
 
-  HMODULE hDLL = ::LoadLibraryW(kShellLibraryName);
-
-  funcAppUserModelID = (SetCurrentProcessExplicitAppUserModelIDPtr)
-                        GetProcAddress(hDLL, "SetCurrentProcessExplicitAppUserModelID");
-
-  if (!funcAppUserModelID) {
-    ::FreeLibrary(hDLL);
-    return false;
-  }
-
-  if (SUCCEEDED(funcAppUserModelID(uid.get())))
-    retVal = true;
-
-  if (hDLL)
-    ::FreeLibrary(hDLL);
-
-  return retVal;
+  return SUCCEEDED(SetCurrentProcessExplicitAppUserModelID(uid.get()));
 }
 
 NS_IMETHODIMP
 WinTaskbar::GetAvailable(bool *aAvailable) {
   // ITaskbarList4::HrInit() may fail with shell extensions like blackbox
   // installed. Initialize early to return available=false in those cases.
   *aAvailable = Initialize();