Microsoft Entourage 2008 Plug-in development

Today is the release day of Microsoft Office for Mac 2008. Let’s take a look if it is possible to develop a Plug-in for Entourage 2008.
As far as I know, there was no way in Entourage 2004 for a Third Party Developer, and there is still no support from Microsoft. But after four years, things a little different now…
In the Entourage application bundle I discovered a Plugins folder, which contain a Plug-in named EntouragePrintPDE. So what is EntouragePrintPDE? This is an Extending Printing Dialogs Plug-in, I found a example for such a Plug-in at mozilla.

So here we go, lets learn more about CFPlugIn, which is little uncommon for us Cocoa guys who use NSBundle. BasicPlugIn is a good example to start with.
And yeah, after setting up a Xcode project with this I was able get the Plug-in loaded:

This is not all good news. Because it is based on a Extending Printing Dialogs Plug-in, it gets only loaded when you open the print dialog. The CFPlugInTypes UUID in the Info.plist is BCB07250-E57F-11D3-8CA6-0050E4603277 which described as “Application pane for the Print dialog” Interface type:

Is this the end of the story? Almost, without Interface descriptions and the UUIDs we are out of luck here. I searched for standard UUIDs, but didn’t find any “load on start of host app” UUIDs.
But wait, I don’t like to close this with a “it’s impossible, don’t even dream of it”. Here the class-dump output of Entourage 2008. It is pretty short for such a big application because it is mostly a Carbon application, never mind, I like what it shows.
-
/*
-
* Generated by class-dump 3.1.1.
-
*
-
* class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2006 by Steve Nygard.
-
*/
-
-
struct CToolTip;
-
-
struct CURLToolTip {
-
struct CToolTip *_field1;
-
};
-
-
struct OpaqueMenuRef;
-
-
struct _NSPoint {
-
float _field1;
-
float _field2;
-
};
-
-
struct _NSZone;
-
-
struct __CFString;
-
-
/*
-
* File: /Applications/Microsoft Office 2008/Microsoft Entourage.app/Contents/MacOS/Microsoft Entourage
-
* Arch: Intel 80×86 (i386)
-
*/
-
-
@protocol NSObject
-
- (BOOL)isEqual:(id)fp8;
-
- (unsigned int)hash;
-
- (Class)superclass;
-
- (Class)class;
-
- (id)self;
-
- (struct _NSZone *)zone;
-
- (id)performSelector:(SEL)fp8;
-
- (id)performSelector:(SEL)fp8 withObject:(id)fp12;
-
- (id)performSelector:(SEL)fp8 withObject:(id)fp12 withObject:(id)fp16;
-
- (BOOL)isProxy;
-
- (BOOL)isKindOfClass:(Class)fp8;
-
- (BOOL)isMemberOfClass:(Class)fp8;
-
- (BOOL)conformsToProtocol:(id)fp8;
-
- (BOOL)respondsToSelector:(SEL)fp8;
-
- (id)retain;
-
- (oneway void)release;
-
- (id)autorelease;
-
- (unsigned int)retainCount;
-
- (id)description;
-
@end
-
-
@protocol WebDocumentText <NSObject>
-
- (BOOL)supportsTextEncoding;
-
- (id)string;
-
- (id)attributedString;
-
- (id)selectedString;
-
- (id)selectedAttributedString;
-
- (void)selectAll;
-
- (void)deselectAll;
-
@end
-
-
- (void)preparePageForPrinting:(float)fp8;
-
@end
-
-
@interface MessagePrintoutController : NSObject
-
{
-
BOOL loading;
-
}
-
-
- (BOOL)isLoading;
-
- (void)setLoading:(BOOL)fp8;
-
- (void)webView:(id)fp8 didStartProvisionalLoadForFrame:(id)fp12;
-
- (void)webView:(id)fp8 didFinishLoadForFrame:(id)fp12;
-
- (void)webView:(id)fp8 didFailProvisionalLoadWithError:(id)fp12 forFrame:(id)fp16;
-
- (void)webView:(id)fp8 didFailLoadWithError:(id)fp12 forFrame:(id)fp16;
-
-
@end
-
-
@interface MessageViewController : NSObject
-
{
-
WebView *webView;
-
void *view;
-
id messageRecordID;
-
BOOL networkBlocked;
-
BOOL networkResources;
-
NSURL *hrefURL;
-
NSString *currentURL;
-
NSString *currentHRef;
-
struct CURLToolTip *toolTip;
-
}
-
-
+ (void)initialize;
-
- (void)dealloc;
-
- (id)init;
-
- (id)webView;
-
- (void)setWebView:(id)fp8;
-
- (void *)view;
-
- (void)setView:(void *)fp8;
-
- (void *)message;
-
- (void)setMessage:(void *)fp8;
-
- (BOOL)isNetworkBlocked;
-
- (void)setNetworkBlocked:(BOOL)fp8;
-
- (BOOL)hasNetworkResources;
-
- (void)buildExecuteScriptMenu:(struct OpaqueMenuRef *)fp8 withParent:(id)fp12;
-
- (void)openLink:(id)fp8;
-
- (void)copyImage:(id)fp8;
-
- (void)openImage:(id)fp8;
-
- (void)executeScriptCommand:(id)fp8;
-
- (struct __CFString *)getSelectedText;
-
- (void)selectAllCommand:(id)fp8;
-
- (void)decreaseFontSizeCommand:(id)fp8;
-
- (void)increaseFontSizeCommand:(id)fp8;
-
- (void)translateCommand:(id)fp8;
-
- (void)dictionaryCommand:(id)fp8;
-
- (void)synonymCommand:(id)fp8;
-
- (void)encyclopediaCommand:(id)fp8;
-
- (void)webSearchCommand:(id)fp8;
-
- (void)helpCommand:(id)fp8;
-
- (void)download:(id)fp8 decideDestinationWithSuggestedFilename:(id)fp12;
-
- (void)webView:(id)fp8 didStartProvisionalLoadForFrame:(id)fp12;
-
- (void)webView:(id)fp8 decidePolicyForNewWindowAction:(id)fp12 request:(id)fp16 newFrameName:(id)fp20 decisionListener:(id)fp24;
-
- (void)webView:(id)fp8 decidePolicyForNavigationAction:(id)fp12 request:(id)fp16 frame:(id)fp20 decisionListener:(id)fp24;
-
- (id)webView:(id)fp8 resource:(id)fp12 willSendRequest:(id)fp16 redirectResponse:(id)fp20 fromDataSource:(id)fp24;
-
- (void)webView:(id)fp8 willPerformDragSourceAction:(int)fp12 fromPoint:(struct _NSPoint)fp16 withPasteboard:(id)fp24;
-
- (void)webView:(id)fp8 mouseDidMoveOverElement:(id)fp12 modifierFlags:(unsigned int)fp16;
-
- (id)webView:(id)fp8 contextMenuItemsForElement:(id)fp12 defaultMenuItems:(id)fp16;
-
-
@end
-
-
@interface MessageViewController (Private)
-
- (void)decidePolicyForAction:(id)fp8 request:(id)fp12 decisionListener:(id)fp16;
-
- (struct _NSPoint)mouseLocation;
-
@end
-
-
@interface MHTMLProtocol : NSURLProtocol
-
{
-
}
-
-
+ (BOOL)canInitWithRequest:(id)fp8;
-
+ (id)canonicalRequestForRequest:(id)fp8;
-
- (id)initWithRequest:(id)fp8 cachedResponse:(id)fp12 client:(id)fp16;
-
- (void)startLoading;
-
- (void)stopLoading;
-
-
@end
-
-
@interface NetworkBlock : NSURLProtocol
-
{
-
}
-
-
+ (BOOL)canInitWithRequest:(id)fp8;
-
+ (id)canonicalRequestForRequest:(id)fp8;
-
- (id)initWithRequest:(id)fp8 cachedResponse:(id)fp12 client:(id)fp16;
-
- (void)startLoading;
-
- (void)stopLoading;
-
-
@end

