Author: mjansen Date: Sat Apr 22 17:11:52 2017 New Revision: 74388
URL: http://svn.reactos.org/svn/reactos?rev=74388&view=rev Log: [ACPPAGE] Implement custom compatibility mode selection + Expand paths CORE-10375
Added: trunk/reactos/dll/shellext/acppage/CLayerStringList.hpp (with props) Modified: trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.cpp trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.hpp trunk/reactos/dll/shellext/acppage/CMakeLists.txt trunk/reactos/dll/shellext/acppage/precomp.h trunk/reactos/sdk/lib/atl/atlexcept.h
Added: trunk/reactos/dll/shellext/acppage/CLayerStringList.hpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/acppage/CLayer... ============================================================================== --- trunk/reactos/dll/shellext/acppage/CLayerStringList.hpp (added) +++ trunk/reactos/dll/shellext/acppage/CLayerStringList.hpp [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -0,0 +1,111 @@ +/* + * Copyright 2015-2017 Mark Jansen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +/* TODO: Use HSDB instead of PDB */ +class CLayerStringList : + public CComObjectRootEx<CComMultiThreadModelNoCS>, + public IEnumString +{ +public: + CLayerStringList() + :m_root(TAGID_NULL), m_layer(TAGID_NULL) + { + WCHAR buf[MAX_PATH]; + SdbGetAppPatchDir(NULL, buf, MAX_PATH); + StringCchCatW(buf, _countof(buf), L"\sysmain.sdb"); + m_db = SdbOpenDatabase(buf, DOS_PATH); + Reset(); + } + + ~CLayerStringList() + { + SdbCloseDatabase(m_db); + } + + virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) + { + if (pceltFetched) + *pceltFetched = 0; + + while (celt && m_layer) + { + TAGID nameid = SdbFindFirstTag(m_db, m_layer, TAG_NAME); + if (!nameid) + return S_FALSE; + + LPWSTR name = SdbGetStringTagPtr(m_db, nameid); + if (!name) + return S_FALSE; + + ULONG Size = wcslen(name) + 1; + + *rgelt = (LPOLESTR)::CoTaskMemAlloc(Size * sizeof(WCHAR)); + StringCchCopyW(*rgelt, Size, name); + + if (pceltFetched) + (*pceltFetched)++; + + m_layer = SdbFindNextTag(m_db, m_root, m_layer); + celt--; + rgelt++; + } + return celt ? S_FALSE : S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt) + { + while (m_layer && celt) + { + m_layer = SdbFindNextTag(m_db, m_root, m_layer); + --celt; + } + return celt ? S_FALSE : S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE Reset() + { + m_root = m_layer = TAGID_NULL; + if (m_db) + { + m_root = SdbFindFirstTag(m_db, TAGID_ROOT, TAG_DATABASE); + if (m_root != TAGID_NULL) + { + m_layer = SdbFindFirstTag(m_db, m_root, TAG_LAYER); + return S_OK; + } + } + return E_FAIL; + } + + virtual HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum) + { + return E_NOTIMPL; + } + +protected: + PDB m_db; + TAGID m_root; + TAGID m_layer; + +public: + BEGIN_COM_MAP(CLayerStringList) + COM_INTERFACE_ENTRY_IID(IID_IEnumString, IEnumString) + END_COM_MAP() +}; +
Propchange: trunk/reactos/dll/shellext/acppage/CLayerStringList.hpp ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/acppage/CLayer... ============================================================================== --- trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.cpp [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -1,5 +1,5 @@ /* - * Copyright 2015 Mark Jansen + * Copyright 2015-2017 Mark Jansen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,6 +20,7 @@
#include <shlwapi.h> #include <shellapi.h> +#include <shellutils.h> #include <strsafe.h> #include <apphelp.h> #include <windowsx.h> @@ -31,45 +32,6 @@ #define GPLK_USER 1 #define GPLK_MACHINE 2 #define MAX_LAYER_LENGTH 256 - -void ACDBG_FN(PCSTR FunctionName, PCWSTR Format, ...) -{ - WCHAR Buffer[512]; - WCHAR* Current = Buffer; - size_t Length = _countof(Buffer); - - StringCchPrintfExW(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, L"[%-20S] ", FunctionName); - va_list ArgList; - va_start(ArgList, Format); - StringCchVPrintfExW(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, Format, ArgList); - va_end(ArgList); - OutputDebugStringW(Buffer); -} - -#define ACDBG(fmt, ...) ACDBG_FN(__FUNCTION__, fmt, ##__VA_ARGS__ ) - - - -CLayerUIPropPage::CLayerUIPropPage() -: m_IsSfcProtected(FALSE) -, m_AllowPermLayer(FALSE) -, m_LayerQueryFlags(GPLK_USER) -, m_RegistryOSMode(0) -, m_OSMode(0) -, m_RegistryEnabledLayers(0) -, m_EnabledLayers(0) -{ -} - -CLayerUIPropPage::~CLayerUIPropPage() -{ -} - - -#if 0 -HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers -WINXPSP3 256COLOR 640X480 DISABLETHEMES DISABLEDWM HIGHDPIAWARE RUNASADMIN -#endif
static struct { const PCWSTR Display; @@ -95,12 +57,16 @@ static struct { const PCWSTR Name; DWORD Id; - BOOL Enabled; } g_Layers[] = { - { L"256COLOR", IDC_CHKRUNIN256COLORS, TRUE }, - { L"640X480", IDC_CHKRUNIN640480RES, TRUE }, - { L"DISABLETHEMES", IDC_CHKDISABLEVISUALTHEMES, TRUE }, - { NULL, 0, FALSE } + { L"256COLOR", IDC_CHKRUNIN256COLORS }, + { L"640X480", IDC_CHKRUNIN640480RES }, + { L"DISABLETHEMES", IDC_CHKDISABLEVISUALTHEMES }, +#if 0 + { L"DISABLEDWM", IDC_??, TRUE }, + { L"HIGHDPIAWARE", IDC_??, TRUE }, + { L"RUNASADMIN", IDC_??, TRUE }, +#endif + { NULL, 0 } };
static const WCHAR* g_AllowedExtensions[] = { @@ -112,25 +78,82 @@ 0 };
+ +void ACDBG_FN(PCSTR FunctionName, PCWSTR Format, ...) +{ + WCHAR Buffer[512]; + WCHAR* Current = Buffer; + size_t Length = _countof(Buffer); + + StringCchPrintfExW(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, L"[%-20S] ", FunctionName); + va_list ArgList; + va_start(ArgList, Format); + StringCchVPrintfExW(Current, Length, &Current, &Length, STRSAFE_NULL_ON_FAILURE, Format, ArgList); + va_end(ArgList); + OutputDebugStringW(Buffer); +} + +#define ACDBG(fmt, ...) ACDBG_FN(__FUNCTION__, fmt, ##__VA_ARGS__ ) + + + +CLayerUIPropPage::CLayerUIPropPage() +: m_IsSfcProtected(FALSE) +, m_AllowPermLayer(FALSE) +, m_LayerQueryFlags(GPLK_USER) /* TODO: When do we read from HKLM? */ +, m_RegistryOSMode(0) +, m_OSMode(0) +, m_RegistryEnabledLayers(0) +, m_EnabledLayers(0) +{ +} + +CLayerUIPropPage::~CLayerUIPropPage() +{ +} + HRESULT CLayerUIPropPage::InitFile(PCWSTR Filename) { - PCWSTR pwszExt = PathFindExtensionW(Filename); + CString ExpandedFilename; + DWORD dwRequired = ExpandEnvironmentStringsW(Filename, NULL, 0); + if (dwRequired > 0) + { + LPWSTR Buffer = ExpandedFilename.GetBuffer(dwRequired); + DWORD dwReturned = ExpandEnvironmentStringsW(Filename, Buffer, dwRequired); + if (dwRequired == dwReturned) + { + ExpandedFilename.ReleaseBufferSetLength(dwReturned - 1); + ACDBG(L"Expanded '%s' => '%s'\r\n", Filename, (PCWSTR)ExpandedFilename); + } + else + { + ExpandedFilename.ReleaseBufferSetLength(0); + ExpandedFilename = Filename; + ACDBG(L"Failed during expansion '%s'\r\n", Filename); + } + } + else + { + ACDBG(L"Failed to expand '%s'\r\n", Filename); + ExpandedFilename = Filename; + } + PCWSTR pwszExt = PathFindExtensionW(ExpandedFilename); if (!pwszExt) { - ACDBG(L"Failed to find an extension: '%s'\r\n", Filename); + ACDBG(L"Failed to find an extension: '%s'\r\n", (PCWSTR)ExpandedFilename); return E_FAIL; } if (!wcsicmp(pwszExt, L".lnk")) { WCHAR Buffer[MAX_PATH]; - if (!GetExeFromLnk(Filename, Buffer, _countof(Buffer))) - { - ACDBG(L"Failed to read link target from: '%s'\r\n", Filename); + if (!GetExeFromLnk(ExpandedFilename, Buffer, _countof(Buffer))) + { + ACDBG(L"Failed to read link target from: '%s'\r\n", (PCWSTR)ExpandedFilename); return E_FAIL; } - if (!wcsicmp(Buffer, Filename)) - { - ACDBG(L"Link redirects to itself: '%s'\r\n", Filename); + if (!wcsicmp(Buffer, ExpandedFilename)) + { + ACDBG(L"Link redirects to itself: '%s'\r\n", (PCWSTR)ExpandedFilename); return E_FAIL; } return InitFile(Buffer); @@ -139,10 +162,10 @@ { if (!wcsicmp(g_AllowedExtensions[n], pwszExt)) { - m_Filename = Filename; - ACDBG(L"Got: %s\r\n", Filename); + m_Filename = ExpandedFilename; + ACDBG(L"Got: %s\r\n", (PCWSTR)ExpandedFilename); m_IsSfcProtected = SfcIsFileProtected(NULL, m_Filename); - m_AllowPermLayer = AllowPermLayer(Filename); + m_AllowPermLayer = AllowPermLayer(ExpandedFilename); return S_OK; } } @@ -150,11 +173,13 @@ return E_FAIL; }
-BOOL GetLayerInfo(BSTR Filename, DWORD QueryFlags, PDWORD OSMode, PDWORD Enabledlayers) -{ - *OSMode = *Enabledlayers = 0; +static BOOL GetLayerInfo(PCWSTR Filename, DWORD QueryFlags, PDWORD OSMode, PDWORD Enabledlayers, CSimpleArray<CString>& customLayers) +{ WCHAR wszLayers[MAX_LAYER_LENGTH] = { 0 }; DWORD dwBytes = sizeof(wszLayers); + + *OSMode = *Enabledlayers = 0; + customLayers.RemoveAll(); if (!SdbGetPermLayerKeys(Filename, wszLayers, &dwBytes, QueryFlags)) return FALSE;
@@ -163,53 +188,109 @@ size_t n; for (n = 0; g_Layers[n].Name; ++n) { - if (g_Layers[n].Enabled && !wcsicmp(g_Layers[n].Name, Layer)) + if (!wcsicmp(g_Layers[n].Name, Layer)) { *Enabledlayers |= (1<<n); break; } } - if (!g_Layers[n].Name) - { - for (n = 0; g_CompatModes[n].Name; ++n) - { - if (!wcsicmp(g_CompatModes[n].Name, Layer)) - { - *OSMode = n+1; - break; - } - } - } + /* Did we find it? */ + if (g_Layers[n].Name) + continue; + + for (n = 0; g_CompatModes[n].Name; ++n) + { + if (!wcsicmp(g_CompatModes[n].Name, Layer)) + { + *OSMode = n+1; + break; + } + } + /* Did we find it? */ + if (g_CompatModes[n].Name) + continue; + + /* Must be a 'custom' layer */ + customLayers.Add(Layer); } return TRUE; }
void CLayerUIPropPage::OnRefresh(HWND hWnd) { - if (!GetLayerInfo(m_Filename, m_LayerQueryFlags, &m_RegistryOSMode, &m_RegistryEnabledLayers)) + if (!GetLayerInfo(m_Filename, m_LayerQueryFlags, &m_RegistryOSMode, &m_RegistryEnabledLayers, m_RegistryCustomLayers)) m_RegistryOSMode = m_RegistryEnabledLayers = 0;
for (size_t n = 0; g_Layers[n].Name; ++n) CheckDlgButton(hWnd, g_Layers[n].Id, (m_RegistryEnabledLayers & (1<<n)) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hWnd, IDC_CHKRUNCOMPATIBILITY, m_RegistryOSMode ? BST_CHECKED : BST_UNCHECKED); + if (m_RegistryOSMode) ComboBox_SetCurSel(GetDlgItem(hWnd, IDC_COMPATIBILITYMODE), m_RegistryOSMode-1); + + m_CustomLayers = m_RegistryCustomLayers; + + /* TODO: visualize 'custom' layers! */ + UpdateControls(hWnd); }
+ +static BOOL ArrayEquals(const CSimpleArray<CString>& lhs, const CSimpleArray<CString>& rhs) +{ + if (lhs.GetSize() != rhs.GetSize()) + return FALSE; + + for (int n = 0; n < lhs.GetSize(); ++n) + { + if (lhs[n] != rhs[n]) + return FALSE; + } + return TRUE; +} + +BOOL CLayerUIPropPage::HasChanges() const +{ + if (m_RegistryEnabledLayers != m_EnabledLayers) + return TRUE; + + if (m_RegistryOSMode != m_OSMode) + return TRUE; + + if (!ArrayEquals(m_RegistryCustomLayers, m_CustomLayers)) + return TRUE; + + return FALSE; +} + void CLayerUIPropPage::OnApply(HWND hWnd) { - if (m_RegistryEnabledLayers != m_EnabledLayers || m_RegistryOSMode != m_OSMode) + if (HasChanges()) { BOOL bMachine = m_LayerQueryFlags == GPLK_MACHINE; + for (size_t n = 0; g_CompatModes[n].Name; ++n) SetPermLayerState(m_Filename, g_CompatModes[n].Name, 0, bMachine, (n+1) == m_OSMode); + for (size_t n = 0; g_Layers[n].Name; ++n) { - if (g_Layers[n].Enabled) - SetPermLayerState(m_Filename, g_Layers[n].Name, 0, bMachine, ((1<<n) & m_EnabledLayers) != 0); - } - SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW, (BSTR)m_Filename, NULL); + SetPermLayerState(m_Filename, g_Layers[n].Name, 0, bMachine, ((1<<n) & m_EnabledLayers) != 0); + } + + /* Disable all old values */ + for (int j = 0; j < m_RegistryCustomLayers.GetSize(); j++) + { + SetPermLayerState(m_Filename, m_RegistryCustomLayers[j].GetString(), 0, bMachine, FALSE); + } + + /* Enable all new values */ + for (int j = 0; j < m_CustomLayers.GetSize(); j++) + { + SetPermLayerState(m_Filename, m_CustomLayers[j].GetString(), 0, bMachine, TRUE); + } + + SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW, (PCWSTR)m_Filename, NULL); } }
@@ -219,7 +300,6 @@ for (size_t n = 0; g_CompatModes[n].Display; ++n) ComboBox_AddString(cboMode, g_CompatModes[n].Display); ComboBox_SetCurSel(cboMode, 5); - EnableWindow(GetDlgItem(hWnd, IDC_EDITCOMPATIBILITYMODES), 0);
CComBSTR explanation; if (!m_AllowPermLayer) @@ -259,19 +339,14 @@ if (ModeEnabled) m_OSMode = ComboBox_GetCurSel(GetDlgItem(hWnd, IDC_COMPATIBILITYMODE))+1; EnableWindow(GetDlgItem(hWnd, IDC_COMPATIBILITYMODE), ModeEnabled); + for (size_t n = 0; g_Layers[n].Name; ++n) { - if (g_Layers[n].Enabled) - { - m_EnabledLayers |= IsDlgButtonChecked(hWnd, g_Layers[n].Id) ? (1<<n) : 0; - ShowWindow(GetDlgItem(hWnd, g_Layers[n].Id), SW_SHOW); - } - else - { - ShowWindow(GetDlgItem(hWnd, g_Layers[n].Id), SW_HIDE); - } - } - if (m_RegistryOSMode != m_OSMode || m_RegistryEnabledLayers != m_EnabledLayers) + m_EnabledLayers |= IsDlgButtonChecked(hWnd, g_Layers[n].Id) ? (1<<n) : 0; + ShowWindow(GetDlgItem(hWnd, g_Layers[n].Id), SW_SHOW); + } + + if (HasChanges()) { PropSheet_Changed(GetParent(hWnd), hWnd); } @@ -297,6 +372,10 @@ UpdateControls(hWnd); break; case IDC_EDITCOMPATIBILITYMODES: + if (DialogBoxParam(g_hModule, MAKEINTRESOURCE(IDD_EDITCOMPATIBILITYMODES), hWnd, EditModesProc, (LPARAM)this) == IDOK) + { + UpdateControls(hWnd); + } break; } return FALSE; @@ -355,6 +434,133 @@
return FALSE; } + +static void ListboxChanged(HWND hWnd) +{ + int Sel = ListBox_GetCurSel(GetDlgItem(hWnd, IDC_COMPATIBILITYMODE)); + EnableWindow(GetDlgItem(hWnd, IDC_EDIT), Sel >= 0); + EnableWindow(GetDlgItem(hWnd, IDC_DELETE), Sel >= 0); +} + +INT_PTR CALLBACK CLayerUIPropPage::EditModesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CLayerUIPropPage* page = NULL; + switch (uMsg) + { + case WM_INITDIALOG: + page = (CLayerUIPropPage*)lParam; + page->AddRef(); + SetProp(hWnd, ACP_WNDPROP, page); + { + CComPtr<IAutoComplete> autoComplete; + HRESULT hr = CoCreateInstance(CLSID_AutoComplete, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAutoComplete, &autoComplete)); + if (SUCCEEDED(hr)) + { + CComPtr<IAutoComplete2> autoComplete2; + hr = autoComplete->QueryInterface(IID_PPV_ARG(IAutoComplete2, &autoComplete2)); + if (SUCCEEDED(hr)) + { + autoComplete2->SetOptions(ACO_AUTOSUGGEST | ACO_UPDOWNKEYDROPSLIST); + HWND Edit = GetDlgItem(hWnd, IDC_NEWCOMPATIBILITYMODE); + CComObject<CLayerStringList>* pList = new CComObject<CLayerStringList>(); + hr = autoComplete2->Init(Edit, pList, NULL, NULL); + } + } + + HWND List = GetDlgItem(hWnd, IDC_COMPATIBILITYMODE); + for (int n = 0; n < page->m_CustomLayers.GetSize(); ++n) + { + const WCHAR* Str = page->m_CustomLayers[n].GetString(); + int Index = ListBox_FindStringExact(List, -1, Str); + if (Index == LB_ERR) + Index = ListBox_AddString(List, Str); + } + } + break; + case WM_ENDSESSION: + case WM_DESTROY: + page = (CLayerUIPropPage*)GetProp(hWnd, ACP_WNDPROP); + RemoveProp(hWnd, ACP_WNDPROP); + page->Release(); + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDC_ADD: + { + HWND Edit = GetDlgItem(hWnd, IDC_NEWCOMPATIBILITYMODE); + int Length = GetWindowTextLengthW(Edit); + CComBSTR Str(Length); + GetWindowTextW(Edit, Str, Length+1); + HWND List = GetDlgItem(hWnd, IDC_COMPATIBILITYMODE); + int Index = ListBox_FindStringExact(List, -1, Str); + if (Index == LB_ERR) + Index = ListBox_AddString(List, Str); + ListBox_SetCurSel(List, Index); + ListboxChanged(hWnd); + Edit_SetText(Edit, TEXT("")); + SetFocus(Edit); + } + break; + case IDC_EDIT: + { + HWND List = GetDlgItem(hWnd, IDC_COMPATIBILITYMODE); + int Cur = ListBox_GetCurSel(List); + int Length = ListBox_GetTextLen(List, Cur); + CComBSTR Str(Length); + ListBox_GetText(List, Cur, Str); + ListBox_DeleteString(List, Cur); + HWND Edit = GetDlgItem(hWnd, IDC_NEWCOMPATIBILITYMODE); + Edit_SetText(Edit, Str); + ListboxChanged(hWnd); + Edit_SetSel(Edit, 30000, 30000); + SetFocus(Edit); + } + break; + case IDC_DELETE: + { + HWND List = GetDlgItem(hWnd, IDC_COMPATIBILITYMODE); + ListBox_DeleteString(List, ListBox_GetCurSel(List)); + ListboxChanged(hWnd); + } + break; + case IDC_COMPATIBILITYMODE: + ListboxChanged(hWnd); + break; + case IDC_NEWCOMPATIBILITYMODE: + EnableWindow(GetDlgItem(hWnd, IDC_ADD), Edit_GetTextLength(GetDlgItem(hWnd, IDC_NEWCOMPATIBILITYMODE)) > 0); + break; + case IDOK: + /* Copy from list! */ + { + page = (CLayerUIPropPage*)GetProp(hWnd, ACP_WNDPROP); + + HWND List = GetDlgItem(hWnd, IDC_COMPATIBILITYMODE); + int Count = ListBox_GetCount(List); + page->m_CustomLayers.RemoveAll(); + for (int Cur = 0; Cur < Count; ++Cur) + { + int Length = ListBox_GetTextLen(List, Cur); + CString Str; + LPWSTR Buffer = Str.GetBuffer(Length + 1); + ListBox_GetText(List, Cur, Buffer); + Str.ReleaseBuffer(Length); + page->m_CustomLayers.Add(Str); + } + } + /* Fall trough */ + case IDCANCEL: + EndDialog(hWnd, LOWORD(wParam)); + break; + } + break; + case WM_CLOSE: + EndDialog(hWnd, IDCANCEL); + break; + } + return FALSE; +} +
STDMETHODIMP CLayerUIPropPage::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hkeyProgID) { @@ -415,4 +621,3 @@
return S_OK; } -
Modified: trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.hpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/acppage/CLayer... ============================================================================== --- trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.hpp [iso-8859-1] (original) +++ trunk/reactos/dll/shellext/acppage/CLayerUIPropPage.hpp [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -1,5 +1,5 @@ /* - * Copyright 2015 Mark Jansen + * Copyright 2015-2017 Mark Jansen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -43,21 +43,23 @@ INT_PTR OnCommand(HWND hWnd, WORD id); void UpdateControls(HWND hWnd); INT_PTR DisableControls(HWND hWnd); + BOOL HasChanges() const;
void OnRefresh(HWND hWnd); void OnApply(HWND hWnd);
static INT_PTR CALLBACK PropDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - /*static INT_PTR CALLBACK EditModesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);*/ + static INT_PTR CALLBACK EditModesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
protected: - CComBSTR m_Filename; + CString m_Filename; BOOL m_IsSfcProtected; BOOL m_AllowPermLayer; DWORD m_LayerQueryFlags; DWORD m_RegistryOSMode, m_OSMode; DWORD m_RegistryEnabledLayers, m_EnabledLayers; + CSimpleArray<CString> m_RegistryCustomLayers, m_CustomLayers;
public: DECLARE_REGISTRY_RESOURCEID(IDR_ACPPAGE)
Modified: trunk/reactos/dll/shellext/acppage/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/acppage/CMakeL... ============================================================================== --- trunk/reactos/dll/shellext/acppage/CMakeLists.txt [iso-8859-1] (original) +++ trunk/reactos/dll/shellext/acppage/CMakeLists.txt [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -5,6 +5,9 @@ # HACK: this should be enabled globally! add_compile_flags_language("-std=c++11" "CXX") endif() + +add_definitions( + -D_ATL_NO_EXCEPTIONS)
include_directories( ${REACTOS_SOURCE_DIR}/sdk/lib/atl @@ -16,6 +19,7 @@ ACPPage.cpp CLayerUIPropPage.cpp CLayerUIPropPage.hpp + CLayerStringList.hpp acppage.spec precomp.h resource.h)
Modified: trunk/reactos/dll/shellext/acppage/precomp.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/shellext/acppage/precom... ============================================================================== --- trunk/reactos/dll/shellext/acppage/precomp.h [iso-8859-1] (original) +++ trunk/reactos/dll/shellext/acppage/precomp.h [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -10,10 +10,15 @@ #include <windef.h> #include <winbase.h> #include <shlobj.h> +#include <tchar.h> +#include <strsafe.h> #include <atlbase.h> #include <atlcom.h> +#include <atlsimpcoll.h> +#include <atlstr.h>
ULONG DbgPrint(PCH Format,...); +#include <apphelp.h>
extern const GUID CLSID_CLayerUIPropPage; extern HMODULE g_hModule; @@ -22,6 +27,7 @@ EXTERN_C BOOL WINAPI GetExeFromLnk(PCWSTR pszLnk, PWSTR pszExe, size_t cchSize);
#include "resource.h" +#include "CLayerStringList.hpp" #include "CLayerUIPropPage.hpp"
#endif /* ACPPAGE_PRECOMP_H */
Modified: trunk/reactos/sdk/lib/atl/atlexcept.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/lib/atl/atlexcept.h?rev... ============================================================================== --- trunk/reactos/sdk/lib/atl/atlexcept.h [iso-8859-1] (original) +++ trunk/reactos/sdk/lib/atl/atlexcept.h [iso-8859-1] Sat Apr 22 17:11:52 2017 @@ -1,6 +1,13 @@
#ifndef __ATLEXCEPT_H__ #define __ATLEXCEPT_H__ + + +#ifdef _ATL_NO_EXCEPTIONS +#if !defined(STATUS_NO_MEMORY) && defined(WIN32_NO_STATUS) +#define STATUS_NO_MEMORY ((DWORD)0xC0000017) +#endif +#endif
//FIXME: Enable when RaiseException is marked as NORETURN