随心所欲

做个幸福的人
posts - 141, comments - 1287, trackbacks - 19, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

Outlook中的Add-In (By VB6)

Posted on 2007-02-01 10:21 随心所欲 阅读(2528) 评论(12)  编辑 收藏 所属分类: VB6MS Office

最近正好有一个项目是关于outlook的。客户需要把outlook和其他系统集成到一起。我们希望的解决方案当然是用c#去做。但是由于种种原因,项目最终只能使用vb作,还是vb6那一代(即使是用VB.net也会简单一些)。

信息服务就是这样,我们得根据客户的需求来,他们出于成本和稳定性的考虑,决意试用一种方案,我们就得做出妥协。并且,他们的Outlook版本很低(升级outlook的成本太高)。他们对于新技术的稳定性也是有点怀疑(MS的演示会上,好几个Demo跑不起来就是个例子)。

Outlook2000版,VB6开发之(得重新拾起这个工具了,只是不知道这张旧船票能否登上客户这条怪船?)。

首先从网上找到了一些资料,给出了一个基本的解决方法:

1:建立VBAddIN项目

2:对项目添加Office引用(Outlook及其他)

3:对Connect的特定的几个事件作出处理(OnConnect,OnDisConnect等)

但是,这段代码明显是找错了,因为他根本运行不起来。它面向的好像是VB自己的AddIN。但是基本原理可以看出来,就是这个样子的。

后来从网上找到这样一个VB6的模版,才明白问题出在那里:获得的对象需要用专门的Outlook.Application接收(olApp As Outlook.Application)。其他的变化不大。经过这样的修改,Outlook中终于出现了我的AddIn

值得注意的一个就是ConnectOnInitial Load Behavior属性。调试的时候一般选择Startup(每次都执行),发布的时候要选择Load on next startup only(执行一次),这是因为我需要在outlook中加入自己的菜单,这个菜做是一次性的。

剩下的问题就是

1:如何在OutLook中添加自己的菜单

2:如何给菜单加入事件相应。

3:如何访问/改写本地OutLook的信息

4:安装/卸载

增加菜单似乎并不难,就是要找到Application中的菜单栏,并且加入自己的菜单。

1    Set objCB = olApp.ActiveExplorer.CommandBars("Menu Bar") ‘ 找到App的MenuBar
2
3    Dim mainMenu As CommandBarPopup’ 定义为可以弹出其他菜单的菜单
4
5    Set mainMenu = objCB.Controls.Add(msoControlPopup, , , objCB.Controls("Help").Index) ‘ 定义其位置。放在Help之前
6
7    mainMenu.Caption = "Test Menu"
8
9


    给菜单加入事件处理。这个可能是很简单的了,但是真得忘记了怎么做了(大学里学的那点皮毛确实不够用),几经测试,才做到
   

1Dim WithEvents mn_Cmd1 As Office.CommandBarButton’ 定义. 注意WithEvents和CommandBarButton类型
2
3


       //
设置

  Set mn_Cmd1 = mainMenu Controls.Add(msoControlButton) ’ 这是一个可移执行的命令菜单

  mn_Cmd1.Caption 
= "Cmd1" 


    //给出事件处理
  

1Private Sub mn_Cmd1_Click(ByVal Ctrl As Office.CommandBarButton, ByRef CancelDefault As Boolean)
2
3     MsgBox Ctrl.Caption
4
5End Sub
    
6
7


  访问
/改写本地outlook是比较麻烦的一个。因为我一直觉得这样会有安全问题。但是结果比较好:每次访问Outlook的时候,Outlook会给出提示,询问这个程序访问Outlook的权限和时间。

 1 msg = "there are totally  " & objOutlook.Session.AddressLists.Item("Contacts").AddressEntries.Count
 2 msg = msg + " address in ur address list."
 3 If objOutlook.Session.AddressLists.Item("Contacts").AddressEntries.Count > 0 Then
 4   msg = msg + "and the first one is "
 5   msg = msg + objOutlook.Session.AddressLists.Item("Contacts").AddressEntries.Item(1).address
 6 End If
 7
 8  Me.lbInfo.Caption = msg
 9
10

 

然后就是给菜单都加上具体的实现了,这个不再赘述。

。。。。。

最后的事情就是如何安装和卸载这个AddIn了。  安装有两种方法:
    第一,可以注册组件,也就是
regsvr32 xxx.dll
    第二,可以在outlook中的菜单中加入(Tool/Com Add-INs)。
    卸载也是差不多的:可以在菜单中
resetTool/Customize/ToolBars/MenuBar Reset;regsrv /u xxx.dll应该也可以。

 

 

 

 

Feedback

#1楼    回复  引用  查看    

2007-02-01 11:37 by 木野狐      
VB 6 早已不被支持了。你们负责谈项目的人有问题,怎么会听客户选择这种技术。

#2楼    回复  引用  查看    

2007-02-01 11:57 by 目标年薪三千万      
这个要靠项目经理去游说的拉,用VB6以后软件就没办法升级了,没办法拓展了,甚至很难维护了.

#3楼 [楼主]   回复  引用  查看    

2007-02-01 12:10 by 随心所欲      
@木野狐
他们的office版本就比较低.
用户升级是另外一件事情了。

#4楼    回复  引用    

2007-02-01 12:20 by www [未注册用户]
用外部程序调用outlook发邮件,每次都弹出一个烦人的提示窗体。

#5楼 [楼主]   回复  引用  查看    

2007-02-01 12:41 by 随心所欲      
@www
可以理解。用人家的东西,当然得说一声了。

#6楼    回复  引用    

2007-02-01 13:38 by Phoenix [未注册用户]
我也写这样的东西, 不过是直接用VBA写. 问题很多, 在我的Outlook(Office 2003 Sp1)上还能用, 到了Office 2003 Sp2上就不能用了, 后来一查, trim这个最基本的函数在2003 Sp2里竟然不能用了...我倒.

#7楼    回复  引用  查看    

2007-02-01 16:36 by 风生水起      
我的帖子“Office Outlook同步 很奇怪的BUG”(http://www.cnblogs.com/end/archive/2007/02/01/637148.html)重发了。
你的回复我看了,不过Outlook任务好像不需要登录啊。

#8楼    回复  引用    

2007-08-28 17:57 by bibby [未注册用户]
你好,我依據上述程式碼運行
到了
Dim WithEvents mn_Cmd1 As Office.CommandBarButton
這行會發生錯誤 "SUB 或Function中有不正確的屬性"
不知前輩是否知道發生什麼問題
感謝

#9楼 [楼主]   回复  引用  查看    

2007-08-30 10:35 by 随心所欲      
@bibby
或许是mn_Cmd1的处理事件写的有问题。

#10楼    回复  引用    

2008-03-14 18:04 by kuan [未注册用户]
你好,看了你的文章,现在我也正在写一个在outlook2003中的按钮控件,都能编译通过,但就是在outlook中看不到自定义菜单按钮,什么原因?版本的不同吗?我写的在PPT中可以通过,但转为outlook就不行了

#11楼 [楼主]   回复  引用  查看    

2008-03-27 14:07 by 随心所欲      
@kuan
Set objCB = olApp.ActiveExplorer.CommandBars("Menu Bar") ‘ 找到App的MenuBar

Dim mainMenu As CommandBarPopup’ 定义为可以弹出其他菜单的菜单

Set mainMenu = objCB.Controls.Add(msoControlPopup, , , objCB.Controls("Help").Index) ‘ 定义其位置。放在Help之前

mainMenu.Caption = "Test Menu"
------------------
你可以调试这一段,看看是不是找到了合适的菜单放置的位置。
我猜测,可能没有找到合适的位置。

#12楼    回复  引用    

2008-05-05 15:38 by 好呀 [未注册用户]
运行正常

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-01 10:28 编辑过
 
所属分类的其他文章:
· Outlook中的Add-In (By VB6)
· VB6下的FTP
 


Google