@joebigelow / wix / commits / 1b2b372b

Support multiple thmutil in same process.

Sean Hall committed Jun 4, 2021 at 13:37 UTC 1b2b372b452b5aee5dd2b8aa2cbbbe49e8d3c9e6
1 file changed +30 -15
src/libs/dutil/WixToolset.DUtil/thmutil.cpp
+30 -15
@@ -44,9 +44,6 @@ const COLORREF THEME_INVISIBLE_COLORREF = 0xFFFFFFFF;
44 const DWORD GROW_FONT_INSTANCES = 3;
45 const DWORD GROW_IMAGE_INSTANCES = 5;
46 const DWORD GROW_WINDOW_TEXT = 250;
47 -const LPCWSTR THEME_WC_HYPERLINK = L"ThemeHyperLink";
48 -const LPCWSTR THEME_WC_PANEL = L"ThemePanel";
49 -const LPCWSTR THEME_WC_STATICOWNERDRAW = L"ThemeStaticOwnerDraw";
47
48 static Gdiplus::GdiplusStartupInput vgsi;
49 static Gdiplus::GdiplusStartupOutput vgso = { };
@@ -59,6 +56,9 @@ static WNDPROC vpfnStaticOwnerDrawBaseWndProc = NULL;
56 static HMODULE vhModuleMsftEdit = NULL;
57 static HMODULE vhModuleRichEd = NULL;
58 static HCURSOR vhCursorHand = NULL;
59 +static LPWSTR vsczHyperlinkClass = NULL;
60 +static LPWSTR vsczPanelClass = NULL;
61 +static LPWSTR vsczStaticOwnerDrawClass = NULL;
62
63 enum INTERNAL_CONTROL_STYLE
64 {
@@ -575,6 +575,15 @@ DAPI_(HRESULT) ThemeInitialize(
575 hr = XmlInitialize();
576 ThmExitOnFailure(hr, "Failed to initialize XML.");
577
578 + hr = StrAllocFormatted(&vsczHyperlinkClass, L"ThemeHyperLink_%p", hModule);
579 + ThmExitOnFailure(hr, "Failed to initialize hyperlink class name.");
580 +
581 + hr = StrAllocFormatted(&vsczPanelClass, L"ThemePanel_%p", hModule);
582 + ThmExitOnFailure(hr, "Failed to initialize panel class name.");
583 +
584 + hr = StrAllocFormatted(&vsczStaticOwnerDrawClass, L"ThemeStaticOwnerDraw_%p", hModule);
585 + ThmExitOnFailure(hr, "Failed to initialize static owner draw class name.");
586 +
587 hr = RegisterWindowClasses(hModule);
588 ThmExitOnFailure(hr, "Failed to register theme window classes.");
589
@@ -611,23 +620,29 @@ DAPI_(void) ThemeUninitialize()
620
621 if (vhHyperlinkRegisteredModule)
622 {
614 - ::UnregisterClassW(THEME_WC_HYPERLINK, vhHyperlinkRegisteredModule);
623 + ::UnregisterClassW(vsczHyperlinkClass, vhHyperlinkRegisteredModule);
624 vhHyperlinkRegisteredModule = NULL;
625 }
626
627 + ReleaseStr(vsczHyperlinkClass);
628 +
629 if (vhPanelRegisteredModule)
630 {
620 - ::UnregisterClassW(THEME_WC_PANEL, vhPanelRegisteredModule);
631 + ::UnregisterClassW(vsczPanelClass, vhPanelRegisteredModule);
632 vhPanelRegisteredModule = NULL;
633 }
634
635 + ReleaseStr(vsczPanelClass);
636 +
637 if (vhStaticOwnerDrawRegisteredModule)
638 {
626 - ::UnregisterClassW(THEME_WC_STATICOWNERDRAW, vhStaticOwnerDrawRegisteredModule);
639 + ::UnregisterClassW(vsczStaticOwnerDrawClass, vhStaticOwnerDrawRegisteredModule);
640 vhStaticOwnerDrawRegisteredModule = NULL;
641 vpfnStaticOwnerDrawBaseWndProc = NULL;
642 }
643
644 + ReleaseStr(vsczStaticOwnerDrawClass);
645 +
646 if (vgdiToken)
647 {
648 GdipUninitialize(vgdiToken);
@@ -1764,7 +1779,7 @@ static HRESULT RegisterWindowClasses(
1779 ThmExitWithLastError(hr, "Failed to get button window class.");
1780 }
1781
1767 - wcHyperlink.lpszClassName = THEME_WC_HYPERLINK;
1782 + wcHyperlink.lpszClassName = vsczHyperlinkClass;
1783 #pragma prefast(push)
1784 #pragma prefast(disable:25068)
1785 wcHyperlink.hCursor = vhCursorHand;
@@ -1772,7 +1787,7 @@ static HRESULT RegisterWindowClasses(
1787
1788 if (!::RegisterClassW(&wcHyperlink))
1789 {
1775 - ThmExitWithLastError(hr, "Failed to get button window class.");
1790 + ThmExitWithLastError(hr, "Failed to register hyperlink window class.");
1791 }
1792 vhHyperlinkRegisteredModule = hModule;
1793
@@ -1780,10 +1795,10 @@ static HRESULT RegisterWindowClasses(
1795 wcPanel.lpfnWndProc = PanelWndProc;
1796 wcPanel.hInstance = hModule;
1797 wcPanel.hCursor = ::LoadCursorW(NULL, (LPCWSTR) IDC_ARROW);
1783 - wcPanel.lpszClassName = THEME_WC_PANEL;
1798 + wcPanel.lpszClassName = vsczPanelClass;
1799 if (!::RegisterClassW(&wcPanel))
1800 {
1786 - ThmExitWithLastError(hr, "Failed to register window.");
1801 + ThmExitWithLastError(hr, "Failed to register panel window class.");
1802 }
1803 vhPanelRegisteredModule = hModule;
1804
@@ -1795,7 +1810,7 @@ static HRESULT RegisterWindowClasses(
1810 pfnStaticOwnerDrawBaseWndProc = wcStaticOwnerDraw.lpfnWndProc;
1811 wcStaticOwnerDraw.lpfnWndProc = StaticOwnerDrawWndProc;
1812 wcStaticOwnerDraw.hInstance = hModule;
1798 - wcStaticOwnerDraw.lpszClassName = THEME_WC_STATICOWNERDRAW;
1813 + wcStaticOwnerDraw.lpszClassName = vsczStaticOwnerDrawClass;
1814 if (!::RegisterClassW(&wcStaticOwnerDraw))
1815 {
1816 ThmExitWithLastError(hr, "Failed to register OwnerDraw window class.");
@@ -5947,7 +5962,7 @@ static HRESULT LoadControls(
5962 case THEME_CONTROL_TYPE_BILLBOARD:
5963 __fallthrough;
5964 case THEME_CONTROL_TYPE_PANEL:
5950 - wzWindowClass = THEME_WC_PANEL;
5965 + wzWindowClass = vsczPanelClass;
5966 dwWindowExBits |= WS_EX_CONTROLPARENT;
5967 #ifdef DEBUG
5968 StrAllocFormatted(&pControl->sczText, L"Panel '%ls', id: %d", pControl->sczName, pControl->wId);
@@ -5983,7 +5998,7 @@ static HRESULT LoadControls(
5998 break;
5999
6000 case THEME_CONTROL_TYPE_HYPERLINK: // hyperlinks are basically just owner drawn buttons.
5986 - wzWindowClass = THEME_WC_HYPERLINK;
6001 + wzWindowClass = vsczHyperlinkClass;
6002 dwWindowBits |= BS_OWNERDRAW | BTNS_NOPREFIX;
6003 break;
6004
@@ -5995,7 +6010,7 @@ static HRESULT LoadControls(
6010 case THEME_CONTROL_TYPE_IMAGE: // images are basically just owner drawn static controls (so we can draw .jpgs and .pngs instead of just bitmaps).
6011 if (THEME_IMAGE_REFERENCE_TYPE_NONE != pControl->Image.imageRef.type)
6012 {
5998 - wzWindowClass = THEME_WC_STATICOWNERDRAW;
6013 + wzWindowClass = vsczStaticOwnerDrawClass;
6014 dwWindowBits |= SS_OWNERDRAW;
6015 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_OWNER_DRAW;
6016 }
@@ -6022,7 +6037,7 @@ static HRESULT LoadControls(
6037 case THEME_CONTROL_TYPE_PROGRESSBAR:
6038 if (pControl->ProgressBar.cImageRef)
6039 {
6025 - wzWindowClass = THEME_WC_STATICOWNERDRAW; // no such thing as an owner drawn progress bar so we'll make our own out of a static control.
6040 + wzWindowClass = vsczStaticOwnerDrawClass; // no such thing as an owner drawn progress bar so we'll make our own out of a static control.
6041 dwWindowBits |= SS_OWNERDRAW;
6042 pControl->dwInternalStyle |= INTERNAL_CONTROL_STYLE_OWNER_DRAW;
6043 }