Hi,
I figured out what I was doing wrong. I'll give a description here of the 
problem and the solution.
Hopefully this will be usefull for someone.

The original problem was that, when I switched to Python 2.6.x and 
cx_Freeze-4.0.1.win32-py2.6.msi,
the executables that were produced ran perfectly on my PC but not any other PC. 
They did not print any useful information whatsoever.

Googling around, I learned that it had to do with Visual Studio being installed 
on my PC and not on the other PC's.
The common solution that worked for other people was to put the redistributable 
manifest and DLL's from
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT,
into the same directory as the generated EXE.

This didn't work for me.
With the help of Anthony Tuininga, I finally tracked it down to the DLL version.

In the good ol' days, when your application was lacking the C rntime library 
DLL in its search path, it gave a clear warning.
e.g. "can not find msvcr71.dll" or something like that.
The only thing you needed to do was to go look for one (either on your PC or on 
the internet), and pluck whatever DLL
with that name into the search path, typically in the same directory as your 
exe or windows\system32.
It didn't care about different versions of DLL's.


Now with the advent of at least Visual Studio 2008 (and probably 2005, but I 
skipped that one), Microsoft, in its infinite wisdom,
decided that that method was way too easy for everyone and came up with yet 
another way to torment everyone that dares
to develop software in anything else than Microsoft monstrosities.
I am referring to these mysterious things with names like "side by side 
installation", "SxS", "manifests", "assemblies", ...

Why does the noble community of enlightened scholars developing Python care at 
all ? Because Python 2.6 binaries for Windows
is now compiled using Visual Studio 2008. In essence, that should not mean more 
than replacing your msvcr71.dll
with msvcr90.dll. Unfortunately, you inherit this "assemblies" crap with it.

The new terminology invented with this and the MSDN articles on this subject 
make it only more complicated than it should be.
In a nutshell, DLL's now are attributed with a version number. Executables 
generated with VS2008 are now restricted to run
only with a predefined specific version of a DLL. This allows you to run 
executable A with version X of a DLL and another exe
with version Y of that same DLL and not be affected with obscure bugs caused by 
pairing the wrong version of a DLL with an exe
(the infamous DLL hell).

How do you pair an exe with a particular DLL version ? That is done with 
manifest files, basically a small XML file, listing the exact version number 
and some obscure hash numbers for integrity checking. I haven't figured out how 
to manually produce these (VS2008 does this for you)
but fortunately for us, Python developers we don't need to care. We just have 
to use the same one the Python distribution was compiled with.

How do I know which version Python is compiled with ?
The easiest way is to install Python with the option "install just for me". 
This has the result that the msvcrxx.dll used by Python is copied into the 
c:\pythonxx directory instead of in a common windows\system32 folder (or 
something like that).
This was my first mistake, I used the other option "install for other users".

This should not be a problem. cx_Freeze is clever enough to go out and find 
this DLL for you. It will probably find the right one,
PROVIDING you have the right version of the DLL's in your search path.

Now back to Microsoft. Up until around 9/16/2008, there was only 1 version of 
msvcr DLL's, nl. 9.0.21022.8
and that was good, because it happens to be the same version Python was 
installed with.
The only thing you have to do is to accompany your generated exe with a 
manifest with the correct hieroglyphs,
copy this dll in the same directory and you were done.
(you actually need 2 manifest files: one that accompanies to the exe which DLL 
version it needs, and another manifest file that specifies
the versions of the DLL. The exe manifest can be embedded in the exe).

Poor old Anthony Tuininga had to figure this out the hard way. He makes our 
lives a lot easier by already embedding the correct exe manifest
into the executable. YOu can check this by opening the generated binary with a 
hex editor and scroll down until you see some XML. That is the manifest. That 
will tell you which DLL's it need and which version (nl. 9.0.21022.8). It needs 
to be this version because of the version of
Visual Studio 2008 used to compile Python itself.

Having Visual Studio 2008 installed on your PC while freezing your Python apps 
should not be a problem. Even if you didn't specify
"install just for me", cx_Freeze will probably find msvcr90.dll somewhere.

But then came Visual Studio 2008 SP1. With it came an updated msvcr90.dll with 
version 9.00.30729.1.
That is what I had installed and things went south from there.

Recent versions of Windows now come with the directory C:\WINDOWS\WinSxS, in 
where you find all the versions of these DLL's
(this is what they refer to as "side-by-side installation", i.e. instead of 
copying these common dll's in system32 folder,
every version is now copied in a directory with a particular name, containing 
the version number and all manifest files copied in 
C:\WINDOWS\WinSxS\Manifests).

When I installed VS 2008 SP1, it copied a later version (9.00.30729.1) of msvcr 
in there "side-by-side" with the original version (9.0.21022.8)
which came from the original VS2008 and which I needed to get my frozen 
Python26 exe's to run.
For some reason, Windows couldn't figure out which DLL to choose.

I followed the advise I found on the internet to find the c:\Program 
Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT
folder and copy its content (being Microsoft.VC90.CRT.manifest and msvcr90.dll) 
into my bin directory. This didn't work.
Unfortunately, I had already updated my Visual Studio 2008 to SP1 and this 
using the wrong version (9.00.30729.1)
Had I not updated to SP1, I would not have had this problem.

Not understanding the problem, it looked like I was forced to have all my users 
install the Microsoft Visual C++ 2008 Redistributable Package
before running my tools.

Fortunately, this is not necessary. The solution is very simple:
after having generated your application with cx_Freeze, copy the following 
files (and only these files) to your executable directory:

C:\WINDOWS\WinSxS\Manifests\
x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest

C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375\
msvcm90.dll
msvcp90.dll
msvcr90.dll

I think this applies to py2exe as well.

If you do not have these files, you can download these from the following link:
Microsoft Visual C++ 2008 Redistributable Package (x86) (11/29/2007)
http://www.microsoft.com/downloads/details.aspx?familyid=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=en

note:
beware, there is now an SP1 version of this, which caries the (incorrect) 
9.00.30729.1 version.
I am not sure it carties the (correct) 9.0.21022.8 as well. If it doesn't, you 
need the other installation.
You can find SP1 from:
Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) (9/16/2008)
http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en


note: I don't understand why Microsoft doesn't distribute the C runtime 
libraries (msvcrxx.dll) with the next
Windows Update and squirt that puppy in every Windows PC on the planet.


Hope this helps.

Jef Mangelschots



Any files attached to this e-mail will have been checked with virus detection 
software prior to transmission but you should carry out your own virus check 
before opening any attachment. Safetran Systems Corp does not accept liability 
for any damage or loss which may be caused by software viruses. The contents of 
this e-mail and any attachments are the property of Safetran Systems Corp and 
are intended for the confidential use by the named recipient only. They may be 
legally privileged and should not be communicated to, or relied upon, by any 
other person without written consent. If you are not the addressee, please 
notify us immediately at the following address:  Safetran Systems Corporation, 
2400 Nelson Miller Parkway, Louisville, Kentucky 40223. Safetran Systems Corp 
is a subsidiary of  Invensys Plc.  Registered office: Portland House, 
Bressenden Place, London, SW1E 5BF. UK Registered in England and Wales No. 
1641421.

------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you.  Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
cx-freeze-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cx-freeze-users

Reply via email to