Issue #3881: Help Tcl to load even when started through the

unreadable local symlink to "Program Files" on Vista.
This commit is contained in:
Martin v. Löwis 2009-01-24 15:47:27 +00:00
parent 7d7e1b7c2e
commit f081e1c9d9
2 changed files with 38 additions and 0 deletions

View File

@ -10,6 +10,40 @@ import sys, os
# <TCL_LIBRARY>\..\tcl<TCL_VERSION>, so anything close to
# the real Tcl library will do.
# Expand symbolic links on Vista
try:
import ctypes
ctypes.windll.kernel32.GetFinalPathNameByHandleW
except (ImportError, AttributeError):
def convert_path(s):
return s
else:
def convert_path(s):
if isinstance(s, str):
s = s.decode("mbcs")
hdir = ctypes.windll.kernel32.\
CreateFileW(s, 0x80, # FILE_READ_ATTRIBUTES
1, # FILE_SHARE_READ
None, 3, # OPEN_EXISTING
0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
None)
if hdir == -1:
# Cannot open directory, give up
return s
buf = ctypes.create_unicode_buffer(u"", 32768)
res = ctypes.windll.kernel32.\
GetFinalPathNameByHandleW(hdir, buf, len(buf),
0) # VOLUME_NAME_DOS
ctypes.windll.kernel32.CloseHandle(hdir)
if res == 0:
# Conversion failed (e.g. network location)
return s
s = buf[:res]
# Ignore leading \\?\
if s.startswith(u"\\\\?\\"):
s = s[4:]
return s
prefix = os.path.join(sys.prefix,"tcl")
if not os.path.exists(prefix):
# devdir/../tcltk/lib
@ -17,6 +51,7 @@ if not os.path.exists(prefix):
prefix = os.path.abspath(prefix)
# if this does not exist, no further search is needed
if os.path.exists(prefix):
prefix = convert_path(prefix)
if not os.environ.has_key("TCL_LIBRARY"):
for name in os.listdir(prefix):
if name.startswith("tcl"):

View File

@ -145,6 +145,9 @@ Core and Builtins
Library
-------
- Issue #3881: Help Tcl to load even when started through the
unreadable local symlink to "Program Files" on Vista.
- Issue #4710: Extract directories properly in the zipfile module;
allow adding directories to a zipfile.