diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-06-03 16:23:17 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-06-04 14:57:11 -0500 |
commit | 13482e726fd148eaa58eb95e358e13e390d63148 (patch) | |
tree | 087fb264038cb06922299c2e7aebdc98871e7124 /src/libs | |
parent | aec32210e4be3b58a1271e0703ec23130cd9ebe3 (diff) | |
download | wix-13482e726fd148eaa58eb95e358e13e390d63148.tar.gz wix-13482e726fd148eaa58eb95e358e13e390d63148.tar.bz2 wix-13482e726fd148eaa58eb95e358e13e390d63148.zip |
Require children of thmutil Billboard elements to be BillboardPanel.
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/dutil.h | 6 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/memutil.h | 7 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/memutil.cpp | 23 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 245 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/verutil.cpp | 2 |
5 files changed, 180 insertions, 103 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h index 52da066c..618349da 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/dutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/dutil.h | |||
@@ -121,24 +121,30 @@ void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT h | |||
121 | #define ExitWithLastErrorSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 121 | #define ExitWithLastErrorSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
122 | #define ExitOnFailureSource(d, x, s, ...) if (FAILED(x)) { ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 122 | #define ExitOnFailureSource(d, x, s, ...) if (FAILED(x)) { ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
123 | #define ExitOnRootFailureSource(d, x, s, ...) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 123 | #define ExitOnRootFailureSource(d, x, s, ...) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
124 | #define ExitWithRootFailureSource(d, x, e, s, ...) { x = FAILED(e) ? e : E_FAIL; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | ||
124 | #define ExitOnFailureDebugTraceSource(d, x, s, ...) if (FAILED(x)) { ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } | 125 | #define ExitOnFailureDebugTraceSource(d, x, s, ...) if (FAILED(x)) { ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } |
125 | #define ExitOnNullSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 126 | #define ExitOnNullSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
126 | #define ExitOnNullWithLastErrorSource(d, p, x, s, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 127 | #define ExitOnNullWithLastErrorSource(d, p, x, s, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
127 | #define ExitOnNullDebugTraceSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } | 128 | #define ExitOnNullDebugTraceSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } |
128 | #define ExitOnInvalidHandleWithLastErrorSource(d, p, x, s, ...) if (INVALID_HANDLE_VALUE == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 129 | #define ExitOnInvalidHandleWithLastErrorSource(d, p, x, s, ...) if (INVALID_HANDLE_VALUE == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
129 | #define ExitOnWin32ErrorSource(d, e, x, s, ...) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | 130 | #define ExitOnWin32ErrorSource(d, e, x, s, ...) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
131 | #define ExitOnOptionalXmlQueryFailureSource(d, x, b, s, ...) { { if (S_FALSE == x || E_NOTFOUND == x) { b = FALSE; x = S_OK; } else { b = SUCCEEDED(x); } }; ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } | ||
132 | #define ExitOnRequiredXmlQueryFailureSource(d, x, s, ...) { if (S_FALSE == x) { x = E_NOTFOUND; } ExitOnRootFailureSource(d, x, s, __VA_ARGS__); } | ||
130 | 133 | ||
131 | #define ExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 134 | #define ExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
132 | #define ExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 135 | #define ExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
133 | #define ExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 136 | #define ExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
134 | #define ExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 137 | #define ExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
135 | #define ExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 138 | #define ExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
139 | #define ExitWithRootFailure(x, e, s, ...) ExitWithRootFailureSource(DUTIL_SOURCE_DEFAULT, x, e, s, __VA_ARGS__) | ||
136 | #define ExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | 140 | #define ExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) |
137 | #define ExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) | 141 | #define ExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) |
138 | #define ExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) | 142 | #define ExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) |
139 | #define ExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) | 143 | #define ExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) |
140 | #define ExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) | 144 | #define ExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) |
141 | #define ExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DEFAULT, e, x, s, __VA_ARGS__) | 145 | #define ExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DEFAULT, e, x, s, __VA_ARGS__) |
146 | #define ExitOnOptionalXmlQueryFailure(x, b, s, ...) ExitOnOptionalXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, b, s, __VA_ARGS__) | ||
147 | #define ExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
142 | 148 | ||
143 | // release macros | 149 | // release macros |
144 | #define ReleaseObject(x) if (x) { x->Release(); } | 150 | #define ReleaseObject(x) if (x) { x->Release(); } |
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/memutil.h b/src/libs/dutil/WixToolset.DUtil/inc/memutil.h index 49f86e0a..b8269269 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/memutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/memutil.h | |||
@@ -44,6 +44,13 @@ HRESULT DAPI MemEnsureArraySize( | |||
44 | __in SIZE_T cbArrayType, | 44 | __in SIZE_T cbArrayType, |
45 | __in DWORD dwGrowthCount | 45 | __in DWORD dwGrowthCount |
46 | ); | 46 | ); |
47 | HRESULT DAPI MemEnsureArraySizeForNewItems( | ||
48 | __inout LPVOID* ppvArray, | ||
49 | __in DWORD cArray, | ||
50 | __in DWORD cNewItems, | ||
51 | __in SIZE_T cbArrayType, | ||
52 | __in DWORD dwGrowthCount | ||
53 | ); | ||
47 | HRESULT DAPI MemInsertIntoArray( | 54 | HRESULT DAPI MemInsertIntoArray( |
48 | __deref_inout_bcount((cExistingArray + cInsertItems) * cbArrayType) LPVOID* ppvArray, | 55 | __deref_inout_bcount((cExistingArray + cInsertItems) * cbArrayType) LPVOID* ppvArray, |
49 | __in DWORD dwInsertIndex, | 56 | __in DWORD dwInsertIndex, |
diff --git a/src/libs/dutil/WixToolset.DUtil/memutil.cpp b/src/libs/dutil/WixToolset.DUtil/memutil.cpp index c805a9c0..977c189e 100644 --- a/src/libs/dutil/WixToolset.DUtil/memutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/memutil.cpp | |||
@@ -214,6 +214,27 @@ LExit: | |||
214 | } | 214 | } |
215 | 215 | ||
216 | 216 | ||
217 | extern "C" HRESULT DAPI MemEnsureArraySizeForNewItems( | ||
218 | __inout LPVOID* ppvArray, | ||
219 | __in DWORD cArray, | ||
220 | __in DWORD cNewItems, | ||
221 | __in SIZE_T cbArrayType, | ||
222 | __in DWORD dwGrowthCount | ||
223 | ) | ||
224 | { | ||
225 | HRESULT hr = S_OK; | ||
226 | DWORD cNew = 0; | ||
227 | |||
228 | hr = ::DWordAdd(cArray, cNewItems, &cNew); | ||
229 | MemExitOnFailure(hr, "Integer overflow when calculating new element count."); | ||
230 | |||
231 | hr = MemEnsureArraySize(ppvArray, cNew, cbArrayType, dwGrowthCount); | ||
232 | |||
233 | LExit: | ||
234 | return hr; | ||
235 | } | ||
236 | |||
237 | |||
217 | extern "C" HRESULT DAPI MemInsertIntoArray( | 238 | extern "C" HRESULT DAPI MemInsertIntoArray( |
218 | __deref_inout_bcount((cExistingArray + cInsertItems) * cbArrayType) LPVOID* ppvArray, | 239 | __deref_inout_bcount((cExistingArray + cInsertItems) * cbArrayType) LPVOID* ppvArray, |
219 | __in DWORD dwInsertIndex, | 240 | __in DWORD dwInsertIndex, |
@@ -232,7 +253,7 @@ extern "C" HRESULT DAPI MemInsertIntoArray( | |||
232 | ExitFunction1(hr = S_OK); | 253 | ExitFunction1(hr = S_OK); |
233 | } | 254 | } |
234 | 255 | ||
235 | hr = MemEnsureArraySize(ppvArray, cExistingArray + cInsertItems, cbArrayType, dwGrowthCount); | 256 | hr = MemEnsureArraySizeForNewItems(ppvArray, cExistingArray, cInsertItems, cbArrayType, dwGrowthCount); |
236 | MemExitOnFailure(hr, "Failed to resize array while inserting items"); | 257 | MemExitOnFailure(hr, "Failed to resize array while inserting items"); |
237 | 258 | ||
238 | pbArray = reinterpret_cast<BYTE *>(*ppvArray); | 259 | pbArray = reinterpret_cast<BYTE *>(*ppvArray); |
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index d200a0ea..599021bf 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp | |||
@@ -9,14 +9,18 @@ | |||
9 | #define ThmExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) | 9 | #define ThmExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) |
10 | #define ThmExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) | 10 | #define ThmExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) |
11 | #define ThmExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) | 11 | #define ThmExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) |
12 | #define ThmExitWithRootFailure(x, e, s, ...) ExitWithRootFailureSource(DUTIL_SOURCE_THMUTIL, x, e, s, __VA_ARGS__) | ||
12 | #define ThmExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) | 13 | #define ThmExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) |
13 | #define ThmExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_THMUTIL, p, x, e, s, __VA_ARGS__) | 14 | #define ThmExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_THMUTIL, p, x, e, s, __VA_ARGS__) |
14 | #define ThmExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_THMUTIL, p, x, s, __VA_ARGS__) | 15 | #define ThmExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_THMUTIL, p, x, s, __VA_ARGS__) |
15 | #define ThmExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_THMUTIL, p, x, e, s, __VA_ARGS__) | 16 | #define ThmExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_THMUTIL, p, x, e, s, __VA_ARGS__) |
16 | #define ThmExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_THMUTIL, p, x, s, __VA_ARGS__) | 17 | #define ThmExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_THMUTIL, p, x, s, __VA_ARGS__) |
17 | #define ThmExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_THMUTIL, e, x, s, __VA_ARGS__) | 18 | #define ThmExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_THMUTIL, e, x, s, __VA_ARGS__) |
19 | #define ThmExitOnOptionalXmlQueryFailure(x, b, s, ...) ExitOnOptionalXmlQueryFailureSource(DUTIL_SOURCE_THMUTIL, x, b, s, __VA_ARGS__) | ||
20 | #define ThmExitOnRequiredXmlQueryFailure(x, s, ...) ExitOnRequiredXmlQueryFailureSource(DUTIL_SOURCE_THMUTIL, x, s, __VA_ARGS__) | ||
18 | #define ThmExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_THMUTIL, g, x, s, __VA_ARGS__) | 21 | #define ThmExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_THMUTIL, g, x, s, __VA_ARGS__) |
19 | 22 | ||
23 | |||
20 | // from CommCtrl.h | 24 | // from CommCtrl.h |
21 | #ifndef BS_COMMANDLINK | 25 | #ifndef BS_COMMANDLINK |
22 | #define BS_COMMANDLINK 0x0000000EL | 26 | #define BS_COMMANDLINK 0x0000000EL |
@@ -136,13 +140,23 @@ static HRESULT ParseControl( | |||
136 | __in IXMLDOMNode* pixn, | 140 | __in IXMLDOMNode* pixn, |
137 | __in THEME* pTheme, | 141 | __in THEME* pTheme, |
138 | __in THEME_CONTROL* pControl, | 142 | __in THEME_CONTROL* pControl, |
139 | __in BOOL fSkipDimensions, | ||
140 | __in_opt THEME_PAGE* pPage | 143 | __in_opt THEME_PAGE* pPage |
141 | ); | 144 | ); |
145 | static void InitializeThemeControl( | ||
146 | THEME_CONTROL* pControl | ||
147 | ); | ||
142 | static HRESULT ParseActions( | 148 | static HRESULT ParseActions( |
143 | __in IXMLDOMNode* pixn, | 149 | __in IXMLDOMNode* pixn, |
144 | __in THEME_CONTROL* pControl | 150 | __in THEME_CONTROL* pControl |
145 | ); | 151 | ); |
152 | static HRESULT ParseBillboardPanels( | ||
153 | __in_opt HMODULE hModule, | ||
154 | __in_opt LPCWSTR wzRelativePath, | ||
155 | __in IXMLDOMNode* pElement, | ||
156 | __in THEME* pTheme, | ||
157 | __in THEME_CONTROL* pParentControl, | ||
158 | __in_opt THEME_PAGE* pPage | ||
159 | ); | ||
146 | static HRESULT ParseColumns( | 160 | static HRESULT ParseColumns( |
147 | __in IXMLDOMNode* pixn, | 161 | __in IXMLDOMNode* pixn, |
148 | __in THEME_CONTROL* pControl | 162 | __in THEME_CONTROL* pControl |
@@ -2366,9 +2380,13 @@ static HRESULT ParseImageLists( | |||
2366 | } | 2380 | } |
2367 | 2381 | ||
2368 | ++i; | 2382 | ++i; |
2383 | ReleaseNullObject(pixnImage); | ||
2369 | } | 2384 | } |
2370 | } | 2385 | } |
2371 | ++dwImageListIndex; | 2386 | ++dwImageListIndex; |
2387 | |||
2388 | ReleaseNullObject(pixnlImages); | ||
2389 | ReleaseNullObject(pixnImageList); | ||
2372 | } | 2390 | } |
2373 | 2391 | ||
2374 | LExit: | 2392 | LExit: |
@@ -2438,7 +2456,6 @@ static HRESULT ParseControls( | |||
2438 | BSTR bstrType = NULL; | 2456 | BSTR bstrType = NULL; |
2439 | DWORD cNewControls = 0; | 2457 | DWORD cNewControls = 0; |
2440 | DWORD iControl = 0; | 2458 | DWORD iControl = 0; |
2441 | DWORD iPageControl = 0; | ||
2442 | DWORD* pcControls = NULL; | 2459 | DWORD* pcControls = NULL; |
2443 | THEME_CONTROL** prgControls = NULL; | 2460 | THEME_CONTROL** prgControls = NULL; |
2444 | 2461 | ||
@@ -2458,14 +2475,13 @@ static HRESULT ParseControls( | |||
2458 | ExitFunction1(hr = S_OK); | 2475 | ExitFunction1(hr = S_OK); |
2459 | } | 2476 | } |
2460 | 2477 | ||
2461 | hr = MemReAllocArray(reinterpret_cast<LPVOID*>(prgControls), *pcControls, sizeof(THEME_CONTROL), cNewControls); | 2478 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(prgControls), *pcControls, cNewControls, sizeof(THEME_CONTROL), 0); |
2462 | ThmExitOnFailure(hr, "Failed to reallocate theme controls."); | 2479 | ThmExitOnFailure(hr, "Failed to reallocate theme controls."); |
2463 | 2480 | ||
2464 | cNewControls += *pcControls; | 2481 | cNewControls += *pcControls; |
2465 | 2482 | ||
2466 | if (pPage) | 2483 | if (pPage) |
2467 | { | 2484 | { |
2468 | iPageControl = pPage->cControlIndices; | ||
2469 | pPage->cControlIndices += cNewControls; | 2485 | pPage->cControlIndices += cNewControls; |
2470 | } | 2486 | } |
2471 | 2487 | ||
@@ -2556,24 +2572,12 @@ static HRESULT ParseControls( | |||
2556 | THEME_CONTROL* pControl = *prgControls + iControl; | 2572 | THEME_CONTROL* pControl = *prgControls + iControl; |
2557 | pControl->type = type; | 2573 | pControl->type = type; |
2558 | 2574 | ||
2559 | // billboard children are always the size of the billboard | 2575 | hr = ParseControl(hModule, wzRelativePath, pixn, pTheme, pControl, pPage); |
2560 | BOOL fBillboardSizing = pParentControl && THEME_CONTROL_TYPE_BILLBOARD == pParentControl->type; | ||
2561 | |||
2562 | hr = ParseControl(hModule, wzRelativePath, pixn, pTheme, pControl, fBillboardSizing, pPage); | ||
2563 | ThmExitOnFailure(hr, "Failed to parse control."); | 2576 | ThmExitOnFailure(hr, "Failed to parse control."); |
2564 | 2577 | ||
2565 | if (fBillboardSizing) | ||
2566 | { | ||
2567 | pControl->nX = pControl->nDefaultDpiX = 0; | ||
2568 | pControl->nY = pControl->nDefaultDpiY = 0; | ||
2569 | pControl->nWidth = pControl->nDefaultDpiWidth = 0; | ||
2570 | pControl->nHeight = pControl->nDefaultDpiHeight = 0; | ||
2571 | } | ||
2572 | |||
2573 | if (pPage) | 2578 | if (pPage) |
2574 | { | 2579 | { |
2575 | pControl->wPageId = pPage->wId; | 2580 | pControl->wPageId = pPage->wId; |
2576 | ++iPageControl; | ||
2577 | } | 2581 | } |
2578 | 2582 | ||
2579 | ++iControl; | 2583 | ++iControl; |
@@ -2606,16 +2610,19 @@ static HRESULT ParseControl( | |||
2606 | __in IXMLDOMNode* pixn, | 2610 | __in IXMLDOMNode* pixn, |
2607 | __in THEME* pTheme, | 2611 | __in THEME* pTheme, |
2608 | __in THEME_CONTROL* pControl, | 2612 | __in THEME_CONTROL* pControl, |
2609 | __in BOOL fSkipDimensions, | ||
2610 | __in_opt THEME_PAGE* pPage | 2613 | __in_opt THEME_PAGE* pPage |
2611 | ) | 2614 | ) |
2612 | { | 2615 | { |
2613 | HRESULT hr = S_OK; | 2616 | HRESULT hr = S_OK; |
2617 | BOOL fFound = FALSE; | ||
2614 | DWORD dwValue = 0; | 2618 | DWORD dwValue = 0; |
2615 | BOOL fValue = FALSE; | 2619 | BOOL fValue = FALSE; |
2616 | BSTR bstrText = NULL; | 2620 | BSTR bstrText = NULL; |
2617 | BOOL fAnyTextChildren = FALSE; | 2621 | BOOL fAnyTextChildren = FALSE; |
2618 | BOOL fAnyNoteChildren = FALSE; | 2622 | BOOL fAnyNoteChildren = FALSE; |
2623 | BOOL fSkipDimensions = FALSE; | ||
2624 | |||
2625 | InitializeThemeControl(pControl); | ||
2619 | 2626 | ||
2620 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); | 2627 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); |
2621 | if (E_NOTFOUND == hr) | 2628 | if (E_NOTFOUND == hr) |
@@ -2682,24 +2689,12 @@ static HRESULT ParseControl( | |||
2682 | ThmExitOnFailure(hr, "Failed while parsing control image."); | 2689 | ThmExitOnFailure(hr, "Failed while parsing control image."); |
2683 | 2690 | ||
2684 | hr = XmlGetAttributeNumber(pixn, L"SourceX", reinterpret_cast<DWORD*>(&pControl->nSourceX)); | 2691 | hr = XmlGetAttributeNumber(pixn, L"SourceX", reinterpret_cast<DWORD*>(&pControl->nSourceX)); |
2685 | if (S_FALSE == hr) | ||
2686 | { | ||
2687 | pControl->nSourceX = -1; | ||
2688 | } | ||
2689 | ThmExitOnFailure(hr, "Failed when querying control SourceX attribute."); | 2692 | ThmExitOnFailure(hr, "Failed when querying control SourceX attribute."); |
2690 | 2693 | ||
2691 | hr = XmlGetAttributeNumber(pixn, L"SourceY", reinterpret_cast<DWORD*>(&pControl->nSourceY)); | 2694 | hr = XmlGetAttributeNumber(pixn, L"SourceY", reinterpret_cast<DWORD*>(&pControl->nSourceY)); |
2692 | if (S_FALSE == hr) | ||
2693 | { | ||
2694 | pControl->nSourceY = -1; | ||
2695 | } | ||
2696 | ThmExitOnFailure(hr, "Failed when querying control SourceY attribute."); | 2695 | ThmExitOnFailure(hr, "Failed when querying control SourceY attribute."); |
2697 | 2696 | ||
2698 | hr = XmlGetAttributeNumber(pixn, L"FontId", &pControl->dwFontId); | 2697 | hr = XmlGetAttributeNumber(pixn, L"FontId", &pControl->dwFontId); |
2699 | if (S_FALSE == hr) | ||
2700 | { | ||
2701 | pControl->dwFontId = THEME_INVALID_ID; | ||
2702 | } | ||
2703 | ThmExitOnFailure(hr, "Failed when querying control FontId attribute."); | 2698 | ThmExitOnFailure(hr, "Failed when querying control FontId attribute."); |
2704 | 2699 | ||
2705 | // Parse the optional window style. | 2700 | // Parse the optional window style. |
@@ -2777,40 +2772,30 @@ static HRESULT ParseControl( | |||
2777 | ThmExitOnFailure(hr, "Failed to parse note text nodes of the control."); | 2772 | ThmExitOnFailure(hr, "Failed to parse note text nodes of the control."); |
2778 | } | 2773 | } |
2779 | 2774 | ||
2780 | if (fAnyTextChildren || fAnyNoteChildren) | 2775 | if (!fAnyTextChildren && !fAnyNoteChildren) |
2781 | { | 2776 | { |
2782 | pControl->uStringId = UINT_MAX; | 2777 | hr = XmlGetAttributeNumber(pixn, L"StringId", &dwValue); |
2783 | } | 2778 | ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed when querying control StringId attribute."); |
2784 | else | ||
2785 | { | ||
2786 | hr = XmlGetAttributeNumber(pixn, L"StringId", reinterpret_cast<DWORD*>(&pControl->uStringId)); | ||
2787 | ThmExitOnFailure(hr, "Failed when querying control StringId attribute."); | ||
2788 | 2779 | ||
2789 | if (S_FALSE == hr) | 2780 | if (fFound) |
2790 | { | 2781 | { |
2791 | pControl->uStringId = UINT_MAX; | 2782 | pControl->uStringId = dwValue; |
2792 | 2783 | } | |
2793 | if (THEME_CONTROL_TYPE_BILLBOARD == pControl->type || THEME_CONTROL_TYPE_PANEL == pControl->type) | 2784 | else |
2794 | { | 2785 | { |
2795 | // Billboards and panels have child elements and we don't want to pick up child element text in the parents. | 2786 | // Billboards and panels have child elements and we don't want to pick up child element text in the parents. |
2796 | hr = S_OK; | 2787 | if (THEME_CONTROL_TYPE_BILLBOARD != pControl->type && THEME_CONTROL_TYPE_PANEL != pControl->type) |
2797 | } | ||
2798 | else | ||
2799 | { | 2788 | { |
2800 | hr = XmlGetText(pixn, &bstrText); | 2789 | hr = XmlGetText(pixn, &bstrText); |
2801 | ThmExitOnFailure(hr, "Failed to get control inner text."); | 2790 | ThmExitOnOptionalXmlQueryFailure(hr, fFound, "Failed to get control inner text."); |
2802 | 2791 | ||
2803 | if (S_OK == hr) | 2792 | if (fFound) |
2804 | { | 2793 | { |
2805 | hr = StrAllocString(&pControl->sczText, bstrText, 0); | 2794 | hr = StrAllocString(&pControl->sczText, bstrText, 0); |
2806 | ThmExitOnFailure(hr, "Failed to copy control text."); | 2795 | ThmExitOnFailure(hr, "Failed to copy control text."); |
2807 | 2796 | ||
2808 | ReleaseNullBSTR(bstrText); | 2797 | ReleaseNullBSTR(bstrText); |
2809 | } | 2798 | } |
2810 | else if (S_FALSE == hr) | ||
2811 | { | ||
2812 | hr = S_OK; | ||
2813 | } | ||
2814 | } | 2799 | } |
2815 | } | 2800 | } |
2816 | } | 2801 | } |
@@ -2832,7 +2817,7 @@ static HRESULT ParseControl( | |||
2832 | } | 2817 | } |
2833 | ThmExitOnFailure(hr, "Failed when querying Billboard/@Interval attribute."); | 2818 | ThmExitOnFailure(hr, "Failed when querying Billboard/@Interval attribute."); |
2834 | 2819 | ||
2835 | hr = ParseControls(hModule, wzRelativePath, pixn, pTheme, pControl, pPage); | 2820 | hr = ParseBillboardPanels(hModule, wzRelativePath, pixn, pTheme, pControl, pPage); |
2836 | ThmExitOnFailure(hr, "Failed to parse billboard children."); | 2821 | ThmExitOnFailure(hr, "Failed to parse billboard children."); |
2837 | } | 2822 | } |
2838 | else if (THEME_CONTROL_TYPE_COMMANDLINK == pControl->type) | 2823 | else if (THEME_CONTROL_TYPE_COMMANDLINK == pControl->type) |
@@ -2860,17 +2845,9 @@ static HRESULT ParseControl( | |||
2860 | else if (THEME_CONTROL_TYPE_HYPERLINK == pControl->type || THEME_CONTROL_TYPE_BUTTON == pControl->type) | 2845 | else if (THEME_CONTROL_TYPE_HYPERLINK == pControl->type || THEME_CONTROL_TYPE_BUTTON == pControl->type) |
2861 | { | 2846 | { |
2862 | hr = XmlGetAttributeNumber(pixn, L"HoverFontId", &pControl->dwFontHoverId); | 2847 | hr = XmlGetAttributeNumber(pixn, L"HoverFontId", &pControl->dwFontHoverId); |
2863 | if (S_FALSE == hr) | ||
2864 | { | ||
2865 | pControl->dwFontHoverId = THEME_INVALID_ID; | ||
2866 | } | ||
2867 | ThmExitOnFailure(hr, "Failed when querying control HoverFontId attribute."); | 2848 | ThmExitOnFailure(hr, "Failed when querying control HoverFontId attribute."); |
2868 | 2849 | ||
2869 | hr = XmlGetAttributeNumber(pixn, L"SelectedFontId", &pControl->dwFontSelectedId); | 2850 | hr = XmlGetAttributeNumber(pixn, L"SelectedFontId", &pControl->dwFontSelectedId); |
2870 | if (S_FALSE == hr) | ||
2871 | { | ||
2872 | pControl->dwFontSelectedId = THEME_INVALID_ID; | ||
2873 | } | ||
2874 | ThmExitOnFailure(hr, "Failed when querying control SelectedFontId attribute."); | 2851 | ThmExitOnFailure(hr, "Failed when querying control SelectedFontId attribute."); |
2875 | } | 2852 | } |
2876 | else if (THEME_CONTROL_TYPE_LABEL == pControl->type) | 2853 | else if (THEME_CONTROL_TYPE_LABEL == pControl->type) |
@@ -3038,6 +3015,18 @@ LExit: | |||
3038 | return hr; | 3015 | return hr; |
3039 | } | 3016 | } |
3040 | 3017 | ||
3018 | static void InitializeThemeControl( | ||
3019 | THEME_CONTROL* pControl | ||
3020 | ) | ||
3021 | { | ||
3022 | pControl->dwFontHoverId = THEME_INVALID_ID; | ||
3023 | pControl->dwFontId = THEME_INVALID_ID; | ||
3024 | pControl->dwFontSelectedId = THEME_INVALID_ID; | ||
3025 | pControl->nSourceX = -1; | ||
3026 | pControl->nSourceY = -1; | ||
3027 | pControl->uStringId = UINT_MAX; | ||
3028 | } | ||
3029 | |||
3041 | 3030 | ||
3042 | static HRESULT ParseActions( | 3031 | static HRESULT ParseActions( |
3043 | __in IXMLDOMNode* pixn, | 3032 | __in IXMLDOMNode* pixn, |
@@ -3134,6 +3123,61 @@ LExit: | |||
3134 | } | 3123 | } |
3135 | 3124 | ||
3136 | 3125 | ||
3126 | static HRESULT ParseBillboardPanels( | ||
3127 | __in_opt HMODULE hModule, | ||
3128 | __in_opt LPCWSTR wzRelativePath, | ||
3129 | __in IXMLDOMNode* pElement, | ||
3130 | __in THEME* pTheme, | ||
3131 | __in THEME_CONTROL* pParentControl, | ||
3132 | __in_opt THEME_PAGE* pPage | ||
3133 | ) | ||
3134 | { | ||
3135 | HRESULT hr = S_OK; | ||
3136 | IXMLDOMNodeList* pixnl = NULL; | ||
3137 | IXMLDOMNode* pixnChild = NULL; | ||
3138 | DWORD dwValue = 0; | ||
3139 | THEME_CONTROL* pControl = NULL; | ||
3140 | |||
3141 | hr = XmlSelectNodes(pElement, L"BillboardPanel", &pixnl); | ||
3142 | ThmExitOnFailure(hr, "Failed to select child billboard panel nodes."); | ||
3143 | |||
3144 | hr = pixnl->get_length(reinterpret_cast<long*>(&dwValue)); | ||
3145 | ThmExitOnFailure(hr, "Failed to count the number of billboard panel nodes."); | ||
3146 | |||
3147 | if (!dwValue) | ||
3148 | { | ||
3149 | ThmExitWithRootFailure(hr, E_INVALIDDATA, "Billboard must have at least one BillboardPanel."); | ||
3150 | } | ||
3151 | |||
3152 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pParentControl->rgControls), pParentControl->cControls, dwValue, sizeof(THEME_CONTROL), 0); | ||
3153 | ThmExitOnFailure(hr, "Failed to ensure theme control array size for BillboardPanels."); | ||
3154 | |||
3155 | while (S_OK == (hr = XmlNextElement(pixnl, &pixnChild, NULL))) | ||
3156 | { | ||
3157 | pControl = pParentControl->rgControls + pParentControl->cControls; | ||
3158 | pParentControl->cControls += 1; | ||
3159 | pControl->type = THEME_CONTROL_TYPE_PANEL; | ||
3160 | InitializeThemeControl(pControl); | ||
3161 | |||
3162 | if (pPage) | ||
3163 | { | ||
3164 | pControl->wPageId = pPage->wId; | ||
3165 | } | ||
3166 | |||
3167 | hr = ParseControls(hModule, wzRelativePath, pixnChild, pTheme, pControl, pPage); | ||
3168 | ThmExitOnFailure(hr, "Failed to parse control."); | ||
3169 | |||
3170 | ReleaseNullObject(pixnChild); | ||
3171 | } | ||
3172 | |||
3173 | LExit: | ||
3174 | ReleaseObject(pixnl); | ||
3175 | ReleaseObject(pixnChild); | ||
3176 | |||
3177 | return hr; | ||
3178 | } | ||
3179 | |||
3180 | |||
3137 | static HRESULT ParseColumns( | 3181 | static HRESULT ParseColumns( |
3138 | __in IXMLDOMNode* pixn, | 3182 | __in IXMLDOMNode* pixn, |
3139 | __in THEME_CONTROL* pControl | 3183 | __in THEME_CONTROL* pControl |
@@ -3186,6 +3230,7 @@ static HRESULT ParseColumns( | |||
3186 | 3230 | ||
3187 | ++i; | 3231 | ++i; |
3188 | ReleaseNullBSTR(bstrText); | 3232 | ReleaseNullBSTR(bstrText); |
3233 | ReleaseNullObject(pixnChild); | ||
3189 | } | 3234 | } |
3190 | } | 3235 | } |
3191 | 3236 | ||
@@ -3209,8 +3254,6 @@ static HRESULT ParseRadioButtons( | |||
3209 | { | 3254 | { |
3210 | HRESULT hr = S_OK; | 3255 | HRESULT hr = S_OK; |
3211 | DWORD cRadioButtons = 0; | 3256 | DWORD cRadioButtons = 0; |
3212 | DWORD iControl = 0; | ||
3213 | DWORD iPageControl = 0; | ||
3214 | IXMLDOMNodeList* pixnlRadioButtons = NULL; | 3257 | IXMLDOMNodeList* pixnlRadioButtons = NULL; |
3215 | IXMLDOMNodeList* pixnl = NULL; | 3258 | IXMLDOMNodeList* pixnl = NULL; |
3216 | IXMLDOMNode* pixnRadioButtons = NULL; | 3259 | IXMLDOMNode* pixnRadioButtons = NULL; |
@@ -3241,53 +3284,54 @@ static HRESULT ParseRadioButtons( | |||
3241 | hr = pixnl->get_length(reinterpret_cast<long*>(&cRadioButtons)); | 3284 | hr = pixnl->get_length(reinterpret_cast<long*>(&cRadioButtons)); |
3242 | ThmExitOnFailure(hr, "Failed to count the number of RadioButton nodes."); | 3285 | ThmExitOnFailure(hr, "Failed to count the number of RadioButton nodes."); |
3243 | 3286 | ||
3244 | if (cRadioButtons) | 3287 | if (!cRadioButtons) |
3245 | { | 3288 | { |
3246 | if (pPage) | 3289 | ThmExitWithRootFailure(hr, E_INVALIDDATA, "RadioButtons must have at least one RadioButton."); |
3247 | { | 3290 | } |
3248 | iPageControl = pPage->cControlIndices; | ||
3249 | pPage->cControlIndices += cRadioButtons; | ||
3250 | } | ||
3251 | |||
3252 | hr = MemReAllocArray(reinterpret_cast<LPVOID*>(prgControls), *pcControls, sizeof(THEME_CONTROL), cRadioButtons); | ||
3253 | ThmExitOnFailure(hr, "Failed to reallocate theme controls."); | ||
3254 | |||
3255 | iControl = *pcControls; | ||
3256 | *pcControls += cRadioButtons; | ||
3257 | |||
3258 | fFirst = TRUE; | ||
3259 | 3291 | ||
3260 | while (S_OK == (hr = XmlNextElement(pixnl, &pixnChild, NULL))) | 3292 | if (pPage) |
3261 | { | 3293 | { |
3262 | pControl = *prgControls + iControl; | 3294 | pPage->cControlIndices += cRadioButtons; |
3263 | pControl->type = THEME_CONTROL_TYPE_RADIOBUTTON; | 3295 | } |
3264 | 3296 | ||
3265 | hr = ParseControl(hModule, wzRelativePath, pixnChild, pTheme, pControl, FALSE, pPage); | 3297 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(prgControls), *pcControls, cRadioButtons, sizeof(THEME_CONTROL), 0); |
3266 | ThmExitOnFailure(hr, "Failed to parse control."); | 3298 | ThmExitOnFailure(hr, "Failed to ensure theme control array size for RadioButtons."); |
3267 | 3299 | ||
3268 | if (fFirst) | 3300 | fFirst = TRUE; |
3269 | { | ||
3270 | pControl->dwStyle |= WS_GROUP; | ||
3271 | fFirst = FALSE; | ||
3272 | } | ||
3273 | 3301 | ||
3274 | hr = StrAllocString(&pControl->sczVariable, sczName, 0); | 3302 | while (S_OK == (hr = XmlNextElement(pixnl, &pixnChild, NULL))) |
3275 | ThmExitOnFailure(hr, "Failed to copy radio button variable."); | 3303 | { |
3304 | pControl = *prgControls + *pcControls; | ||
3305 | pControl->type = THEME_CONTROL_TYPE_RADIOBUTTON; | ||
3306 | *pcControls += 1; | ||
3276 | 3307 | ||
3277 | if (pPage) | 3308 | hr = ParseControl(hModule, wzRelativePath, pixnChild, pTheme, pControl, pPage); |
3278 | { | 3309 | ThmExitOnFailure(hr, "Failed to parse control."); |
3279 | pControl->wPageId = pPage->wId; | ||
3280 | ++iPageControl; | ||
3281 | } | ||
3282 | 3310 | ||
3283 | ++iControl; | 3311 | if (fFirst) |
3312 | { | ||
3313 | pControl->dwStyle |= WS_GROUP; | ||
3314 | fFirst = FALSE; | ||
3284 | } | 3315 | } |
3285 | 3316 | ||
3286 | if (!fFirst) | 3317 | hr = StrAllocString(&pControl->sczVariable, sczName, 0); |
3318 | ThmExitOnFailure(hr, "Failed to copy radio button variable."); | ||
3319 | |||
3320 | if (pPage) | ||
3287 | { | 3321 | { |
3288 | pControl->fLastRadioButton = TRUE; | 3322 | pControl->wPageId = pPage->wId; |
3289 | } | 3323 | } |
3324 | |||
3325 | ReleaseNullObject(pixnChild); | ||
3290 | } | 3326 | } |
3327 | |||
3328 | if (!fFirst) | ||
3329 | { | ||
3330 | pControl->fLastRadioButton = TRUE; | ||
3331 | } | ||
3332 | |||
3333 | ReleaseObject(pixnl); | ||
3334 | ReleaseObject(pixnRadioButtons); | ||
3291 | } | 3335 | } |
3292 | 3336 | ||
3293 | LExit: | 3337 | LExit: |
@@ -3616,7 +3660,7 @@ static HRESULT EnsureFontInstance( | |||
3616 | } | 3660 | } |
3617 | } | 3661 | } |
3618 | 3662 | ||
3619 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pFont->rgFontInstances), pFont->cFontInstances, sizeof(THEME_FONT_INSTANCE), GROW_FONT_INSTANCES); | 3663 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pFont->rgFontInstances), pFont->cFontInstances, 1, sizeof(THEME_FONT_INSTANCE), GROW_FONT_INSTANCES); |
3620 | ThmExitOnFailure(hr, "Failed to allocate memory for font instances."); | 3664 | ThmExitOnFailure(hr, "Failed to allocate memory for font instances."); |
3621 | 3665 | ||
3622 | pFontInstance = pFont->rgFontInstances + pFont->cFontInstances; | 3666 | pFontInstance = pFont->rgFontInstances + pFont->cFontInstances; |
@@ -5017,8 +5061,7 @@ static HRESULT LoadControls( | |||
5017 | __fallthrough; | 5061 | __fallthrough; |
5018 | case THEME_CONTROL_TYPE_PANEL: | 5062 | case THEME_CONTROL_TYPE_PANEL: |
5019 | wzWindowClass = THEME_WC_PANEL; | 5063 | wzWindowClass = THEME_WC_PANEL; |
5020 | dwWindowBits |= WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; | 5064 | dwWindowExBits |= WS_EX_CONTROLPARENT; |
5021 | dwWindowExBits |= WS_EX_TRANSPARENT | WS_EX_CONTROLPARENT; | ||
5022 | #ifdef DEBUG | 5065 | #ifdef DEBUG |
5023 | StrAllocFormatted(&pControl->sczText, L"Panel '%ls', id: %d", pControl->sczName, pControl->wId); | 5066 | StrAllocFormatted(&pControl->sczText, L"Panel '%ls', id: %d", pControl->sczName, pControl->wId); |
5024 | #endif | 5067 | #endif |
diff --git a/src/libs/dutil/WixToolset.DUtil/verutil.cpp b/src/libs/dutil/WixToolset.DUtil/verutil.cpp index 21626f94..8881d7bc 100644 --- a/src/libs/dutil/WixToolset.DUtil/verutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/verutil.cpp | |||
@@ -458,7 +458,7 @@ DAPI_(HRESULT) VerParseVersion( | |||
458 | break; | 458 | break; |
459 | } | 459 | } |
460 | 460 | ||
461 | hr = MemReAllocArray(reinterpret_cast<LPVOID*>(&pVersion->rgReleaseLabels), pVersion->cReleaseLabels, sizeof(VERUTIL_VERSION_RELEASE_LABEL), GROW_RELEASE_LABELS - (pVersion->cReleaseLabels % GROW_RELEASE_LABELS)); | 461 | hr = MemEnsureArraySizeForNewItems(reinterpret_cast<LPVOID*>(&pVersion->rgReleaseLabels), pVersion->cReleaseLabels, 1, sizeof(VERUTIL_VERSION_RELEASE_LABEL), GROW_RELEASE_LABELS); |
462 | VerExitOnFailure(hr, "Failed to allocate memory for Verutil version release labels '%ls'", wzVersion); | 462 | VerExitOnFailure(hr, "Failed to allocate memory for Verutil version release labels '%ls'", wzVersion); |
463 | 463 | ||
464 | VERUTIL_VERSION_RELEASE_LABEL* pReleaseLabel = pVersion->rgReleaseLabels + pVersion->cReleaseLabels; | 464 | VERUTIL_VERSION_RELEASE_LABEL* pReleaseLabel = pVersion->rgReleaseLabels + pVersion->cReleaseLabels; |