Hello, I'm trying to create an addin for Outlook 2002 using the one provided in the demo of win32com as a starting point. I've been able to do my addin and test it if I go the "standard" way (using the python interpreter). But now, I want other poeple to use it to I want to freeze it for windows using py2exe and py2exe is giving me a headache.
First, I cannot seem to be able to register my addin with the resulting executable. I've tried "directly" by creating only an executable and I tried the same way the SpamBayes addin seems to be done, creating a dll and registering that dll. no success. Second, this one is more obscur and seems like a corrupt library to me. If I import wx in my script, the executable won`t work. I get the following error: ------------------ Traceback (most recent call last): File "outlookAddin.py", line 39, in ? File "SaveOMaticApp.pyc", line 4, in ? File "wx\__init__.pyc", line 42, in ? File "wx\_core.pyc", line 164, in ? AttributeError: 'module' object has no attribute 'SIZE_FORCE' --------------- outlookAddin imports SaveOMaticApp which simply imports wx. No where I use "SIZE_FORCE" and even wx\_core.py doesn't use SIZE_FORCE. Now, I get this error here but not on my home computer which makes me think it's a corrupt library or something. But I would really appreciate if someone could help be to register my addin. Here's my addin code. Again, this work using the Python interpreter: -------------------- oulookAddin.py ---------------- mport win32com.server.register import win32api import win32com from win32com import universal from win32com.server.exception import COMException from win32com.client import gencache, DispatchWithEvents import winerror import pythoncom from win32com.client import constants import sys import os from SaveOMaticApp import BoaApp import database import _winreg # Support for COM objects we use. gencache.EnsureModule('{00062FFF-0000-0000-C000-000000000046}', 0, 9, 0, bForDemand=True) # Outlook 9 gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9 # The TLB defiining the interfaces we implement universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"]) class SaveOMaticButtonEvent: def OnClick(self, button, cancel): import win32ui try: #myApp=BoaApp(0,OutlookItem=self.Parent.Parent.CurrentItem) #myApp.MainLoop() pass except: win32ui.MessageBox("Ca marche pas" ,"My Addin") class InspectorsEvent: def OnNewInspector(self,inspector): if not inspector.IsWordMail(): bars = inspector.CommandBars toolbar = bars.Item("Standard") for x in toolbar.Controls: if x.Caption=="Save-O-Matic": item = x break else: item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True) item = self.toolbarButton = DispatchWithEvents(item,SaveOMaticButtonEvent) item.Caption="Save-O-Matic" item.TooltipText="Fill this item" item.Enabled=true class FolderEvent: def OnItemAdd(self, item): try: print "An item was added to the inbox with subject:", item.Subject except AttributeError: print "An item was added to the inbox, but it has no subject! - ", repr(item) class OutlookAddin: _com_interfaces_ = ['_IDTExtensibility2'] _public_methods_ = [] _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER _reg_clsid_ = "{0F47D9F3-598B-4d24-B7E3-92AC15ED27E2}" _reg_progid_ = "Python.Test.OutlookAddin" _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy" _reg_class_spec_ = "SaveOMatic.outlookAddin.OutlookAddin" def OnConnection(self, application, connectMode, addin, custom): print "OnConnection", application, connectMode, addin, custom # ActiveExplorer may be none when started without a UI (eg, WinCE synchronisation) #self.myInspectors = DispatchWithEvents(application.Inspectors,InspectorsEvent) activeExplorer = application.ActiveExplorer() if activeExplorer is not None: bars = activeExplorer.CommandBars toolbar = bars.Item("Standard") item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True) # Hook events for the item item = self.toolbarButton = DispatchWithEvents(item, ButtonEvent) item.Caption="Python" item.TooltipText = "Click for Python" item.Enabled = True def OnDisconnection(self, mode, custom): print "OnDisconnection" def OnAddInsUpdate(self, custom): print "OnAddInsUpdate", custom def OnStartupComplete(self, custom): print "OnStartupComplete", custom def OnBeginShutdown(self, custom): print "OnBeginShutdown", custom def RegisterAddin(klass): key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins") subkey = _winreg.CreateKey(key, klass._reg_progid_) _winreg.SetValueEx(subkey, "CommandLineSafe", 0, _winreg.REG_DWORD, 0) _winreg.SetValueEx(subkey, "LoadBehavior", 0, _winreg.REG_DWORD, 3) _winreg.SetValueEx(subkey, "Description", 0, _winreg.REG_SZ, klass._reg_progid_) _winreg.SetValueEx(subkey, "FriendlyName", 0, _winreg.REG_SZ, klass._reg_progid_) def UnregisterAddin(klass): try: _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Outlook\\Addins\\" + klass._reg_progid_) except WindowsError: pass if __name__ == '__main__': if hasattr(sys, "frozen"): sys.frozendllhandle = win32api.LoadLibrary("outlook_addin.dll") pythoncom.frozen = sys.frozen = "dll" # Without this, com registration will look at class.__module__, and # get all confused about the module name holding our class in the DLL OutlookAddin._reg_class_spec_ = "outlookAddin.OutlookAddin" # And continue doing the registration with our hacked environment. import win32com.server.register win32com.server.register.UseCommandLine(OutlookAddin) if "--unregister" in sys.argv: UnregisterAddin(OutlookAddin) else: RegisterAddin(OutlookAddin) ----------------- setup.py ----------------------- # setup.py from distutils.core import setup import py2exe outlook_addin = dict( modules = ["outlookAddin"], dest_base = "outlook_addin", create_exe = False, ) setup(name='SaveOMatic', com_server=[outlook_addin], console=['outlookAddin.py'] ]) -- http://mail.python.org/mailman/listinfo/python-list