Outlook add-in 插件.Net开发经验

** 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 &gt; 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 = &amp;H36E6001E  '定制form的显示名字  _
 70
 71_ Const  PR_DEF_POST_MSGCLASS = &amp;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&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; m</guidattribute("ca940fe1-1193-411b-82df-570a04491150"),>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus