Bug 932100 - Part 1: Remove load-time dependency on user32. r=bsmedberg
authorDavid Major <dmajor@mozilla.com>
Tue, 12 Nov 2013 08:31:32 -0500 (2013-11-12)
changeset 154562 49671f1df4dad302d3aa5f624a52ce6790197fc6
parent 154561 38bcddde0516d9826686d1caadab0188655cd4ba
child 154563 33c8facd04680320804f1f377818250c3162d220
push id25649
push userryanvm@gmail.com
push dateTue, 12 Nov 2013 20:24:15 +0000 (2013-11-12)
treeherdermozilla-central@0b4b1330fafa [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbsmedberg
bugs932100
milestone28.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 932100 - Part 1: Remove load-time dependency on user32. r=bsmedberg
browser/app/nsBrowserApp.cpp
--- a/browser/app/nsBrowserApp.cpp
+++ b/browser/app/nsBrowserApp.cpp
@@ -73,19 +73,29 @@ static void Output(const char *fmt, ... 
                       0,
                       msg,
                       -1,
                       wide_msg,
                       _countof(wide_msg));
 #if MOZ_WINCONSOLE
   fwprintf_s(stderr, wide_msg);
 #else
-  MessageBoxW(nullptr, wide_msg, L"Firefox", MB_OK
-                                           | MB_ICONERROR
-                                           | MB_SETFOREGROUND);
+  // Linking user32 at load-time interferes with the DLL blocklist (bug 932100).
+  // This is a rare codepath, so we can load user32 at run-time instead.
+  HMODULE user32 = LoadLibraryW(L"user32.dll");
+  if (user32) {
+    typedef int (WINAPI * MessageBoxWFn)(HWND, LPCWSTR, LPCWSTR, UINT);
+    MessageBoxWFn messageBoxW = (MessageBoxWFn)GetProcAddress(user32, "MessageBoxW");
+    if (messageBoxW) {
+      messageBoxW(nullptr, wide_msg, L"Firefox", MB_OK
+                                               | MB_ICONERROR
+                                               | MB_SETFOREGROUND);
+    }
+    FreeLibrary(user32);
+  }
 #endif
 #endif
 
   va_end(ap);
 }
 
 /**
  * Return true if |arg| matches the given argument name.