** Outlook add-in 插件 .Net 开发经验 **
第一次写这玩意,记录些开发中的过程, .net 开发设置要比在 VB 里复杂一些,要把 office 的对象用 ms 提供的工具包装一下,才能在 .Net 开发环境里使用。
开发环境设置:
我的开发环境: Windows2K professional + Office XP
Office 每个版本的对象,不尽相同,一般新版本兼容旧版本,也有可能会废弃某些对象的接口。我看过 Office XP , Office2000 的 outlook 对象, Outlook XP 比 Outlook2000 要多出一些对象和接口函数。
OfficeXP 需要配置 ms 提供的设置文件,具体可看 ( 下载 ) 。
我使用 VB.Net 开发,这样直接对 Outlook 对象编程比较方便(使用 withevents ),用 C# 的话,需要自定义事件参数,设置 delegate 。
对 Outlook 进行二次开发,可能用到 CDO1.21 对象,这个不是必需的,按个人需要。使用 CDO1.21 对象,可以使用一些较为核心的 Outlook 方法。这些方法,属性在 Outlook 对象里可能无法使用。
如果需要更直接的设置,获取 Outlook 对象,可以对 MAPI32.dll 提供的 api 接口,进行控制,可以最大限度的操纵 Outlook 。这些接口直接使用 C++ 编程最方便,我没有具体的做过,只测试了一些,也就不多说了。
开发过程简介:
在 vs.net 里,其他项目 à 扩展性项目 à 共享的外接程序。
选择语言:
选择外接程序的加载到的主程序,这里我只选择 outlook :
程序会帮我们自动生成一个 Addin 项目,包含一个 Connect.vb 文件,打开看看。
Implements Extensibility.IDTExtensibility2 的接口。
象这样,我们就可以取得 outlook的application对象,操纵Outlook。
_ Dim _ _ m_oAddin As olAddin _
_ Public _ _ Sub OnConnection( ByVal application As Object , ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object , ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection _
_ _
_ Dim oApp As myOutlook.Application _
_ Dim oType As Type _
_ Dim GetProgID As Object _
_ Dim MyProgID As String _
_ Dim oArgs As Object () _
_ _
_ Try _
_ m_oAddin = New olAddin _
_ 'Use InvokeMember to get ProgID of addInInst object _
_ oType = addInInst.GetType _
_ GetProgID = oType.InvokeMember("ProgID", _ _
_ BindingFlags.Public Or BindingFlags.GetField Or BindingFlags.GetProperty, _ _
_ Nothing , _ _
_ addInInst, _ _
_ oArgs) _
_ MyProgID = CType (GetProgID, String ) _
_ oApp = CType (application, myOutlook.Application) _
_ 'Don't call InitHandler if Explorers.Count = 0 and Inspectors.Count = 0 _
_ If oApp.Explorers.Count = 0 And oApp.Inspectors.Count = 0 Then _
_ Exit Sub _
_ End If _
_ ' Initialize COMAddin object with this connect object to allow _
_ ' external clients to get access to exposed features _
_ oApp.COMAddIns.Item(MyProgID.ToString).Object = Me _
_ 'Call InitHandler _
_ m_oAddin.InitHandler(oApp, MyProgID) _
_ Catch ex As SystemException _
_ _
_ End Try _
_ End _ _ Sub _
_ _
当然也可以把所有的对 outlook的操作,放在一个单独的类中处理: _ m_oAddin.InitHandler(oApp, MyProgID) _
一些注意点:
具体要做些什么,我也不仔细说了,察看 msdn 就明白了。
我在开发过程中的一些注意,列一下:
在单独类 _ oAddin _ 中处理,加入
1.
1<guidattribute("ca940fe1-1193-411b-82df-570a04491150"), progidattribute("addinforbible.oladdin")="">
2
3Public Class OutAddIn
4
5End Class
6
72\. 清除 outlook的对象:
8
9_ Public _ _ Sub DisposeObject( ByVal obj As Object ) _
10
11_ 'Wraps ReleaseCOMObject to provide a 'safe' disposal helper method. _
12
13_ Dim count As Integer _
14
15_ Try _
16
17_ If obj Is Nothing Then _
18
19_ Exit Try _
20
21_ End If _
22
23_ If Not Marshal.IsComObject(obj) Then _
24
25_ Exit Try _
26
27_ End If _
28
29_ count = Marshal.ReleaseComObject(obj) _
30
31_ While count > 0 _
32
33_ count = Marshal.ReleaseComObject(obj) _
34
35_ End While _
36
37_ Catch ex As SystemException _
38
39_ Finally _
40
41_ obj = Nothing _
42
43_ End Try _
44
45_ End _ _ Sub _
46
473\. CDO1.21对象在Office的安装包里可以安装,使用例子:
48
49设置 folder的default post message 属性为 自定义 form
50
51这个属性找了很久, msdn里没有提及,留在这里吧,以后也不太会再作outlook开发了
52
53_ g_olNamespace = m_olOutlookApp.Session _
54
55_ g_olNamespace.Logon(, , False , False ) _
56
57_ g_objMAPISession = New MAPI.Session _
58
59_ g_objMAPISession.Logon(, , False , False ) _
60
61_ Public _ _ Function SetFolderDftMsgPostClass( ByVal sFolderID As String , ByVal sStoreID As String ) As Boolean _
62
63_ _
64
65_ Dim objMAPIFolder As MAPI.Folder _
66
67_ Dim objMAPIFields As MAPI.Fields _
68
69_ Const PR_DEF_POST_DISPLAYNAME = &H36E6001E '定制form的显示名字 _
70
71_ Const PR_DEF_POST_MSGCLASS = &H36E5001E '定制form的MessageClass名称 _
72
73_ Try _
74
75_ objMAPIFolder = g_objMAPISession.GetFolder(sFolderID, sStoreID) _
76
77_ objMAPIFields = objMAPIFolder.Fields _
78
79_ Try _
80
81_ If objMAPIFields.Item(PR_DEF_POST_MSGCLASS).value = cVerseMessageClass Then _
82
83_ Exit Try _
84
85_ End If _
86
87_ Catch ex As Exception _
88
89_ With objMAPIFields _
90
91_ .Add(PR_DEF_POST_DISPLAYNAME, cVerseFormName) _
92
93_ .Add(PR_DEF_POST_MSGCLASS, cVerseMessageClass) _
94
95_ End With _
96
97_ objMAPIFolder.Update() _
98
99_ End Try _
100
101_ Catch ex As Exception _
102
103_ Finally _
104
105_ End Try _
106
107_ DisposeObject(objMAPIFields) _
108
109_ DisposeObject(objMAPIFolder) _
110
111_ End _ _ Function _
112
113<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; m</guidattribute("ca940fe1-1193-411b-82df-570a04491150"),>