Berger, Daniel
2008-Mar-24 15:32 UTC
[Win32utils-devel] GetTempPath vs GetEnvironmentVariable vs getenv
Hi all,
I discovered some interesting quirks with regards to getting environment
variable information on Windows. It''s because ''TMP''
is considered a
system environment variable, which you can''t change with
SetEnvironmentVariable() according to the docs.
I also noticed that GetTempPath() returns a full path if you set the
value to a relative path.
Here''s a little program that demonstrates what I''m talking
about:
# Compare getenv/putenv, GetEnvironmentVariable/SetEnvironmentVariable
require ''windows/api''
include Windows
GetTempPath =
API.new(''GetTempPath'',''LP'',''L'')
GetEnvironmentVariable = API.new(''GetEnvironmentVariable'',
''PPL'', ''L'')
SetEnvironmentVariable = API.new(''SetEnvironmentVariable'',
''PP'', ''B'')
Getenv = API.new(''getenv'', ''P'',
''P'', ''msvcrt'')
Putenv = API.new(''_putenv'', ''P'',
''I'', ''msvcrt'')
# ENV
def get_env1(var)
ENV[var]
end
# GetEnvironmentVariable
def get_env2(var)
buf = 0.chr * 260
GetEnvironmentVariable.call(''TMP'', buf, buf.length)
buf.unpack(''A*'').first
end
# GetTempPath, which looks for ''TMP'' first
def get_env3
buf = 0.chr * 260
GetTempPath.call(buf.length, buf)
buf.unpack(''A*'').first
end
# getenv()
def get_env4(var)
Getenv.call(var)
end
puts get_env1(''TMP'') # C:\DOCUME~1\djberge\LOCALS~1\Temp
puts get_env2(''TMP'') # C:\DOCUME~1\djberge\LOCALS~1\Temp
puts get_env3 # C:\DOCUME~1\djberge\LOCALS~1\Temp\
puts get_env4(''TMP'') # C:\DOCUME~1\djberge\LOCALS~1\Temp
# Set ''TMP'' using Ruby''s
ENV[]ENV[''TMP''] = "C:\\foo\\bar"
puts "=" * 40
puts get_env1(''TMP'') # C:\foo\bar
puts get_env2(''TMP'') # C:\foo\bar
puts get_env3 # C:\foo\bar\
puts get_env4(''TMP'') # C:\DOCUME~1\djberge\LOCALS~1\Temp -
oops
# Set ''TMP'' using SetEnvironmentVariable
SetEnvironmentVariable.call(''TMP'', "C:\\zap")
puts "=" * 40
puts get_env1(''TMP'') # C:\zap
puts get_env2(''TMP'') # C:\zap
puts get_env3 # C:\zap\
puts get_env4(''TMP'') # C:\DOCUME~1\djberge\LOCALS~1\Temp -
oops
# Set ''TMP'' using putenv
Putenv.call("TMP=C:\\blah")
puts "=" * 40
puts get_env1(''TMP'') # C:\blah
puts get_env2(''TMP'') # C:\blah
puts get_env3 # C:\blah\
puts get_env4(''TMP'') # C:\blah - ah, there we go
# Set ''TMP'' to a relative path
Putenv.call("TMP=dan")
puts "=" * 40
puts get_env1(''TMP'') # dan
puts get_env2(''TMP'') # dan
puts get_env3 # C:\Documents and Settings\djberge\My
Documents\dan - full
puts get_env4(''TMP'') # dan
The odd thing about TMP is that my shell value doesn''t match the
registry setting. The ''set'' output shows:
TMP=C:\DOCUME~1\djberge\LOCALS~1\Temp
But the registry entry, under
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
Manager\Environment, is set to:
C:\Temp
Anyway, just thought I''d share.
Regards,
Dan
This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and destroy
all copies of the communication and any attachments.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://rubyforge.org/pipermail/win32utils-devel/attachments/20080324/bed374a4/attachment-0001.html
Heesob Park
2008-Mar-25 02:31 UTC
[Win32utils-devel] GetTempPath vs GetEnvironmentVariable vs getenv
Hi, 2008/3/25, Berger, Daniel <Daniel.Berger at qwest.com>:> Hi all, > > I discovered some interesting quirks with regards to getting environment > variable information on Windows. It''s because ''TMP'' is considered a system > environment variable, which you can''t change with SetEnvironmentVariable() > according to the docs. >I don''t think so. ''TMP'' can be changed with SetEnvironmentVariable(). But it affected only the current running process and child processes. Environment variable can be categorized into three levels: process, user and system level. You can change user and System environment variable persistently via registry setting.> The odd thing about TMP is that my shell value doesn''t match the registry > setting. The ''set'' output shows: > > TMP=C:\DOCUME~1\djberge\LOCALS~1\Temp > > But the registry entry, under > HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session > Manager\Environment, is set to: > > C:\Temp >User environment variables are stored in the Registry in the key: HKEY_CURRENT_USER\Environment System variables are found in the key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Refer to http://vlaurie.com/computers2/Articles/environment.htm Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/win32utils-devel/attachments/20080325/64b0e14d/attachment.html