Click here to Skip to main content
Click here to Skip to main content

ATL COM Based Addin / Plugin Framework With Dynamic Toolbars and Menus

By , 9 Dec 2004
 

Links

Introduction

Building a product which suits to every customers requirement is every Companies dream. But in practice this may not be the case. This is because in most of the cases the requirement keep on changing drastically so that we have to make changes in the code level , recompile it, test it and ship it as another version. This way of development is not efficient in terms of project cost and developmental effort. This is where the Addin / Plugin architecture wins. In this article I have written a ATL COM Addin / Plugin Framework with dynamic toolbars and menu support . This framework is actually based on the VC++ 6.0 Addin Architecture which Microsoft used in every MS Office based applications (not sure of the exact implementation , just a guess work, because I followed the same path of VC++ Addin wizard generated code ). One difference, instead of adding menus , their description and other details in a new line delimited fashion in VC++ Addin , I used XML format for adding the Plugin details (Don't know why Microsoft didn't use XML?, perhaps at that time XML was not standardized , or is there any other specific reason??) along with Component Category for categorizing the plugins. Click here for seeing the XML format which I used in this project. You can add more properties as leaf nodes if you want (I followed the Idea of putting menu properties as nodes. Alternatively you can put the properties in some other fashion too).

Background

This article assumes that you have a basic understanding of COM and MFC. This article is actually a continuation of the excellent article written by Zac Howland Pluggable Components using Component Categories - Part 1 . So the user is advised to go through this article first before coming to my article.

Using the code

The demo project attached contains 3 project workspaces written in VC++ 6.0. The application ProjectFramework is the one which loads all the addins , their menus, toolbars and other details. This application uses one core class called CAddinManager for various addin manipulations. The main header file of CAddinManager class is given below.

class CAddinManager 
{
private:
    BOOL m_bLoadAllAdins;
    CArray<CAddinInfo,CAddinInfo> m_AddinInfoArray;
    CComPtr<IProjectFramework> m_ProjectFrameworkObject;
    HRESULT LoadAllAdins(BSTR strAddinLoadingInfo,
                         IProjectFramework* pProjectFramework);
 
public:
    BOOL InvokeAddinMenuItem(UINT iCommandID);
    BOOL SetAddinVisible(CString strAddinName, BOOL bVisible);
    const CAddinInfo& GetAddinInformation(UINT iCommandID);
    const CAddinCommadInfo& GetAddinCommadInfo(UINT iCommandID);
    CAddinCommadInfo GetAddinCommadInfo(long iAddinIndex,long lIndex);
    BOOL AddAddinCommandInfo(long iAddinIndex, 
                             CAddinCommadInfo AddinCommadInfo);
    BOOL SetAddinCount(long lCount);
    BOOL UnloadAllAddins();
    CAddinInfo GetAddinInfo(long iAddinIndex);
    BOOL SetAddinInfo(long iAddinIndex,CAddinInfo AddinInfo);
    long GetAddinCount();
    void SetLoadAllAddinStatus(BOOL bLoadAllAddins);
    virtual BOOL GetLoadAllAddinStatus();
    CAddinInfo GetAddinIffo(CLSID clsID);

    BOOL LoadAllAddins();
    BOOL SaveAddinDefaultSettings();
    BOOL LoadAddinDefaultSettings();
    
    CAddinManager();
    virtual ~CAddinManager();

};
This class uses a lot of other related classes like CAddinInfo which contains information's about each addin, IProjectFramework which is the interface exposed by the ProjectFramework application and IProjectFrameworkAddin interface which every pluggin should implement. Please see the source code for more details.The important blocks of codes in which the application built up is given below.

In CProjectFrameworkApp declare a variable of CAddinManager statically.

static CAddinManager m_AddinManager;
static CProjectFrameworkView* m_pView;

in

BOOL CProjectFrameworkApp::InitInstance()
{
    ...
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    ((CMainFrame*)m_pMainWnd)->LoadAditionalAccelerators();
}

in CMainFrame

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_ADDIN_ADDINSETTINGS, OnAddinAddinsettings)
ON_WM_CLOSE()
ON_WM_MENUSELECT()
ON_WM_INITMENUPOPUP()
//}}AFX_MSG_MAP

ON_COMMAND_RANGE(PF_ADDIN_CMD_MIN_MSG_ID, PF_ADDIN_CMD_MAX_MSG_ID, <BR>                 OnAddinMenuItems)
ON_UPDATE_COMMAND_UI_RANGE(PF_ADDIN_CMD_MIN_MSG_ID, PF_ADDIN_CMD_MAX_MSG_ID, <BR>                 OnUpdateAddinMenuItems)
ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_NEW, ID_APP_ABOUT, OnUpdateMenuItems)

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, PF_MIN_MSG, PF_MAX_MSG, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, PF_MIN_MSG, PF_MAX_MSG, OnToolTipText)

END_MESSAGE_MAP()

and

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;


    //Load all addins
    if(CProjectFrameworkApp::m_AddinManager.LoadAddinDefaultSettings())
    {
        if(CProjectFrameworkApp::m_AddinManager.GetLoadAllAddinStatus())
        {
            CProjectFrameworkApp::m_AddinManager.LoadAllAddins(); 
        }
    }
    LoadAllAddinCommands();

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | 
                                         WS_VISIBLE | CBRS_TOP
                    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY 
                     | CBRS_SIZE_DYNAMIC) 
        || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1; // fail to create
    }

    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
                                      sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("Failed to create status bar\n");
        return -1; // fail to create
    }

    // TODO: Delete these three lines if you don't want the toolbar to
    // be dockable

    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    //Remove File new and Open Commands
    RemoveCommands(ID_FILE_NEW);
    RemoveCommands(ID_FILE_OPEN);
    return 0;
}

Points of Interest

In this version features implemented are.

  1. Dynamic Menus.
  2. Dynamic Toolbars.
  3. Help string and tool tip support.
  4. Invoking of methods in plugins from addin menu and toolbar.
  5. Automation support explained using a dialog box invoked from one of the plugins (Report Addin -> Sales report -> Todays Sales Report Ctrl + B menu ).
  6. Hiding of Menus and toolbar buttons (eg : File ->New and Open ).
  7. Key Board accelerator support for plugin.
  8. Loading / Unloading of addins.
  9. Connection point support for getting notification events from addins.

History

  • Initial Release : Dec 2, 2004
  • Added Connection Point support : Dec 10, 2004

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

thomas_tom99
Chief Technology Officer KTS INFOTECH PVT LTD
India India
Member
->9+ Years of Experience in IT Field.
->Basically a C++ Programmer migrating to .NET
->Have Masters degree in Physics and Computer Scince.
-> Doing his Ph.D(Part Time) in Optical Networking)
->Interests: Software product development,Networking, Robotics,Sports Physics, Learning musical instruments, Cricket.
 
->Resides in kerala ,the gods own country, with his mother and wife.
 

Home page


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalfails under VC2008memberemmy20098 Jun '09 - 1:30 
Generalabout the frameworkmemberpan xie22 Nov '07 - 21:46 
I am a beginner on com.I want to ask an elementary question .when I create a new project like "ProjectFramework" ,what kind of "project types" should I select?
Also,how can I send the document info of the framework to the component.
Looking forward to your help.Thank you .Smile | :)
 
xiep
GeneralRe: about the frameworkmemberthomas_tom9929 Nov '07 - 21:06 
Generalabout the frameworkmemberpan xie22 Nov '07 - 21:45 
GeneralUsing a resource from an ATL COM MFC Componentmembercmacgowan7 Sep '07 - 9:43 
GeneralRe: Using a resource from an ATL COM MFC Componentmemberthomas_tom9912 Sep '07 - 0:42 
QuestionHandling view related msg in Addinmembersharathgowda19 Aug '07 - 21:44 
AnswerRe: Handling view related msg in Addinmemberthomas_tom9928 Aug '07 - 20:15 
QuestionIs this work fine under vs2005?memberzhms25 Apr '07 - 5:33 
AnswerRe: Is this work fine under vs2005?memberthomas_tom9929 Apr '07 - 23:34 
GeneralNeed to add the project types in VS.net 2005memberkarabagamoorthy16 Nov '06 - 16:46 
GeneralRe: Need to add the project types in VS.net 2005memberthomas_tom9917 Nov '06 - 15:31 
Generalsupprt for controls in toolbarsmemberbensabat6 Nov '05 - 22:09 
GeneralRe: supprt for controls in toolbarsmemberthomas_tom9910 Nov '05 - 3:30 
GeneralA problem with the app toolbarmemberbensabat23 Oct '05 - 23:08 
GeneralRe: A problem with the app toolbarmemberthomas_tom9926 Oct '05 - 22:09 
GeneralRe: A problem with the app toolbarmemberbensabat27 Oct '05 - 0:32 
GeneralRe: A problem with the app toolbarmemberthomas_tom9927 Oct '05 - 1:54 
GeneralRe: A problem with the app toolbarmemberbensabat27 Oct '05 - 2:15 
Generala Problem with MDI applicationmemberbensabat11 Oct '05 - 1:27 
GeneralRe: a Problem with MDI applicationmemberthomas_tom9912 Oct '05 - 19:10 
GeneralRe: a Problem with MDI applicationmemberbensabat13 Oct '05 - 20:36 
GeneralRe: a Problem with MDI applicationmemberbensabat17 Oct '05 - 20:31 
GeneralRe: a Problem with MDI applicationmemberthomas_tom9927 Oct '05 - 2:22 
GeneralMemory leak! with fix solution.memberHarveyLiu19 Aug '05 - 0:57 
QuestionHow can I merge the Menu to the ChildFrame?memberHarveyLiu2 Aug '05 - 22:49 
AnswerRe: How can I merge the Menu to the ChildFrame?memberthomas_tom993 Aug '05 - 19:41 
GeneralRe: How can I merge the Menu to the ChildFrame?memberHarveyLiu3 Aug '05 - 22:23 
GeneralRe: How can I merge the Menu to the ChildFrame?memberthomas_tom994 Aug '05 - 0:42 
GeneralThank you very much !membervark331 Jan '05 - 1:27 
Questionaddinmanager.h(89): error C4716: 'CAddinCommadInfo::operator=' is ???membervark330 Jan '05 - 21:37 
AnswerRe: addinmanager.h(89): error C4716: 'CAddinCommadInfo::operator=' is ???memberthomas_tom9931 Jan '05 - 0:00 
GeneralRe: addinmanager.h(89): error C4716: 'CAddinCommadInfo::operator=' is ???memberthomas_tom9931 Jan '05 - 0:08 
Questionwhat is the role of CFrameWorkAddin1memberbensabat24 Dec '04 - 23:11 
AnswerRe: what is the role of CFrameWorkAddin1memberthomas_tom9927 Dec '04 - 20:16 
GeneralRe: what is the role of CFrameWorkAddin1memberbensabat27 Dec '04 - 22:02 
Generalfails under vc7 - more precisememberbensabat17 Dec '04 - 22:06 
GeneralRe: fails under vc7 - more precisememberthomas_tom9919 Dec '04 - 16:57 
GeneralRe: fails under vc7 - more precisememberthomas_tom9920 Dec '04 - 23:57 
GeneralRe: fails under vc7 - more precise Answermemberthomas_tom9920 Dec '04 - 23:57 
GeneralRe: fails under vc7 - more precise Answermemberbensabat21 Dec '04 - 4:31 
Generalfails under VC7memberbensabat17 Dec '04 - 20:27 
GeneralDownload filesstaffSmitha Vijayan5 Dec '04 - 23:59 
GeneralRe: Download filessussAnonymous8 Dec '04 - 16:53 
QuestionWhat about connections points ?memberbensabat5 Dec '04 - 3:32 
AnswerRe: What about connections points ?memberthomas_tom995 Dec '04 - 22:44 
GeneralRe: What about connections points ?memberthomas_tom999 Dec '04 - 20:08 
GeneralGudie GudiememberThatsAlok9 Dec '04 - 20:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 10 Dec 2004
Article Copyright 2004 by thomas_tom99
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid