G
guilligan.geo
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']
])
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']
])