利用 VB 的 Add-In 向导.再看看下面这篇文章. Create Your Own Visual Basic Add-Ins http://www.csdn.net/Develop/Read_Article.asp?Id=12769不过调试的时候麻烦, 要不停的 编译,加载..... 常常弄地 手忙脚乱的.
VERSION 5.00 Begin {AC0714F6-3D04-11D1-AE7D-00A0C90F26F4} Connect ClientHeight = 8595 ClientLeft = 0 ClientTop = 0 ClientWidth = 11175 _ExtentX = 19711 _ExtentY = 15161 _Version = 393216 Description = "Open a project stored in a database form a filtered list." DisplayName = "Filtered Project Database Open" AppName = "Microsoft Project" AppVer = "Microsoft Project 9.0" LoadName = "Startup" LoadBehavior = 3 RegLocation = "HKEY_CURRENT_USER\Software\Microsoft\Office\MS Project" End Attribute VB_Name = "Connect" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = True Option Explicit Implements IDTExtensibility2 Dim mfrmAddIn As New frmFilteredProjects Public AppInstance As Object Dim mcbMenuCommandBar As Office.CommandBarButton Public WithEvents MenuEventHandler As Office.CommandBarButton Attribute MenuEventHandler.VB_VarHelpID = -1 ' String Constants for Project menu item Const CMB_NAME As String = "File" Const CMB_CAPTION As String = "Open &My Projects from Database" Const CMB_KEY As String = "OpenMyDatabaseProjects" Sub Show()
On Error Resume Next
If mfrmAddIn Is Nothing Then Set mfrmAddIn = New frmFilteredProjects End If
'Set variables in form Set mfrmAddIn.AppInstance = AppInstance mfrmAddIn.Show vbModal End Sub '------------------------------------------------------ 'connects the add-in to Project '------------------------------------------------------ Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _ ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _ ByVal AddInInst As Object, custom() As Variant)
Dim mcbToolBar As Office.CommandBar
On Error GoTo OnConnectionErr
'save the Project application instance Set AppInstance = Application
'this is a good place to set a breakpoint and 'test various addin objects, properties and methods
If ConnectMode = ext_cm_External Then 'Used by the wizard toolbar to start this wizard Me.Show Else 'The next two lines add a custom menu item called CMB_CAPTION to 'the CMB_NAME menu item Set mcbMenuCommandBar = CreateAddInMenuCommandBar(CMB_NAME, _ CMB_CAPTION, CMB_KEY, AddInInst) Set MenuEventHandler = mcbMenuCommandBar End If
Exit Sub OnConnectionErr: AddInErr Err
End Sub '----------------------------------------------------------- 'disconnects add-in from Office application '----------------------------------------------------------- Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant) On Error Resume Next
'Remove any added menu items, toolbar items, and or toolbars... RemoveAddInCommandBars (RemoveMode)
'shut down the add-in Unload mfrmAddIn Set mfrmAddIn = Nothing
End Sub Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant) ' End Sub Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant) ' End Sub Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant) ' End Sub '------------------------------------------------------ 'This event fires when the menu control is clicked in the IDE '------------------------------------------------------ Private Sub MenuEventHandler_Click(ByVal Ctrl As Office.CommandBarButton, _ CancelDefault As Boolean)
On Error Resume Next Me.Show
End Sub '------------------------------------------------------ 'This event fires when the toolbar control is clicked in the IDE '------------------------------------------------------ Private Sub ToolbarEventHandler_Click(ByVal Ctrl As Office.CommandBarButton, _ CancelDefault As Boolean)
On Error Resume Next Me.Show
End Sub '------------------------------------------------------- ' Displays message box with error information. '------------------------------------------------------- Sub AddInErr(errX As ErrObject)
End Sub '------------------------------------------------------- 'Adds menu item to the host app menu '------------------------------------------------------- Function CreateAddInMenuCommandBar(sMenuName As String, _ sCaption As String, sKey As String, ByVal AddInInst As Object) _ As Office.CommandBarControl
Dim cbMenuCommandBar As Office.CommandBarControl 'command bar object Dim cbMenu As Object
On Error GoTo AddToAddInCommandBarErr
' Return reference to application menu. Set cbMenu = AppInstance.CommandBars(sMenuName)
If cbMenu Is Nothing Then 'not available so we fail Exit Function End If
'Check if the menu item exists already Set cbMenuCommandBar = cbMenu.FindControl(Tag:=sKey) If cbMenuCommandBar Is Nothing Then 'add commandbar button to the menu Set cbMenuCommandBar = cbMenu.Controls.Add(1) End If
End Function '------------------------------------------------------- 'Removes added in commandbars '------------------------------------------------------- Function RemoveAddInCommandBars(ByVal _ RemoveMode As AddInDesignerObjects.ext_DisconnectMode)
On Error GoTo RemoveAddInCommandBars_Err
' If user unloaded add-in, remove button. Otherwise, add-in is ' being unloaded because application is closing; in that case, ' leave button as is. If RemoveMode = ext_dm_UserClosed Then On Error Resume Next 'Delete the custom menu commandbar control, if found Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY) If Not mcbMenuCommandBar Is Nothing Then mcbMenuCommandBar.Delete End If Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY) If Not mcbMenuCommandBar Is Nothing Then mcbMenuCommandBar.Delete End If Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY) If Not mcbMenuCommandBar Is Nothing Then mcbMenuCommandBar.Delete End If
On Error GoTo RemoveAddInCommandBars_Err End If
RemoveAddInCommandBars_End: Exit Function
RemoveAddInCommandBars_Err: AddInErr Err Resume RemoveAddInCommandBars_End End Function
'假设你的dll是 Test.dll ,且你需要 调用它的 tmpMethod Function Declare Function tmpMethod Lib "Test.dll" (Param As String) As Boolean'下面的,应该是 你subclass中 响应菜单click事件的 回调函数 Sub CallBackFunction(.........) Select Case lMsg '代表传入的消息 Case WM_MENUCOMMAND '假设是 拦截这个消息 '下面是响应你的 .dll '调用 tmpMethod 函数 tmpReply = tmpMethod ("I am Message") If tmpReply = True Then Msgbox "OK" ........ End Selcet End Sub
这个?
Create Your Own Visual Basic Add-Ins
http://www.csdn.net/Develop/Read_Article.asp?Id=12769不过调试的时候麻烦, 要不停的 编译,加载.....
常常弄地 手忙脚乱的.
Begin {AC0714F6-3D04-11D1-AE7D-00A0C90F26F4} Connect
ClientHeight = 8595
ClientLeft = 0
ClientTop = 0
ClientWidth = 11175
_ExtentX = 19711
_ExtentY = 15161
_Version = 393216
Description = "Open a project stored in a database form a filtered list."
DisplayName = "Filtered Project Database Open"
AppName = "Microsoft Project"
AppVer = "Microsoft Project 9.0"
LoadName = "Startup"
LoadBehavior = 3
RegLocation = "HKEY_CURRENT_USER\Software\Microsoft\Office\MS Project"
End
Attribute VB_Name = "Connect"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit Implements IDTExtensibility2 Dim mfrmAddIn As New frmFilteredProjects
Public AppInstance As Object
Dim mcbMenuCommandBar As Office.CommandBarButton
Public WithEvents MenuEventHandler As Office.CommandBarButton
Attribute MenuEventHandler.VB_VarHelpID = -1 ' String Constants for Project menu item
Const CMB_NAME As String = "File"
Const CMB_CAPTION As String = "Open &My Projects from Database"
Const CMB_KEY As String = "OpenMyDatabaseProjects" Sub Show()
On Error Resume Next
If mfrmAddIn Is Nothing Then
Set mfrmAddIn = New frmFilteredProjects
End If
'Set variables in form
Set mfrmAddIn.AppInstance = AppInstance
mfrmAddIn.Show vbModal
End Sub '------------------------------------------------------
'connects the add-in to Project
'------------------------------------------------------
Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
Dim mcbToolBar As Office.CommandBar
On Error GoTo OnConnectionErr
'save the Project application instance
Set AppInstance = Application
'this is a good place to set a breakpoint and
'test various addin objects, properties and methods
If ConnectMode = ext_cm_External Then
'Used by the wizard toolbar to start this wizard
Me.Show
Else
'The next two lines add a custom menu item called CMB_CAPTION to
'the CMB_NAME menu item
Set mcbMenuCommandBar = CreateAddInMenuCommandBar(CMB_NAME, _
CMB_CAPTION, CMB_KEY, AddInInst)
Set MenuEventHandler = mcbMenuCommandBar
End If
Exit Sub OnConnectionErr: AddInErr Err
End Sub '-----------------------------------------------------------
'disconnects add-in from Office application
'-----------------------------------------------------------
Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant) On Error Resume Next
'Remove any added menu items, toolbar items, and or toolbars...
RemoveAddInCommandBars (RemoveMode)
'shut down the add-in
Unload mfrmAddIn
Set mfrmAddIn = Nothing
End Sub Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant)
'
End Sub Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant)
'
End Sub Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant)
'
End Sub '------------------------------------------------------
'This event fires when the menu control is clicked in the IDE
'------------------------------------------------------
Private Sub MenuEventHandler_Click(ByVal Ctrl As Office.CommandBarButton, _
CancelDefault As Boolean)
On Error Resume Next
Me.Show
End Sub '------------------------------------------------------
'This event fires when the toolbar control is clicked in the IDE
'------------------------------------------------------
Private Sub ToolbarEventHandler_Click(ByVal Ctrl As Office.CommandBarButton, _
CancelDefault As Boolean)
On Error Resume Next
Me.Show
End Sub '-------------------------------------------------------
' Displays message box with error information.
'-------------------------------------------------------
Sub AddInErr(errX As ErrObject)
Dim strMsg As String
strMsg = "Application : " & App.Title & vbCrLf & _
"Error Number : " & errX.Number & vbCrLf & _
"Error Description : " & errX.Description
MsgBox strMsg, vbExclamation, "Error"
End Sub '-------------------------------------------------------
'Adds menu item to the host app menu
'-------------------------------------------------------
Function CreateAddInMenuCommandBar(sMenuName As String, _
sCaption As String, sKey As String, ByVal AddInInst As Object) _
As Office.CommandBarControl
Dim cbMenuCommandBar As Office.CommandBarControl 'command bar object
Dim cbMenu As Object
On Error GoTo AddToAddInCommandBarErr
' Return reference to application menu.
Set cbMenu = AppInstance.CommandBars(sMenuName)
If cbMenu Is Nothing Then
'not available so we fail
Exit Function
End If
'Check if the menu item exists already
Set cbMenuCommandBar = cbMenu.FindControl(Tag:=sKey)
If cbMenuCommandBar Is Nothing Then
'add commandbar button to the menu
Set cbMenuCommandBar = cbMenu.Controls.Add(1)
End If
'set the caption
cbMenuCommandBar.Caption = sCaption
cbMenuCommandBar.Tag = sKey
cbMenuCommandBar.OnAction = "!<" & AddInInst.ProgId & ">"
Set CreateAddInMenuCommandBar = cbMenuCommandBar
Exit Function
AddToAddInCommandBarErr:
AddInErr Err
End Function '-------------------------------------------------------
'Removes added in commandbars
'-------------------------------------------------------
Function RemoveAddInCommandBars(ByVal _
RemoveMode As AddInDesignerObjects.ext_DisconnectMode)
On Error GoTo RemoveAddInCommandBars_Err
' If user unloaded add-in, remove button. Otherwise, add-in is
' being unloaded because application is closing; in that case,
' leave button as is.
If RemoveMode = ext_dm_UserClosed Then
On Error Resume Next
'Delete the custom menu commandbar control, if found
Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY)
If Not mcbMenuCommandBar Is Nothing Then
mcbMenuCommandBar.Delete
End If
Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY)
If Not mcbMenuCommandBar Is Nothing Then
mcbMenuCommandBar.Delete
End If
Set mcbMenuCommandBar = AppInstance.CommandBars.FindControl(Tag:=CMB_KEY)
If Not mcbMenuCommandBar Is Nothing Then
mcbMenuCommandBar.Delete
End If
On Error GoTo RemoveAddInCommandBars_Err
End If
RemoveAddInCommandBars_End:
Exit Function
RemoveAddInCommandBars_Err:
AddInErr Err
Resume RemoveAddInCommandBars_End
End Function
我不是要做VB的ADDIN,而是要让自己的程序支持ADDIN
如果 是用 api 动态添加的, 那就麻烦了.
要用 Subclass 技术, 捕获 菜单被 Click 的消息了.
我用了subclass,可是我怎么在插件中响应对菜单的操作(插件和菜单要对应上)
这个和 你是否有插件 无关.只要你 已实现 响应菜单了. 什么都好办了.
Declare Function tmpMethod Lib "Test.dll" (Param As String) As Boolean'下面的,应该是 你subclass中 响应菜单click事件的 回调函数
Sub CallBackFunction(.........)
Select Case lMsg '代表传入的消息
Case WM_MENUCOMMAND '假设是 拦截这个消息
'下面是响应你的 .dll
'调用 tmpMethod 函数
tmpReply = tmpMethod ("I am Message")
If tmpReply = True Then Msgbox "OK"
........
End Selcet
End Sub
呵呵,可没有那么简单! 要知道所谓Add-In,都是指在主程序编写时,并不知道它有什么方法、属性、事件,所以要想实现插件,最重要的是解决如何在运行时得到这些,然后才谈得上怎么调用! 推荐你和《超级文档管理器》这个软件的作者联系学习一下!
是啊,我现在难点是在注册菜单时,应该采用什么方法
1。将菜单项与插件联系起来,也就是说,我选择了一个菜单项应该知道是哪个插件的菜单项。
2。采用事件超级文档管理器》这个软件的作者怎么联系啊
主页:emanager.51.net 学学这个软件吧,它就实现了“插件”!