MS Office同步器研发心得(1)之自动化

这是MS Office应用开发心得的第一篇,我将结合实际项目研发把心得写出来。

这个MS Office同步器是使用VB6开发的,本系列的后半章节我会把.NET的实现写出来。所以,如果大家对VB6不感兴趣,可以忽略,不过,如果你对Office应用开发比较感兴趣,仍然可以继续看下去,因为具体实现的语言是VB,但目的仍然是Office应用开发。

相关的一些信息我已经在以前的帖子中写过,大家可以参看一下,我不再复述。

从架构上来说,我实现了在VB6中利用HTTP跟ASP.NET进行交互,把本地Office信息(Outlook中的联系人、任务、日程、便笺、公告和邮件等等)与远程服务器进行同步。

或许大家会疑惑,为什么我会选择VB6而不选择.NET来开发,答案是:关于轻量级客户端的一些想法

其特点是:Outlook应用开发(3)之插件引擎

其技术难题是:http://www.cnblogs.com/unruledboy/archive/2004/06/19/17076.aspx

下载:http://files.cnblogs.com/unruledboy/AddIn.zip

需要说明的是,这个Office同步器是一个比较抽象的东西,他通过外部对象定义属性列表来确定同步的信息,意思就是说,任何同步的对象和具体属性都可以在外部配置文件中定义,不需要改动程序。

这个Office同步器是以插件形式出现的,要设计Office插件,必须先引用几个类库:
1、Microsoft Add-In Designer:微软插件设计器
2、Microsoft Office xx.0 Object Library:Office类库
3、Microsoft Outlook xx.0 Object Library:Outlook类库

微软插件设计器的作用是简化微软支持通过COM技术来实现的插件的编写工作;Office类库的主要功能是可以实现对Office系列产品通用的菜单和工具栏等对象的访问;Outlook类库当然就是访问其拥有信息了:联系人、任务、日程、便笺、公告和邮件等等。

新增一Office设计器,VB6自动添加了相关的接口,以下是该设计器的代码:

None.gif ' *************************************************************************
None.gif'
*
None.gif'
*  名称:dsrOutlook
None.gif'
*
None.gif'
*  功能:Add-In主入口
None.gif'
*
None.gif'
*  作者:chs(wilson chan)
None.gif'
*
None.gif'
*  创建:2004/6/14
None.gif'
*
None.gif'
*  更新:2004/6/25 10:51
None.gif'
*
None.gif'
*  说明:
None.gif'
*
None.gif'
*************************************************************************
None.gif
Option   Explicit
None.gif
None.gif
'  Implement extensibility library.
None.gif
Implements IDTExtensibility2
None.gif
None.gif
Private  WithEvents p_mctlBtnEvents     As  Office.CommandBarButton
None.gif
Private  WithEvents p_mctlBtnEvents2     As  Office.CommandBarButton
None.gif
None.gif
None.gif
None.gif
Private   Sub  AddinInstance_Initialize()
None.gif    
'  插件启动
None.gif
    
None.gif End Sub
None.gif
None.gif
Private   Sub  AddinInstance_Terminate()
None.gif    
'  插件关闭
None.gif
End Sub
None.gif
None.gif
None.gif Private   Sub  p_mctlBtnEvents_Click(ByVal Ctrl  As  Office.CommandBarButton, CancelDefault  As   Boolean )
None.gif    '打开您的窗口
None.gif
End Sub
None.gif
None.gif Private   Sub  p_mctlBtnEvents2_Click(ByVal Ctrl  As  Office.CommandBarButton, CancelDefault  As   Boolean )
None.gif   '打开您的窗口
None.gif
End Sub
None.gif
None.gif
None.gif
Private   Sub  IDTExtensibility2_OnBeginShutdown(custom()  As  Variant)
None.gif    
'  Debug.Print OnBeginShutdown
None.gif
End Sub
None.gif
None.gif
' 插件加载,应用程序启动完成
None.gif
Private   Sub  IDTExtensibility2_OnConnection(ByVal Application  As   Object , _
None.gif    ByVal ConnectMode 
As  AddInDesignerObjects.ext_ConnectMode, _
None.gif    ByVal AddInInst 
As   Object , custom()  As  Variant)
None.gif    
None.gif    
Set  p_objAppInstance  =  Application
None.gif    
None.gif
     Set  p_mctlBtnEvents  =  CreateAddInCommandBarButton(Application, ConnectMode, AddInInst,  True )
None.gif    
None.gif    
Set  p_mctlBtnEvents2  =  CreateAddInCommandBarButton(Application, ConnectMode, AddInInst,  False )
None.gif   
None.gif    
None.gif
End Sub
None.gif
None.gif
'应用程序关闭
None.gif Private   Sub  IDTExtensibility2_OnDisconnection(ByVal _
None.gif    RemoveMode 
As  AddInDesignerObjects.ext_DisconnectMode, _
None.gif    custom() 
As  Variant)
None.gif
None.gif    
RemoveAddInCommandBarButton RemoveMode,  True
None.gif    
None.gif    RemoveAddInCommandBarButton RemoveMode,  False

None.gif
End Sub
None.gif
None.gif
Private   Sub  IDTExtensibility2_OnStartupComplete(custom()  As  Variant)
None.gif    
' Debug.Print "OnStartupComplete"
None.gif
End Sub
None.gif
None.gif
Private   Sub  IDTExtensibility2_OnAddInsUpdate(custom()  As  Variant)
None.gif    
' Debug.Print "OnAddInsUpdate"
None.gif
End Sub
None.gif

以下是插件代码:
None.gif ' *************************************************************************
None.gif'
*
None.gif'
*  名称:basAddIn
None.gif'
*
None.gif'
*  功能:Add-In控制
None.gif'
*
None.gif'
*  作者:chs(wilson chan)
None.gif'
*
None.gif'
*  创建:2004/6/14
None.gif'
*
None.gif'
*  更新:2004/6/25 10:51
None.gif'
*
None.gif'
*  说明:
None.gif'
*
None.gif'
*************************************************************************
None.gif
Option   Explicit
None.gif
None.gif
'  Constants for characters surrounding ProgID.
None.gif
Public   Const  PROG_ID_START  As   String   =   " !<"
None.gif
Public   Const  PROG_ID_END  As   String   =   " >"
None.gif

None.gif
'  Constants for menu item in Office application.
None.gif
Public   Const  MENU_TOOLS_CTL_NAME  As   String   =   " Tools"
None.gif
Public   Const  MENU_TOOLS_CTL_KEY  As   String   =   " SmartOfficeSync"
None.gif
Public   Const  MENU_TOOLS_CTL_CAPTION     As   String   =   " 智能&Office同步器"
None.gif
Public   Const  TOOLBAR_STANDARD_CTL_NAME  As   String   =   " Standard"
None.gif
Public   Const  TOOLBAR_STANDARD_CTL_KEY  As   String   =   " SmartOfficeSync2"
None.gif
Public   Const  TOOLBAR_STANDARD_CTL_CAPTION        As   String   =   " 智能Office同步器"
None.gif

None.gif
Public  p_objAppInstance  As   Object
None.gif
None.gif
None.gif
None.gif
Public   Sub  RaiseError(objError  As  ErrObject)
None.gif    
Dim  strMsg  As   String
None.gif    
None.gif    strMsg 
=   " 错误出现在 COM add-in,名称为 ' "  _
None.gif        
&  App.Title  &   " '. "   &  vbCrLf  &   " Error #: "   &  objError.Number _
None.gif        
&  vbCrLf  &  objError.Description
None.gif
None.gif    
MsgBox  strMsg, ,  " 错误"
None.gif
End Sub
None.gif
None.gif'添加按钮
None.gif
Public   Function  CreateAddInCommandBarButton(ByVal Application  As   Object , _
None.gif                                            ByVal ConnectMode 
As  AddInDesignerObjects.ext_ConnectMode, _
None.gif                                            ByVal AddInInst 
As   Object , _
None.gif                                            ByVal blnMenu 
As   Boolean As  Office.CommandBarButton
None.gif
None.gif    
Dim  cbrMenu                      As  Office.CommandBar
None.gif    
Dim  ctlMenuItem                  As  Office.CommandBarButton
None.gif
None.gif    
On   Error   GoTo  HandleError
None.gif
None.gif    
Set  cbrMenu  =  p_objAppInstance.ActiveExplorer.CommandBars(IIf(blnMenu, p_strMENU_TOOLS_CTL_NAME, p_strTOOLBAR_STANDARD_CTL_NAME))
None.gif
None.gif    
Set  ctlMenuItem  =  cbrMenu.FindControl(Tag: = IIf(blnMenu, MENU_TOOLS_CTL_KEY, TOOLBAR_STANDARD_CTL_KEY))
None.gif
None.gif    
If  ctlMenuItem  Is   Nothing   Then
None.gif
None.gif        
Set  ctlMenuItem  =  cbrMenu.Controls.Add(Type: = msoControlButton, _
None.gif            Parameter:
= IIf(blnMenu, MENU_TOOLS_CTL_KEY, TOOLBAR_STANDARD_CTL_KEY))
None.gif
None.gif        
With  ctlMenuItem
None.gif            .Caption 
=  IIf(blnMenu, p_strMENU_TOOLS_CTL_CAPTION, p_strTOOLBAR_STANDARD_CTL_CAPTION)
None.gif            .Tag 
=  IIf(blnMenu, MENU_TOOLS_CTL_KEY, TOOLBAR_STANDARD_CTL_KEY)
None.gif            .Style 
=  msoButtonCaption
None.gif            .OnAction 
=  PROG_ID_START  &  AddInInst.ProgId _
None.gif                
&  PROG_ID_END
None.gif        
End   With
None.gif    
End   If
None.gif
None.gif    
Set  CreateAddInCommandBarButton  =  ctlMenuItem
None.gif
None.gifCreateAddInCommandBarButton_End:
None.gif    
Exit   Function
None.gif
None.gifHandleError:
None.gif    RaiseError Err
None.gif    
Resume  CreateAddInCommandBarButton_End
None.gif
End Function
None.gif
None.gif'移除按钮
None.gif
Public   Function  RemoveAddInCommandBarButton(Optional ByVal RemoveMode  As  AddInDesignerObjects.ext_DisconnectMode, _
None.gif                                            Optional ByVal blnMenu 
As   Boolean   =   True )
None.gif    
On   Error   GoTo  HandleError
None.gif
None.gif    
If  RemoveMode  =  ext_dm_UserClosed  Then
None.gif        
On   Error   Resume   Next
None.gif        p_objAppInstance.CommandBars(IIf(blnMenu, p_strMENU_TOOLS_CTL_NAME, p_strTOOLBAR_STANDARD_CTL_NAME)).Controls(IIf(blnMenu, MENU_TOOLS_CTL_KEY, TOOLBAR_STANDARD_CTL_KEY)).Delete
None.gif        
On   Error   GoTo  HandleError
None.gif    
End   If
None.gif
None.gifRemoveAddInCommandBarButton_End:
None.gif    
Exit   Function
None.gif
None.gifHandleError:
None.gif    RaiseError Err
None.gif    
Resume  RemoveAddInCommandBarButton_End
None.gif
End Function
None.gif


(待续...)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值