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

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

第一次写这玩意,记录些开发中的过程,.net开发设置要比在VB里复杂一些,要把office的对象用ms提供的工具包装一下,才能在.Net开发环境里使用。

开发环境设置:

我的开发环境:Windows2K professional + Office XP

Office每个版本的对象,不尽相同,一般新版本兼容旧版本,也有可能会废弃某些对象的接口。我看过Office XPOffice2000outlook对象,Outlook XPOutlook2000要多出一些对象和接口函数。

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.       <GuidAttribute("CA940FE1-1193-411b-82DF-570A04491150"), ProgIdAttribute("AddinForBible.olAddin")>

Public Class OutAddIn

End Class

 

2.       清除outlook的对象:

Public Sub DisposeObject(ByVal obj As Object)

            'Wraps ReleaseCOMObject to provide a 'safe' disposal helper method.

            Dim count As Integer

            Try

                If obj Is Nothing Then

                    Exit Try

                End If

                If Not Marshal.IsComObject(obj) Then

                    Exit Try

                End If

                count = Marshal.ReleaseComObject(obj)

                While count > 0

                    count = Marshal.ReleaseComObject(obj)

                End While

            Catch ex As SystemException

            Finally

                obj = Nothing

            End Try

End Sub

 

3.        CDO1.21对象在Office的安装包里可以安装,使用例子:

设置folder的default post message 属性为 自定义 form

这个属性找了很久,msdn里没有提及,留在这里吧,以后也不太会再作outlook开发了

 

g_olNamespace = m_olOutlookApp.Session

     g_olNamespace.Logon(, , False, False)

     g_objMAPISession = New MAPI.Session

g_objMAPISession.Logon(, , False, False)

Public Function SetFolderDftMsgPostClass(ByVal sFolderID As String, ByVal sStoreID As String) As Boolean

 

            Dim objMAPIFolder As MAPI.Folder

            Dim objMAPIFields As MAPI.Fields

            Const PR_DEF_POST_DISPLAYNAME = &H36E6001E '定制form的显示名字

            Const PR_DEF_POST_MSGCLASS = &H36E5001E  '定制form的MessageClass名称

            Try

                objMAPIFolder = g_objMAPISession.GetFolder(sFolderID, sStoreID)

                objMAPIFields = objMAPIFolder.Fields

                Try

                    If objMAPIFields.Item(PR_DEF_POST_MSGCLASS).value = cVerseMessageClass Then

                        Exit Try

                    End If

                Catch ex As Exception

                    With objMAPIFields

                        .Add(PR_DEF_POST_DISPLAYNAME, cVerseFormName)

                        .Add(PR_DEF_POST_MSGCLASS, cVerseMessageClass)

                    End With

                    objMAPIFolder.Update()

                End Try

            Catch ex As Exception

            Finally

            End Try

            DisposeObject(objMAPIFields)

            DisposeObject(objMAPIFolder)

End Function

 

 

4.         其他零零碎碎的也满多的,不再罗嗦了。

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论
Outlook 2003 addin<br> 赵果(apple) 2008年3月7日星期五<br><br><br>摘要:<br> 目前随着蓝牙、红外通信的不断发展,同步协议的应用变得越来越广泛。而同步引擎需要修改日志changelog的协助。本文的目的是记录用户对outlook2003联系人的操作日志,供同步引擎使用。<br>Outlook 2003 addin属于microsoft office com中的应用。目的是用于捕捉outlook2003 联系人(contacts)的增加、删除、修改的消息。<br><br>关键词:同步, changelog<br><br>工程介绍:<br>office com插件必须实现IDTExtensibility2接口。所有继承于IDTExtensibili ty2接口的COM插件必须实现5个方法:OnConnection,OnDisconnection,OnAddinUpdate,OnBeginShutDown,OnStartupComplete <br><br>1. 建立addin工程<br>(1) 启动VC++开发环境,新建一个工程,选择ATL COM AppWizard,为工程命名为Outlook Addin,确定。选择Dynamic Link Library完成。然后,点击菜单“插入”->“新建ATL对象”,选择“Simple Object”,命名为Addin,选择Attributes标签,选中Support ISupportErrorInfo,其他选项默认。<br>(2) 在新建的类上右键implement Interface->AddTypelib->Microsoft Add-in Designer-> IDTExtensibility2。如下图所示:<br> <br>图1 添加outlook2003接口图示<br> <br>图2 添加addin designer接口图示<br><br> <br>图3 添加接口图示<br>(3) 添加注册表信息<br>向导实现了我们所选择的接口,并为IDTExtensibility2接口的5个方法提供了默认实现。现在,一个基本的自动化COM对象就准备好了。通过向rgs文件添加注册条目,我们就可以用Outlook来注册这个插件。打开文件OAddin.rgs,在文件末尾插入以下代码:<br>HKCU_Software<br> {<br> Microsoft<br> {<br> Office<br> {<br> Outlook<br> {<br> Addins<br> {<br> 'OAddin.OAddin'<br> {<br> val FriendlyName = s 'SMIME Addin'<br> val Description = s 'ATLCOM Outlook Addin'<br> val LoadBehavior = d '00000003'<br> val CommandLineSafe = d '00000000' <br> }<br> }<br> }<br> }<br> }<br> }<br>}<br>注册条目看起来是很简单的。<br>1)LoadBehavior DWORD类型表明了Outlook装载COM插件的时机。我们的插件要在启动时装载,所以它的值设为3。LoadBehavior == 3 表示启动和连接时就自动运行;<br>• 0 = Disconnect - 不加载。<br>• 1 = Connected - 被加载。 <br>• 2 = Bootload - 宿主程序启动时加载。<br>• 8 = DemandLoad - 需要时加载。<br>• 16 = ConnectFirstTime - 只在下次运行时加载一次。<br>2)FriendlyName: 字符串类型,插件的名称,将在相应程序的COM加载对话框中看到。<br> 3)Description: 字符串类型,插件的描述信息。<br> 4)CommandLineSafe: DWORD类型,命令行方式,可以设置为0x01(真)或0x00(假)。<br><br>2. 代码分析:<br>(1)需要向outlook注册add, modify, delete事件<br>A. 申明outlook events;<br> SINK_ENTRY_INFO( 1, __uuidof(Outlook::ItemsEvents), 0xf001, getOutlookaddItemsEvents, &OnItemAddInfo )<br> SINK_ENTRY_INFO( 2, __uuidof(Outlook::ItemsEvents), 0xf002, getOutlookmodifyItemsEvents, &OnItemModifyInfo )<br> SINK_ENTRY_INFO( 3, __uuidof(Outlook::ItemsEvents), 0xf003, getOutlookdeleteItemsEvents, &OnItemDeleteInfo )<br>0xf001:add 0xf002 modify 0xf003 delete<br><br>B. 在onconnection中注册事件;<br>outlookItem_add::DispEventAdvise( (IDispatch*)m_spItemsEvents_Add, &__uuidof(Outlook::ItemsEvents) );<br><br>C. 在ondisconnection中释放事件,也是在outlook关闭时停止捕捉消息;<br><br>(2)在outlook回调你的函数中实现changeglog功能。<br>Eg: void __stdcall CAddin::getOutlookaddItemsEvents( IDispatch* pdispItemsEvents )<br>{<br> CComQIPtr<Outlook::_ContactItem> ct(pdispItemsEvents);<br>}<br><br><br>结论:<br>本人文笔不好,请各大蝦不要见笑,详细还是见代码吧,但本人能够保证程序没有任何问题。<br>本人对office系列的产品有较深的见解,并具有浓厚的兴趣。目前在研究outlook express的事件捕捉,希望有跟我志同道合的朋友欢迎跟我联系一起分享开发的快乐。QQ:35912467<br><br><br><br><br> 邮箱:my716917@sina.com<br> Hugo.zhao@mic.com.tw<br>电话:13458588397<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

duibudui

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值