Skip to content
This repository was archived by the owner on Apr 22, 2023. It is now read-only.

Commit e7c84f8

Browse files
mathiask88orangemocha
authored andcommitted
win,msi: broadcast WM_SETTINGCHANGE after install
Backport 668bde8 from io.js. Original commit message follows: In theory the msi should broadcast a 'WM_SETTINGCHANGE' message to all windows after modifying the PATH environment variable. This ensures that the new PATH is visible to other processes without restarting windows (although it's still necessary to close and reopen active console windows). Unfortunately, the broadcast doesn't always happen, for unknown reasons. That's why this patch adds a custom action that unconditionally broadcasts a WM_SETTINGCHANGE message. Bug: nodejs/node#603 PR: nodejs/node#613 Reviewed-by: Bert Belder <[email protected]> (cherry picked from commit 668bde8) --Node.js commmit metadata-- PR-URL: #25100 Reviewed-By: Julien Gilli <[email protected]> Fixes: #4356
1 parent ad9947e commit e7c84f8

7 files changed

+258
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Release/
2828
*.suo
2929
*.vcproj
3030
*.vcxproj
31+
!custom_actions.vcxproj
3132
*.vcxproj.user
3233
*.vcxproj.filters
3334
UpgradeLog*.XML

tools/msvs/msi/custom_actions.c

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
#define WIN32_LEAN_AND_MEAN
3+
4+
#include <windows.h>
5+
#include <msiquery.h>
6+
#include <wcautil.h>
7+
8+
9+
UINT WINAPI BroadcastEnvironmentUpdate(MSIHANDLE hInstall) {
10+
HRESULT hr = S_OK;
11+
UINT er = ERROR_SUCCESS;
12+
13+
hr = WcaInitialize(hInstall, "BroadcastEnvironmentUpdate");
14+
ExitOnFailure(hr, "Failed to initialize");
15+
16+
SendMessageTimeoutW(HWND_BROADCAST,
17+
WM_SETTINGCHANGE,
18+
0,
19+
(LPARAM) L"Environment",
20+
SMTO_ABORTIFHUNG,
21+
5000,
22+
NULL);
23+
24+
LExit:
25+
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
26+
return WcaFinalize(er);
27+
}
28+
29+
30+
BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason, VOID* dummy) {
31+
switch (ulReason) {
32+
case DLL_PROCESS_ATTACH:
33+
WcaGlobalInitialize(hInst);
34+
break;
35+
36+
case DLL_PROCESS_DETACH:
37+
WcaGlobalFinalize();
38+
break;
39+
}
40+
41+
return TRUE;
42+
}

tools/msvs/msi/custom_actions.def

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
LIBRARY "custom_actions"
2+
3+
EXPORTS
4+
BroadcastEnvironmentUpdate

tools/msvs/msi/custom_actions.vcxproj

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|Win32">
5+
<Configuration>Debug</Configuration>
6+
<Platform>Win32</Platform>
7+
</ProjectConfiguration>
8+
<ProjectConfiguration Include="Debug|x64">
9+
<Configuration>Debug</Configuration>
10+
<Platform>x64</Platform>
11+
</ProjectConfiguration>
12+
<ProjectConfiguration Include="Release|Win32">
13+
<Configuration>Release</Configuration>
14+
<Platform>Win32</Platform>
15+
</ProjectConfiguration>
16+
<ProjectConfiguration Include="Release|x64">
17+
<Configuration>Release</Configuration>
18+
<Platform>x64</Platform>
19+
</ProjectConfiguration>
20+
</ItemGroup>
21+
<PropertyGroup Label="Globals">
22+
<ProjectGuid>{B70585F8-DAB7-40FA-9904-13CF53A73A06}</ProjectGuid>
23+
<RootNamespace>BroadcastPathUpdateCustomAction</RootNamespace>
24+
<Keyword>Win32Proj</Keyword>
25+
<ProjectName>custom_actions</ProjectName>
26+
</PropertyGroup>
27+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
28+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
29+
<ConfigurationType>DynamicLibrary</ConfigurationType>
30+
<PlatformToolset>v120</PlatformToolset>
31+
<CharacterSet>Unicode</CharacterSet>
32+
<WholeProgramOptimization>true</WholeProgramOptimization>
33+
</PropertyGroup>
34+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
35+
<ConfigurationType>DynamicLibrary</ConfigurationType>
36+
<PlatformToolset>v120</PlatformToolset>
37+
<CharacterSet>Unicode</CharacterSet>
38+
<WholeProgramOptimization>true</WholeProgramOptimization>
39+
</PropertyGroup>
40+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
41+
<ConfigurationType>DynamicLibrary</ConfigurationType>
42+
<PlatformToolset>v120</PlatformToolset>
43+
<CharacterSet>Unicode</CharacterSet>
44+
</PropertyGroup>
45+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
46+
<ConfigurationType>DynamicLibrary</ConfigurationType>
47+
<PlatformToolset>v120</PlatformToolset>
48+
<CharacterSet>Unicode</CharacterSet>
49+
</PropertyGroup>
50+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
51+
<ImportGroup Label="ExtensionSettings">
52+
</ImportGroup>
53+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
54+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
55+
</ImportGroup>
56+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
57+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
58+
</ImportGroup>
59+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
60+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
61+
</ImportGroup>
62+
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
63+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
64+
</ImportGroup>
65+
<PropertyGroup Label="UserMacros" />
66+
<PropertyGroup>
67+
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
68+
</PropertyGroup>
69+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
70+
<LinkIncremental>true</LinkIncremental>
71+
</PropertyGroup>
72+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
73+
<LinkIncremental>true</LinkIncremental>
74+
</PropertyGroup>
75+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
76+
<LinkIncremental>false</LinkIncremental>
77+
</PropertyGroup>
78+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
79+
<LinkIncremental>false</LinkIncremental>
80+
</PropertyGroup>
81+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
82+
<ClCompile>
83+
<Optimization>Disabled</Optimization>
84+
<AdditionalIncludeDirectories>$(WIX)sdk\VS2013\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
85+
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
86+
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
87+
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
88+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
89+
<WarningLevel>Level3</WarningLevel>
90+
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
91+
</ClCompile>
92+
<Link>
93+
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
94+
<AdditionalLibraryDirectories>$(WIX)sdk\VS2013\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
95+
<ModuleDefinitionFile>custom_actions.def</ModuleDefinitionFile>
96+
<GenerateDebugInformation>true</GenerateDebugInformation>
97+
<SubSystem>Windows</SubSystem>
98+
</Link>
99+
</ItemDefinitionGroup>
100+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
101+
<ClCompile>
102+
<Optimization>Disabled</Optimization>
103+
<AdditionalIncludeDirectories>$(WIX)sdk\VS2013\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
104+
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
105+
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
106+
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
107+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
108+
<WarningLevel>Level3</WarningLevel>
109+
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
110+
</ClCompile>
111+
<Link>
112+
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
113+
<AdditionalLibraryDirectories>$(WIX)sdk\VS2013\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
114+
<ModuleDefinitionFile>custom_actions.def</ModuleDefinitionFile>
115+
<GenerateDebugInformation>true</GenerateDebugInformation>
116+
<SubSystem>Windows</SubSystem>
117+
</Link>
118+
</ItemDefinitionGroup>
119+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
120+
<ClCompile>
121+
<Optimization>MaxSpeed</Optimization>
122+
<IntrinsicFunctions>true</IntrinsicFunctions>
123+
<AdditionalIncludeDirectories>$(WIX)sdk\VS2013\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
124+
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
125+
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
126+
<FunctionLevelLinking>true</FunctionLevelLinking>
127+
<WarningLevel>Level3</WarningLevel>
128+
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
129+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
130+
<PrecompiledHeaderFile>
131+
</PrecompiledHeaderFile>
132+
<PrecompiledHeaderOutputFile>
133+
</PrecompiledHeaderOutputFile>
134+
</ClCompile>
135+
<Link>
136+
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
137+
<AdditionalLibraryDirectories>$(WIX)sdk\VS2013\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
138+
<ModuleDefinitionFile>custom_actions.def</ModuleDefinitionFile>
139+
<GenerateDebugInformation>true</GenerateDebugInformation>
140+
<SubSystem>Windows</SubSystem>
141+
<OptimizeReferences>true</OptimizeReferences>
142+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
143+
</Link>
144+
</ItemDefinitionGroup>
145+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
146+
<ClCompile>
147+
<Optimization>MaxSpeed</Optimization>
148+
<IntrinsicFunctions>true</IntrinsicFunctions>
149+
<AdditionalIncludeDirectories>$(WIX)sdk\VS2013\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
150+
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
151+
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
152+
<FunctionLevelLinking>true</FunctionLevelLinking>
153+
<WarningLevel>Level3</WarningLevel>
154+
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
155+
<PrecompiledHeader>NotUsing</PrecompiledHeader>
156+
<PrecompiledHeaderFile>
157+
</PrecompiledHeaderFile>
158+
<PrecompiledHeaderOutputFile>
159+
</PrecompiledHeaderOutputFile>
160+
</ClCompile>
161+
<Link>
162+
<AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
163+
<AdditionalLibraryDirectories>$(WIX)sdk\VS2013\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
164+
<ModuleDefinitionFile>custom_actions.def</ModuleDefinitionFile>
165+
<GenerateDebugInformation>true</GenerateDebugInformation>
166+
<SubSystem>Windows</SubSystem>
167+
<OptimizeReferences>true</OptimizeReferences>
168+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
169+
</Link>
170+
</ItemDefinitionGroup>
171+
<ItemGroup>
172+
<ClCompile Include="custom_actions.c">
173+
</ClCompile>
174+
</ItemGroup>
175+
<ItemGroup>
176+
<None Include="custom_actions.def" />
177+
</ItemGroup>
178+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
179+
<ImportGroup Label="ExtensionTargets">
180+
</ImportGroup>
181+
</Project>

tools/msvs/msi/nodemsi.sln

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 11.00
33
# Visual Studio 2010
44
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "nodemsi", "nodemsi.wixproj", "{1D808FF0-B5A9-4BE9-859D-B334B6F48BE2}"
55
EndProject
6+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "custom_actions", "custom_actions.vcxproj", "{B70585F8-DAB7-40FA-9904-13CF53A73A06}"
7+
EndProject
68
Global
79
GlobalSection(SolutionConfigurationPlatforms) = preSolution
810
Debug|x64 = Debug|x64
@@ -19,6 +21,14 @@ Global
1921
{1D808FF0-B5A9-4BE9-859D-B334B6F48BE2}.Release|x64.Build.0 = Release|x64
2022
{1D808FF0-B5A9-4BE9-859D-B334B6F48BE2}.Release|x86.ActiveCfg = Release|x86
2123
{1D808FF0-B5A9-4BE9-859D-B334B6F48BE2}.Release|x86.Build.0 = Release|x86
24+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Debug|x64.ActiveCfg = Debug|x64
25+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Debug|x64.Build.0 = Debug|x64
26+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Debug|x86.ActiveCfg = Debug|Win32
27+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Debug|x86.Build.0 = Debug|Win32
28+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Release|x64.ActiveCfg = Release|x64
29+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Release|x64.Build.0 = Release|x64
30+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Release|x86.ActiveCfg = Release|Win32
31+
{B70585F8-DAB7-40FA-9904-13CF53A73A06}.Release|x86.Build.0 = Release|Win32
2232
EndGlobalSection
2333
GlobalSection(SolutionProperties) = preSolution
2434
HideSolutionNode = FALSE

tools/msvs/msi/nodemsi.wixproj

+10
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@
5656
<ItemGroup>
5757
<EmbeddedResource Include="WixUI_en-us.wxl" />
5858
</ItemGroup>
59+
<ItemGroup>
60+
<ProjectReference Include="custom_actions.vcxproj">
61+
<Name>custom_actions</Name>
62+
<Project>{b70585f8-dab7-40fa-9904-13cf53a73a06}</Project>
63+
<Private>True</Private>
64+
<DoNotHarvest>True</DoNotHarvest>
65+
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
66+
<RefTargetDir>INSTALLFOLDER</RefTargetDir>
67+
</ProjectReference>
68+
</ItemGroup>
5969
<Import Project="$(WixTargetsPath)" />
6070
<Target Name="BeforeBuild">
6171
<HeatDirectory ToolPath="$(WixToolPath)" Directory="..\..\..\deps\npm" PreprocessorVariable="var.NpmSourceDir" DirectoryRefId="NodeModulesFolder" ComponentGroupName="NpmSourceFiles" GenerateGuidsNow="true" SuppressFragments="false" OutputFile="..\..\..\npm.wxs" RunAsSeparateProcess="true">

tools/msvs/msi/product.wxs

+10
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,17 @@
237237
</Component>
238238
</DirectoryRef>
239239

240+
<Binary Id='BroadcastEnvironmentUpdate'
241+
SourceFile='$(var.custom_actions.TargetDir)$(var.custom_actions.TargetName).dll' />
242+
243+
<CustomAction Id="BroadcastEnvironmentUpdate"
244+
BinaryKey="BroadcastEnvironmentUpdate"
245+
DllEntry="BroadcastEnvironmentUpdate"
246+
Execute="immediate"
247+
Return="check" />
248+
240249
<InstallExecuteSequence>
250+
<Custom Action='BroadcastEnvironmentUpdate' After='InstallFinalize'/>
241251
</InstallExecuteSequence>
242252

243253
<UI Id="NodeInstallUI">

0 commit comments

Comments
 (0)