I haven’t looked at Win32::Registry, but this is from the MSDN site:
To programmatically add or modify system environment variables, add them
to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE
message. This allows applications, such as the shell, to pick up your
updates.
So, perhaps there’s some sort of “update” method that broadcasts the
WM_SETTINGCHANGE. Otherwise, your option is OS.reboot. 
Regards,
Dan
···
-----Original Message-----
From: Harry Ohlsen [mailto:harryo@qiqsolutions.com]
Sent: Wednesday, November 05, 2003 10:22 PM
To: ruby-talk ML
Subject: Updating path in windows
I’m writing a simple install script for some software. The
final thing I need to do is to add into the path the
directory where the software has been written.
Using Win32::Registry, I can update what I think are the
right registry entries (for either the user, or the system
overall), but they don’t seem to end up in the path if I open
a new DOS window.
However, if I change the same variables via
ControlPanel/System/Advanced/EnvironmentVariables things work
OK. It seems as though that tool is doing something else
over and above changing the registry.
I assume there must be some API call I need to make to get
Windows to re-read the values from the registry?
Anyone have any ideas?
Cheers,
Harry O.
Berger, Daniel wrote:
I haven’t looked at Win32::Registry, but this is from the MSDN site:
To programmatically add or modify system environment variables, add them
to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE
message. This allows applications, such as the shell, to pick up your
updates.
So, perhaps there’s some sort of “update” method that broadcasts the
WM_SETTINGCHANGE. Otherwise, your option is OS.reboot. 
Yes!
I eventually found some C++ code that did what SETX does. SETX is a command-line utility that comes with some kind of windows administration kit. It does basically what I was trying to do. By looking at the C++ source code I could see that it was broadcasting the WM_SETTINGCHANGE after updating the registry.
Since I’m definitely not much of a Windows programmer, it took me a while to find all the magic numbers, and work out the right types to specify for the parameters to Win32API::new, but I eventually got it working.
Fortunately, I have MSVC++ here at work, so I was able to search the header files to find the magic numbers.
Does anyone know whether there’s a way to get those magic numbers (eg WM_SETTINGCHANGE) directly out of some DLL or something that comes standard with Windows? If not, maybe I’ll write a script that runs through all the Windows C++ header files and generates a Ruby script that defines them all … more likely a bunch of them, to allow pulling in only what a given script needs.
The other thing that would be really nice would be a way to generate the array of strings that Win32API::new takes to specify the parameter types for the system call. Does anyone have an idea how one might be able to do that?
Cheers,
Harry O.
I don’t guess it is possible to get them from DLL. Try
http://www.moonwolf.com/ruby/archive/win32module_20001226b.tar.bz2
Wow! There’s a lot of stuff in there!
Which script do I run to see what it does?
Harry O.
Hi,
I don’t guess it is possible to get them from DLL. Try
http://www.moonwolf.com/ruby/archive/win32module_20001226b.tar.bz2
Wow! There’s a lot of stuff in there!
Fundamentally, files you need should be under win32 directory.
Which script do I run to see what it does?
$ grep -nr SETTING win32/
win32/winuser.rb:1199: WM_SETTINGCHANGE = 26
···
At Fri, 7 Nov 2003 13:03:26 +0900, Harry Ohlsen wrote:
–
Nobu Nakada
$ grep -nr SETTING win32/
win32/winuser.rb:1199: WM_SETTINGCHANGE = 26
Ah!
Did you already have this around or did you just build it?
H.