[PATCH] mshtml: Avoid using a global display DC.

Alexandre Julliard julliard at winehq.org
Fri Jan 26 05:44:50 CST 2018


This is not thread-safe.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
 dlls/mshtml/htmlscreen.c     |  8 +++++---
 dlls/mshtml/main.c           | 18 ------------------
 dlls/mshtml/mshtml_private.h |  1 -
 3 files changed, 5 insertions(+), 22 deletions(-)

diff --git a/dlls/mshtml/htmlscreen.c b/dlls/mshtml/htmlscreen.c
index 2ddaad23185c..5c52e4c43741 100644
--- a/dlls/mshtml/htmlscreen.c
+++ b/dlls/mshtml/htmlscreen.c
@@ -123,10 +123,12 @@ static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
 static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
 {
     HTMLScreen *This = impl_from_IHTMLScreen(iface);
+    HDC hdc = GetDC(0);
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = GetDeviceCaps(get_display_dc(), BITSPIXEL);
+    *p = GetDeviceCaps(hdc, BITSPIXEL);
+    ReleaseDC(0, hdc);
     return S_OK;
 }
 
@@ -150,7 +152,7 @@ static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = GetDeviceCaps(get_display_dc(), HORZRES);
+    *p = GetSystemMetrics(SM_CXSCREEN);
     return S_OK;
 }
 
@@ -160,7 +162,7 @@ static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = GetDeviceCaps(get_display_dc(), VERTRES);
+    *p = GetSystemMetrics(SM_CYSCREEN);
     return S_OK;
 }
 
diff --git a/dlls/mshtml/main.c b/dlls/mshtml/main.c
index af716d16806c..0227cccf3497 100644
--- a/dlls/mshtml/main.c
+++ b/dlls/mshtml/main.c
@@ -51,7 +51,6 @@ HINSTANCE hInst;
 DWORD mshtml_tls = TLS_OUT_OF_INDEXES;
 
 static HINSTANCE shdoclc = NULL;
-static HDC display_dc;
 static WCHAR *status_strings[IDS_STATUS_LAST-IDS_STATUS_FIRST+1];
 static IMultiLanguage2 *mlang;
 
@@ -140,8 +139,6 @@ static void process_detach(void)
         FreeLibrary(shdoclc);
     if(mshtml_tls != TLS_OUT_OF_INDEXES)
         TlsFree(mshtml_tls);
-    if(display_dc)
-        DeleteObject(display_dc);
     if(mlang)
         IMultiLanguage2_Release(mlang);
 
@@ -210,21 +207,6 @@ HINSTANCE get_shdoclc(void)
     return shdoclc = LoadLibraryExW(wszShdoclc, NULL, LOAD_LIBRARY_AS_DATAFILE);
 }
 
-HDC get_display_dc(void)
-{
-    static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0};
-
-    if(!display_dc) {
-        HDC hdc;
-
-        hdc = CreateICW(displayW, NULL, NULL, NULL);
-        if(InterlockedCompareExchangePointer((void**)&display_dc, hdc, NULL))
-            DeleteObject(hdc);
-    }
-
-    return display_dc;
-}
-
 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID reserved)
 {
     switch(fdwReason) {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index aef82cd18b55..51a1addaf269 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1348,7 +1348,6 @@ extern void *call_thiscall_func;
 
 UINT cp_from_charset_string(BSTR) DECLSPEC_HIDDEN;
 BSTR charset_string_from_cp(UINT) DECLSPEC_HIDDEN;
-HDC get_display_dc(void) DECLSPEC_HIDDEN;
 HINSTANCE get_shdoclc(void) DECLSPEC_HIDDEN;
 void set_statustext(HTMLDocumentObj*,INT,LPCWSTR) DECLSPEC_HIDDEN;
 
-- 
2.15.1



More information about the wine-devel mailing list