Hi,
I'm working on an Excel COM add-in with Python 3.3 / pywin32 v219. Everything works fine, except when I'm trying to cx_Freeze my app to distribute it.
The RegisterServer function doesn't create all requested keys in the windows registery.
You will find below a diff for my HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID{C5482ECA-F559-45A0-B078-B2036E6F011A} key.
| Normal environment | Frozen environment | Status |
|---|---|---|
| \Debugging | \Debugging | OK |
| \Implemented Categories | Not created | missing key, but doesn't seem mandatory |
| \Implemented Categories\{B3EF80D0-68E2-11D0-A689-00C04FD658FF} | Not created | doesn't seem mandatory |
| \InprocServer32 | Not created | seems mandatory |
| \ProgID | \ProgID | OK |
| \PythonCOM | \PythonCOM | OK |
| \PythonCOMDispatcher | \PythonCOMDispatcher | OK (debug mode only) |
| \PythonCOMPath | Not created | seems mandatory |
| \PythonCOMPolicy | \PythonCOMPolicy | OK |
When I create thoses registry keys by hand, my add-in registers in Excel.
Further researches in the register process shows me that the frozen case is implemented in win32com.server.register.RegisterServer(), but I don't know if cx_Freeze provides all requested env vars.
if pythoncom.frozen:
if hasattr(sys, "frozendllhandle"):
dllName = win32api.GetModuleFileName(sys.frozendllhandle)
else:
raise RuntimeError("We appear to have a frozen DLL, but I don't know the DLL to use")
# Frozen apps don't need their directory on sys.path
if not pythoncom.frozen:
scriptDir = os.path.split(sys.argv[0])[0]
if not scriptDir: scriptDir = "."
addnPath = win32api.GetFullPathName(scriptDir)
As I'm a new Python user, maybe I miss something with cx_freeze (need to provide more elements to make pywin32 works in frozen env ?), or maybe cx_freeze is not the best tool to freeze my pywin32 app ?
Hope to read you soon,
Best regards,
Jonathan