Hello,

I've got a program that is using COM client programming for Excel and National Instruments TestStand. It uses these types of lines in Python to generate the COM interface:

   # Run makepy process for all of:
   #     "Microsoft Office 10.0 Object Library"
   #     "Microsoft Office 11.0 Object Library"
   #     "Microsoft Office 12.0 Object Library"
# referenced by its CLSID and version. This CLSID and version information was obtained
   # using the command: makepy.py -i "Microsoft Office 10.0 Object Library"
win32com.client.gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 2) win32com.client.gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 3) win32com.client.gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 4) # Load the "Microsoft Office x.0 Object Library" type library for constants
   # such as win32com.client.constants.msoAutomationSecurityForceDisable
# This is not required if the makepy process has been run automatically (see above). # It is only required if makepy.py was run manually as a separate installation step. win32com.client.gencache.GetModuleForCLSID("{000672AC-0000-0000-C000-000000000046}") # Run makepy process for "Microsoft Excel 11.0 Object Library" # referenced by its CLSID and version. This CLSID and version information was obtained
   # using the command: makepy.py -i "Microsoft Excel 11.0 Object Library"
win32com.client.gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 5) #win32com.client.gencache.GetModuleForCLSID("{00024500-0000-0000-C000-000000000046}")

(I'm not sure if it's necessary to call win32com.client.gencache.EnsureModule for each minor version number, but that aside...)

This doesn't seem to work well when the program is converted using cx_Freeze. It seems that win32com.client.gencache is not willing to dynamically create interfaces since it regards the cache as "read-only". Well, it "kind-of" seems to work, in that Excel COM can be initiated by

   xl_app = win32com.client.DispatchEx("Excel.Application")

however constants are not recognised--e.g.

   win32com.client.constants.xlUpdateLinksNever

In the past, I've used py2exe and found this trick (that I found somewhere on the 'net) seems to work:

   if win32com.client.gencache.is_readonly == True:
#allow gencache to create the cached wrapper objects
       win32com.client.gencache.is_readonly = False
# under py2exe the call in gencache to __init__() does not happen
       # so we use Rebuild() to force the creation of the gen_py folder
       win32com.client.gencache.Rebuild()
# NB You must ensure that the python...\win32com.client.gen_py dir does not exist
       # to allow creation of the cache in %temp%

However it doesn't seem to achieve the same effect with cx_Freeze.

Any ideas?

At the moment, I've got the program running okay with the following steps:

1) Run the original Python program. That should generate the COM client interface files under Python's directory for win32com.gen_py. E.g. C:\Python26\Lib\site-packages\win32com\gen_py 2) In the setup.py program for cx_Freeze, specify options for 'build_exe', specifically the 'packages' option, with a list that includes 'win32com.gen_py'. E.g.:
setup(
   ...
   options = {
       'build_exe': {
           ...
           'packages': [ 'win32com.gen_py' ],
           ...
       },
   ...
)

That includes my PC's gen_py cache contents in the cx_Freeze build, and the program runs okay then. But I assume it would not run properly on a PC that contained e.g. a different version of Excel.

Is there a better way to do this COM client type lib stuff with cx_Freeze?

Regards,
Craig McQueen

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
cx-freeze-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cx-freeze-users

Reply via email to