Skip to content

Commit a882ec7

Browse files
katahiromzHBelusca
authored andcommitted
[SHELL32][EXPLORER] Update system-wide environment variables (reactos#663)
- Implement shell32 RegenerateUserEnvironment() function and use it. - CShellBrowser and CDesktopBrowser implements WM_SETTINGCHANGE actions. CORE-1459, CORE-14397
1 parent 25004bb commit a882ec7

File tree

7 files changed

+58
-16
lines changed

7 files changed

+58
-16
lines changed

base/shell/explorer/traywnd.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,12 +2849,12 @@ class CTrayWindow :
28492849
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
28502850
MESSAGE_HANDLER(WM_NCMOUSEMOVE, OnMouseMove)
28512851
MESSAGE_HANDLER(WM_APP_TRAYDESTROY, OnAppTrayDestroy)
2852-
MESSAGE_HANDLER(TWM_OPENSTARTMENU, OnOpenStartMenu)
2853-
MESSAGE_HANDLER(TWM_DOEXITWINDOWS, OnDoExitWindows)
28542852
MESSAGE_HANDLER(WM_CLOSE, OnDoExitWindows)
28552853
MESSAGE_HANDLER(WM_HOTKEY, OnHotkey)
28562854
MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
28572855
MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged)
2856+
MESSAGE_HANDLER(TWM_OPENSTARTMENU, OnOpenStartMenu)
2857+
MESSAGE_HANDLER(TWM_DOEXITWINDOWS, OnDoExitWindows)
28582858
ALT_MSG_MAP(1)
28592859
END_MSG_MAP()
28602860

dll/win32/browseui/shellbrowser.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <shellapi.h>
2424
#include <htiframe.h>
2525
#include <strsafe.h>
26+
#include <undocshell.h>
2627

2728
extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
2829

@@ -599,7 +600,7 @@ class CShellBrowser :
599600
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
600601
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
601602
LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
602-
LRESULT PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
603+
LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
603604
LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
604605
LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
605606
LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
@@ -645,7 +646,7 @@ class CShellBrowser :
645646
MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView)
646647
MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView)
647648
MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
648-
MESSAGE_HANDLER(WM_WININICHANGE, PropagateMessage)
649+
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
649650
COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
650651
COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
651652
COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
@@ -3512,8 +3513,11 @@ LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lPar
35123513
return 0;
35133514
}
35143515

3515-
LRESULT CShellBrowser::PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3516+
LRESULT CShellBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
35163517
{
3518+
LPVOID lpEnvironment;
3519+
RegenerateUserEnvironment(&lpEnvironment, TRUE);
3520+
35173521
SHPropagateMessage(m_hWnd, uMsg, wParam, lParam, TRUE);
35183522
return 0;
35193523
}

dll/win32/shell32/precomp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <wincon.h>
1818
#include <commdlg.h>
1919
#include <ddeml.h>
20+
#include <userenv.h>
2021

2122
#include <shlwapi.h>
2223
#include <shlobj.h>

dll/win32/shell32/shell32.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,48 @@ AddCommasW(DWORD lValue, LPWSTR lpNumber)
6363
return lpNumber;
6464
}
6565

66+
/*
67+
* Implemented
68+
*/
69+
EXTERN_C BOOL
70+
WINAPI
71+
RegenerateUserEnvironment(LPVOID *lpEnvironment, BOOL bUpdateSelf)
72+
{
73+
HANDLE hUserToken;
74+
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ | TOKEN_WRITE, &hUserToken))
75+
return FALSE;
76+
77+
BOOL bResult = CreateEnvironmentBlock(lpEnvironment, hUserToken, TRUE);
78+
if (!bResult || !lpEnvironment)
79+
{
80+
CloseHandle(hUserToken);
81+
return FALSE;
82+
}
83+
84+
if (bUpdateSelf)
85+
{
86+
LPWSTR pszz = (LPWSTR)*lpEnvironment;
87+
if (!pszz)
88+
return FALSE;
89+
90+
while (*pszz)
91+
{
92+
size_t cch = wcslen(pszz);
93+
LPWSTR pchEqual = wcschr(pszz, L'=');
94+
if (pchEqual)
95+
{
96+
CStringW strName(pszz, pchEqual - pszz);
97+
SetEnvironmentVariableW(strName, pchEqual + 1);
98+
}
99+
pszz += cch + 1;
100+
}
101+
}
102+
103+
CloseHandle(hUserToken);
104+
105+
return bResult;
106+
}
107+
66108
/**************************************************************************
67109
* Default ClassFactory types
68110
*/

dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,9 @@ LRESULT CDesktopBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
390390

391391
LRESULT CDesktopBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
392392
{
393+
LPVOID lpEnvironment;
394+
RegenerateUserEnvironment(&lpEnvironment, TRUE);
395+
393396
if (m_hWndShellView)
394397
{
395398
/* Forward the message */

dll/win32/shell32/stubs.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -643,17 +643,6 @@ SHChangeNotifySuspendResume(BOOL bSuspend,
643643
return FALSE;
644644
}
645645

646-
/*
647-
* Unimplemented
648-
*/
649-
EXTERN_C BOOL
650-
WINAPI
651-
RegenerateUserEnvironment(LPVOID *lpUnknown, BOOL bUnknown)
652-
{
653-
FIXME("RegenerateUserEnvironment() stub\n");
654-
return FALSE;
655-
}
656-
657646
/*
658647
* Unimplemented
659648
*/

sdk/include/reactos/undocshell.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,9 @@ typedef struct
526526
* Misc Stuff
527527
*/
528528

529+
BOOL WINAPI
530+
RegenerateUserEnvironment(LPVOID *lpEnvironment, BOOL bUpdateSelf);
531+
529532
/* SHWaitForFileToOpen flags */
530533
#define SHWFF_ADD 0x01
531534
#define SHWFF_REMOVE 0x02

0 commit comments

Comments
 (0)