From: Michael H. <Michael@Hipp.com> - 2010-08-24 21:19:42
|
Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as indicated. If I add it alongside the .exe it says "loaded improperly". Thanks, Michael # ======================================================== # # File automagically generated by GUI2Exe version 0.5.0 # Copyright: (c) 2007-2009 Andrea Gavana # ======================================================== # # Let's start with some default (for me) imports... from distutils.core import setup from py2exe.build_exe import py2exe import glob import os import zlib import shutil # Remove the build folder shutil.rmtree("build", ignore_errors=True) manifest_template = """ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="5.0.0.0" processorArchitecture="x86" name="auction" type="win32" /> <description>auction Program</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly> """ class Target(object): """ A simple class that holds information on our executable file. """ def __init__(self, **kw): """ Default class constructor. Update as you need. """ self.__dict__.update(kw) # Ok, let's explain why I am doing that. # Often, data_files, excludes and dll_excludes (but also resources) # can be very long list of things, and this will clutter too much # the setup call at the end of this file. So, I put all the big lists # here and I wrap them using the textwrap module. data_files = [('Microsoft.VC90.CRT', ['C:\\dev\\resources\\ms-vc-runtime\\Microsoft.VC90.CRT.manifest', 'C:\\dev\\resources\\ms-vc-runtime\\msvcp90.dll', 'C:\\dev\\resources\\ms-vc-runtime\\msvcr90.dll'])] includes = ['wx.lib.pubsub'] excludes = ['_gtkagg', '_tkagg', 'bsddb', 'curses', 'email', 'pywin.debugger', 'pywin.debugger.dbgcon', 'pywin.dialogs', 'tcl', 'Tkconstants', 'Tkinter'] packages = ['wx', 'wx.lib', 'wx.lib.pubsub'] dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll', 'msvcp90.dll'] icon_resources = [] bitmap_resources = [] other_resources = [(24, 1, manifest_template)] # This is a place where the user custom code may go. You can do almost # whatever you want, even modify the data_files, includes and friends # here as long as they have the same variable name that the setup call # below is expecting. # No custom code added # Ok, now we are going to build our target class. # I chose this building strategy as it works perfectly for me :-D GUI2Exe_Target_1 = Target( # what to build script = "main.py", icon_resources = icon_resources, bitmap_resources = bitmap_resources, other_resources = other_resources, dest_base = "auction", version = "0.1", company_name = "No Company", copyright = "No Copyrights", name = "Py2Exe Sample File", ) # Used to build a simple Inno Setup script (courtesy of the wxPython Wiki). class InnoScript(object): """ Class that builds a simple InnoSetup script. """ def __init__(self, name, lib_dir, dist_dir, windows_exe_files=[], console_exe_files=[], lib_files=[], version="0.1"): """ Default class constructor. """ self.lib_dir = lib_dir self.dist_dir = dist_dir if not self.dist_dir.endswith(os.sep): self.dist_dir += os.sep self.name = name self.version = version self.windows_exe_files = [self.chop(p) for p in windows_exe_files] self.console_exe_files = [self.chop(p) for p in console_exe_files] self.lib_files = [self.chop(p) for p in lib_files] def chop(self, pathname): """ Returns the path relative to `self.dist_dir`. """ assert pathname.startswith(self.dist_dir) return pathname[len(self.dist_dir):] def create(self, pathname=None): """ Creates the simple InnoSetup script. """ if pathname is None: self.pathname = os.path.join(self.dist_dir, self.name + os.extsep + "iss") else: self.pathname = pathname self.file = open(self.pathname, "w") self.file.write("; WARNING: This script has been created by GUI2Exe. Changes to this script" + os.linesep) self.file.write("; will be overwritten the next time GUI2Exe is run!" + os.linesep) self.file.write(os.linesep) self.file.write(r"[Setup]" + os.linesep) self.file.write(r"AppName=" + self.name + os.linesep) self.file.write(r"AppVerName=" + self.name + " " + self.version + os.linesep) self.file.write(r"DefaultDirName={pf}/" + self.name + os.linesep) self.file.write(r"DefaultGroupName=" + self.name + os.linesep) self.file.write(r"OutputBaseFilename=" + self.name + "-" + self.version + "-setup" + os.linesep) self.file.write(os.linesep) self.file.write(r"[Files]" + os.linesep) for path in self.windows_exe_files + self.console_exe_files + self.lib_files: self.file.write(r'Source: "' + path + '"; DestDir: "{app}/' + os.path.dirname(path) + '"; Flags: ignoreversion' + os.linesep) self.file.write(os.linesep) self.file.write(r"[Icons]" + os.linesep) self.file.write(r";This section must be customized and edited as needed!" + os.linesep) for path in self.windows_exe_files: self.file.write(r';Name: "{group}/' + self.name + '"; Filename: "{app}/' + path + '"' + os.linesep) self.file.write(';Name: "{group}/Uninstall ' + self.name + '"; Filename: "{uninstallexe}"' + os.linesep) self.file.write(os.linesep) def compile(self, compilercmd="compile"): """ Compiles the script using InnoSetup. """ import warnings try: import ctypes except ImportError: try: import win32api except ImportError: os.startfile(self.pathname) else: win32api.ShellExecute(0, compilercmd, self.pathname, None, None, 0) else: res = ctypes.windll.shell32.ShellExecuteA(0, compilercmd, self.pathname, None, None, 0) if res < 32: strs = "Unable to open Inno Setup script. Error code is " + repr(res) + "." + os.linesep strs += "Are you sure the `iss` extension is associated to an application?" warnings.warn(strs) # Define our own command class based on py2exe so we can perform some # customizations, and in particular support UPXing the binary files and # creating simple Inno Setup scripts. class Py2exe(py2exe): """ Overridden class to handle UPX compression and the creation of simple Inno Setup scripts. """ def initialize_options(self): """ Initialize the default options for py2exe. """ # Add a new "upx" option for compression with upx py2exe.initialize_options(self) self.upx = False self.inno = True self.upx_checked = False def run(self): """ Actually run py2exe. """ # First, let py2exe do it's work. py2exe.run(self) if not self.inno: return lib_dir = self.lib_dir dist_dir = self.dist_dir # create the Installer, using the files py2exe has created. script = InnoScript("auction", lib_dir, dist_dir, self.windows_exe_files, self.console_exe_files, self.lib_files, version="0.1") print "*** creating the Inno Setup script***" script.create() print "*** compiling the Inno Setup script***" script.compile(None) # Note: By default the final setup.exe will be in an Output subdirectory. def has_upx(self): """ Returns whether UPX is installed and can be found on the PATH. """ try: os.system('upx --help') except OSError, e: self.upx = False import warnings warnings.warn("Unable to find UPX. Are you sure UPX is in your PATH?") self.upx_checked = True def copy_file(self, *args, **kwargs): """ Overridden to allow UPXing of binary files. """ (fname, copied) = result = py2exe.copy_file(self, *args, **kwargs) if self.upx and not self.upx_checked: self.has_upx() if not self.upx: return result basename = os.path.basename(fname) if (copied and self.upx and (basename[:6]+basename[-4:]).lower() != 'python.dll' and fname[-4:].lower() in ('.pyd', '.dll')): os.system('upx --best "' + os.path.normpath(fname) + '"') return result def patch_python_dll_winver(self, dll_name, new_winver=None): """ Overridden to first check if the file is upx'd and skip if so. """ if not self.dry_run and self.upx: if not os.system('upx -qt "' + dll_name + '" > nul'): if self.verbose: print "Skipping setting sys.winver for " + dll_name + " (UPX'd)" else: py2exe.patch_python_dll_winver(self, dll_name, new_winver) basename = os.path.basename(dll_name) if (basename[:6]+basename[-4:]).lower() == 'python.dll': return # We UPX this one file here rather than in copy_file so # the version adjustment can be successful if self.upx: os.system('upx --best "' + os.path.normpath(dll_name) + '"') # That's serious now: we have all (or almost all) the options py2exe # supports. I put them all even if some of them are usually defaulted # and not used. Some of them I didn't even know about. setup( cmdclass = {"py2exe": Py2exe}, data_files = data_files, options = {"py2exe": {"compressed": 2, "optimize": 2, "includes": includes, "excludes": excludes, "packages": packages, "dll_excludes": dll_excludes, "bundle_files": 1, "dist_dir": "gui2exe", "xref": False, "skip_archive": False, "ascii": False, "custom_boot_script": '', } }, zipfile = None, console = [], windows = [GUI2Exe_Target_1], service = [], com_server = [], ctypes_com_server = [] ) # This is a place where any post-compile code may go. # You can add as much code as you want, which can be used, for example, # to clean up your folders or to do some particular post-compilation # actions. # No post-compilation code added # And we are done. That's a setup script :-D |
From: Andrea G. <and...@gm...> - 2010-08-24 21:24:02
|
Hi Michael, On 25 August 2010 00:19, Michael Hipp wrote: > Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how > do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. > > The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as > indicated. If I add it alongside the .exe it says "loaded improperly". See this page for the SxS hell: http://wiki.wxpython.org/py2exe And in particular the 2 sections on Python 2.5 and 2.6. Andrea. "Imagination Is The Only Weapon In The War Against Reality." http://xoomer.alice.it/infinity77/ ==> Never *EVER* use RemovalGroup for your house removal. You'll regret it forever. http://thedoomedcity.blogspot.com/2010/03/removal-group-nightmare.html <== |
From: Michael H. <Michael@Hipp.com> - 2010-08-24 21:48:16
|
On 8/24/2010 4:23 PM, Andrea Gavana wrote: > Hi Michael, > > On 25 August 2010 00:19, Michael Hipp wrote: >> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >> >> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >> indicated. If I add it alongside the .exe it says "loaded improperly". > > See this page for the SxS hell: > > http://wiki.wxpython.org/py2exe > > And in particular the 2 sections on Python 2.5 and 2.6. Thanks Andrea, but, I've been staring at that page and this one too ... http://www.py2exe.org/index.cgi/Tutorial#Step52 ... for a goodly part of the day. I've been thru this stuff before and thought I understood it. But it seems to be a constantly moving target. I can't see anything that I'm doing substantially different than what's on those pages. Michael |
From: Werner F. B. <wer...@fr...> - 2010-08-25 07:20:23
|
On 24/08/2010 23:48, Michael Hipp wrote: > On 8/24/2010 4:23 PM, Andrea Gavana wrote: >> Hi Michael, >> >> On 25 August 2010 00:19, Michael Hipp wrote: >>> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >>> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >>> >>> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >>> indicated. If I add it alongside the .exe it says "loaded improperly". Check the dll_excludes option on this page: http://wiki.wxpython.org/py2exe-python26 especially the last line is needed. Werner |
From: Michael H. <Michael@Hipp.com> - 2010-08-25 14:03:11
|
On 8/25/2010 2:15 AM, Werner F. Bruhin wrote: > On 24/08/2010 23:48, Michael Hipp wrote: >> On 8/24/2010 4:23 PM, Andrea Gavana wrote: >>> Hi Michael, >>> >>> On 25 August 2010 00:19, Michael Hipp wrote: >>>> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >>>> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >>>> >>>> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >>>> indicated. If I add it alongside the .exe it says "loaded improperly". > Check the dll_excludes option on this page: > http://wiki.wxpython.org/py2exe-python26 > > especially the last line is needed. Thanks. The dll_excludes line on that page says: dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll', 'MSVCP90.dll', 'mswsock.dll', 'powrprof.dll'] Mine now says: dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', 'tk84.dll', 'msvcp90.dll', 'mswsock.dll', 'powrprof.dll'] But I don't understand how that would affect this problem as it is complaining about a missing MSVCR90.DLL. I have this which seems to solve that problem when using straight py2exe: data_files = [('Microsoft.VC90.CRT', ['C:\\dev\\resources\\ms-vc-runtime\\Microsoft.VC90.CRT.manifest', 'C:\\dev\\resources\\ms-vc-runtime\\msvcp90.dll', 'C:\\dev\\resources\\ms-vc-runtime\\msvcr90.dll'])] Michael |
From: Werner F. B. <wer...@fr...> - 2010-08-26 18:07:12
|
On 25/08/2010 16:03, Michael Hipp wrote: > On 8/25/2010 2:15 AM, Werner F. Bruhin wrote: >> On 24/08/2010 23:48, Michael Hipp wrote: >>> On 8/24/2010 4:23 PM, Andrea Gavana wrote: >>>> Hi Michael, >>>> >>>> On 25 August 2010 00:19, Michael Hipp wrote: >>>>> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >>>>> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >>>>> >>>>> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >>>>> indicated. If I add it alongside the .exe it says "loaded improperly". My mistake, didn't read your problem description correctly. >> Check the dll_excludes option on this page: >> http://wiki.wxpython.org/py2exe-python26 >> >> especially the last line is needed. > > Thanks. The dll_excludes line on that page says: > > dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', > 'tk84.dll', > 'MSVCP90.dll', 'mswsock.dll', 'powrprof.dll'] > > Mine now says: > > dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', > 'tk84.dll', 'msvcp90.dll', 'mswsock.dll', 'powrprof.dll'] > > But I don't understand how that would affect this problem as it is complaining > about a missing MSVCR90.DLL. I have this which seems to solve that problem when > using straight py2exe: > > data_files = [('Microsoft.VC90.CRT', > ['C:\\dev\\resources\\ms-vc-runtime\\Microsoft.VC90.CRT.manifest', > > 'C:\\dev\\resources\\ms-vc-runtime\\msvcp90.dll', > > 'C:\\dev\\resources\\ms-vc-runtime\\msvcr90.dll'])] When I run into this type of problem the exe wouldn't run and windows would complain about an incorrect configuration, but not give any details like missing .dll. Similar code is in the Py26 page on the wiki. In my testing I still run into SxS issues when I remove everything from the Windows/SxS folders. IIRC I needed to have at least the vc90 manifest in this folder structure. Werner |
From: Stephen E. <py...@re...> - 2010-08-27 11:22:41
|
On 26/08/2010 19:06, Werner F. Bruhin wrote: > On 25/08/2010 16:03, Michael Hipp wrote: >> On 8/25/2010 2:15 AM, Werner F. Bruhin wrote: >>> On 24/08/2010 23:48, Michael Hipp wrote: >>>> On 8/24/2010 4:23 PM, Andrea Gavana wrote: >>>>> Hi Michael, >>>>> >>>>> On 25 August 2010 00:19, Michael Hipp wrote: >>>>>> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >>>>>> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >>>>>> >>>>>> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >>>>>> indicated. If I add it alongside the .exe it says "loaded improperly". > My mistake, didn't read your problem description correctly. >>> Check the dll_excludes option on this page: >>> http://wiki.wxpython.org/py2exe-python26 >>> >>> especially the last line is needed. >> Thanks. The dll_excludes line on that page says: >> >> dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', >> 'tk84.dll', >> 'MSVCP90.dll', 'mswsock.dll', 'powrprof.dll'] >> >> Mine now says: >> >> dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', >> 'tk84.dll', 'msvcp90.dll', 'mswsock.dll', 'powrprof.dll'] >> >> But I don't understand how that would affect this problem as it is complaining >> about a missing MSVCR90.DLL. I have this which seems to solve that problem when >> using straight py2exe: >> >> data_files = [('Microsoft.VC90.CRT', >> ['C:\\dev\\resources\\ms-vc-runtime\\Microsoft.VC90.CRT.manifest', >> >> 'C:\\dev\\resources\\ms-vc-runtime\\msvcp90.dll', >> >> 'C:\\dev\\resources\\ms-vc-runtime\\msvcr90.dll'])] > When I run into this type of problem the exe wouldn't run and windows > would complain about an incorrect configuration, but not give any > details like missing .dll. > > Similar code is in the Py26 page on the wiki. In my testing I still run > into SxS issues when I remove everything from the Windows/SxS folders. > IIRC I needed to have at least the vc90 manifest in this folder structure. > > Werner The manifest does not seem to be required with wxPython applications. No Microsoft DLLs need be included either. Python 2.6.5, wxPython 2.8.11.0 The manifest appears to be built into wxPython. This is mentioned in the changes/release notes for wxPython 2.8.10.1 The relevant lines extracted from my py2exe setup file: icon_resources = [ (1, 'resources/myicon.ico'), ] dll_excludes = [ 'msvcm90.dll', 'msvcp90.dll', 'msvcr90.dll', ] No manifest, no other Microsoft DLL references. Resulting .exe works fine on XP, Vista & 7. I show the icon_resources line to demonstrate that I have included resources and they work and that I have not manually included a manifest. If an end user is missing the MSVCR90.DLL then IIRC they need to install the Microsoft Visual C++ 2008 SP1 Redistributable Package. Freely downloadable from Microsoft. Stephen |
From: Michael H. <Michael@Hipp.com> - 2010-08-27 12:03:06
|
On 8/27/2010 5:58 AM, Stephen Evans wrote: > If an end user is missing the MSVCR90.DLL then IIRC they need to install > the > Microsoft Visual C++ 2008 SP1 Redistributable Package. Freely downloadable > from Microsoft. That's precisely what I'm trying to avoid - outside dependencies that the user is left to cope with. (Personally I wish MS would just put those "redistributables" into the normal update cycle since so many things depend on them.) At any rate I got mine working with pure py2exe using the manifest and some other DLLs for XP and W2k. Michael |
From: Werner F. B. <wer...@fr...> - 2010-08-27 13:03:17
|
On 27/08/2010 12:58, Stephen Evans wrote: > On 26/08/2010 19:06, Werner F. Bruhin wrote: >> On 25/08/2010 16:03, Michael Hipp wrote: >>> On 8/25/2010 2:15 AM, Werner F. Bruhin wrote: >>>> On 24/08/2010 23:48, Michael Hipp wrote: >>>>> On 8/24/2010 4:23 PM, Andrea Gavana wrote: >>>>>> Hi Michael, >>>>>> >>>>>> On 25 August 2010 00:19, Michael Hipp wrote: >>>>>>> Experimenting with gui2exe, builds fine, finds wx.lib.pubsub just fine ... how >>>>>>> do I sort out the msvcr90.dll stuff in gui2exe? Below is the setup.py it is using. >>>>>>> >>>>>>> The exe dies with "MSVCR90.DLL is missing". But it is in the subdir as >>>>>>> indicated. If I add it alongside the .exe it says "loaded improperly". >> My mistake, didn't read your problem description correctly. >>>> Check the dll_excludes option on this page: >>>> http://wiki.wxpython.org/py2exe-python26 >>>> >>>> especially the last line is needed. >>> Thanks. The dll_excludes line on that page says: >>> >>> dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', >>> 'tk84.dll', >>> 'MSVCP90.dll', 'mswsock.dll', 'powrprof.dll'] >>> >>> Mine now says: >>> >>> dll_excludes = ['libgdk-win32-2.0-0.dll', 'libgobject-2.0-0.dll', 'tcl84.dll', >>> 'tk84.dll', 'msvcp90.dll', 'mswsock.dll', 'powrprof.dll'] >>> >>> But I don't understand how that would affect this problem as it is complaining >>> about a missing MSVCR90.DLL. I have this which seems to solve that problem when >>> using straight py2exe: >>> >>> data_files = [('Microsoft.VC90.CRT', >>> ['C:\\dev\\resources\\ms-vc-runtime\\Microsoft.VC90.CRT.manifest', >>> >>> 'C:\\dev\\resources\\ms-vc-runtime\\msvcp90.dll', >>> >>> 'C:\\dev\\resources\\ms-vc-runtime\\msvcr90.dll'])] >> When I run into this type of problem the exe wouldn't run and windows >> would complain about an incorrect configuration, but not give any >> details like missing .dll. >> >> Similar code is in the Py26 page on the wiki. In my testing I still run >> into SxS issues when I remove everything from the Windows/SxS folders. >> IIRC I needed to have at least the vc90 manifest in this folder structure. >> >> Werner > The manifest does not seem to be required with wxPython applications. > No Microsoft DLLs need be included either. Python 2.6.5, wxPython 2.8.11.0 > > The manifest appears to be built into wxPython. This is mentioned in the > changes/release notes for wxPython 2.8.10.1 > > The relevant lines extracted from my py2exe setup file: > > icon_resources = [ (1, 'resources/myicon.ico'), ] > > dll_excludes = [ 'msvcm90.dll', 'msvcp90.dll', 'msvcr90.dll', ] > > No manifest, no other Microsoft DLL references. Resulting .exe works fine > on XP, Vista& 7. I show the icon_resources line to demonstrate that I have > included resources and they work and that I have not manually included a > manifest. Your systems have the SxS stuff MSVCx then already installed, otherwise you will get errors. > > If an end user is missing the MSVCR90.DLL then IIRC they need to install > the > Microsoft Visual C++ 2008 SP1 Redistributable Package. Freely downloadable > from Microsoft. Like Michael I can't expect users to figure out what else they need beside my program, so only options are: - manually do the MSVCx stuff, i.e. with py2exe or e.g. InnoSetup - include the redist package in ones own installer The setup shown on the wiki for Python 2.6 works for me from Win 2k up to Win 7. However during testing I run into a problem on XP if I manually removed all the MSVCx stuff from the Windows\SxS folder structure to "fake" a system which has never seen the MSVCx stuff. I couldn't get that to work whatever I did and I run out of time to figure it out. I still distribute my own stuff using Py 2.5, will have to look at this again when I switch to 2.6+. Werner |
From: Michael H. <Michael@Hipp.com> - 2010-08-27 14:05:01
|
On 8/27/2010 8:02 AM, Werner F. Bruhin wrote: > The setup shown on the wiki for Python 2.6 works for me from Win 2k up > to Win 7. However during testing I run into a problem on XP if I > manually removed all the MSVCx stuff from the Windows\SxS folder > structure to "fake" a system which has never seen the MSVCx stuff. I > couldn't get that to work whatever I did and I run out of time to figure > it out. > > I still distribute my own stuff using Py 2.5, will have to look at this > again when I switch to 2.6+. I spent almost 2 full days getting this stuff to work with 2.6 and W2k+. Felt like a battle. Hoping not to have to repeat that when I shortly settle into 2.7 for the next several years. I keep suspended copies of W2k and XP Home in VirtualBox - makes it fairly easy to test on clean systems. Michael |