[Spambayes] PyWin32 Outlook Adding crashes Outlook on Window 2003 SP1
Sean Covel
seanecovel at comcast.net
Sun May 15 13:42:55 CEST 2005
To all,
I've been using SpamBayes for some time on Window 2003 Server. After
upgrading to Windows 2003, the plugin no longer works. After some
debugging, It was determined it was probably a PyWin32 problem.
Python 2.4.1
pywin32-204.win32-py2.4.exe
I have tested the example Outlook plugin
(win32com/demos/Outlookadin.py). That plugin also crashes Outlook. I
added a bunch of win32traceutil;print statements to attempt to figure
out where the crash it.
The output I get is this:
Collecting Python Trace Output...
Starting up 1
Starting up 2
Starting up 3
Starting up 6
Starting up 7
Here's the code:
-------------------------------------------------
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 win32traceutil
win32traceutil;print 'Starting up 1'
# 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
win32traceutil;print 'Starting up 2'
# The TLB defiining the interfaces we implement
universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}',
0, 1, 0, ["_IDTExtensibility2"])
win32traceutil;print 'Starting up 3'
class ButtonEvent:
def OnClick(self, button, cancel):
win32traceutil;print 'Starting up 4'
import win32ui # Possible, but not necessary, to use a Pythonwin GUI
win32ui.MessageBox("Hello from Python")
return cancel
class FolderEvent:
def OnItemAdd(self, item):
win32traceutil;print 'Starting up 5'
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:
win32traceutil;print 'Starting up 6'
_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"
win32traceutil;print 'Starting up 7'
def OnConnection(self, application, connectMode, addin, custom):
win32traceutil;print 'OnConnection'
print "OnConnection", application, connectMode, addin, custom
# ActiveExplorer may be none when started without a UI (eg,
WinCE synchronisation)
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
win32traceutil;print 'Setup Hooks'
# And now, for the sake of demonstration, setup a hook for all
new messages
inbox =
application.Session.GetDefaultFolder(constants.olFolderInbox)
self.inboxItems = DispatchWithEvents(inbox.Items, FolderEvent)
def OnDisconnection(self, mode, custom):
win32traceutil;print 'Starting up 8'
print "OnDisconnection"
def OnAddInsUpdate(self, custom):
win32traceutil;print 'Starting up 9'
print "OnAddInsUpdate", custom
def OnStartupComplete(self, custom):
win32traceutil;print 'Starting up 10'
print "OnStartupComplete", custom
def OnBeginShutdown(self, custom):
win32traceutil;print 'Starting up 11'
print "OnBeginShutdown", custom
def RegisterAddin(klass):
win32traceutil;print 'RegisterAddin'
import _winreg
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):
win32traceutil;print 'UnregesterAddin'
import _winreg
try:
_winreg.DeleteKey(_winreg.HKEY_CURRENT_USER,
"Software\\Microsoft\\Office\\Outlook\\Addins\\" + klass._reg_progid_)
except WindowsError:
pass
if __name__ == '__main__':
import win32com.server.register
win32com.server.register.UseCommandLine(OutlookAddin)
if "--unregister" in sys.argv:
UnregisterAddin(OutlookAddin)
else:
RegisterAddin(OutlookAddin)
---------------------------------------------------------------
Anything I can do to help, just let me know.
Sean
More information about the Spambayes
mailing list