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
}