MS Word Addin C++ COM w/o ATL - Determine what toolbar button was clicked??

I am using C++ and COM without using ATL to write a Word 2003 addin.  I used the MSDN article below as the basis for my for my project.

The example only has a single toolbar button so I added several which all get added and initalized fine.  When I click on a button the Invoke method gets called as it should.  My question is how do I tell which button was clicked.  

Help, I am already bald enough...
Who is Participating?
jkrConnect With a Mentor Commented:
Hm, like

IDispatch* pButton;

if (pDispParams->rgvarg[0].vt == VT_DISPATCH) {

  pButton = pDispParams->rgvarg[0].pdispVal;

} else {

   // big error, 1st VARIANTARG has to be of type 'VT_DISPATCH' here

>>My question is how do I tell which button was clicked.

Since the idea is to instantiate a button handler for each individual button, that should be easy to handle:

 // Now, set up an event sink for the Button...
    m_pButtonHandler = new CButtonHandler();  // <------ Option 1: Pass a button ID to the handler in the construcotr
    if (NULL == m_pButtonHandler) goto cleanup;

Alternatively, you can do that in the 'Invoke()' handler:

 * CButtonHandler::Invoke()
 *  The click event is fired by this Invoke call. There is only
 *  one event for this interface (0x00000001) and it takes two
 *  parameters:
 *  LPDISPATCH   pCtrl   -- The primary interface of the button
 *                          being pressed.
 *  VARIANT_BOOL bCancel -- Determines whether the default action
 *                          should be cancled.
STDMETHODIMP CButtonHandler::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
    if (IID_NULL != riid)

    if (dispIdMember != 0x00000001)

    if (NULL == pDispParams) return E_POINTER;
    if (pDispParams->cArgs != 2) return DISP_E_BADPARAMCOUNT;

    // <---------- Option 2: Obtain 'pCtrl' from 'pDispParams' so you can simply read the button text

 // We don't do anything special with this event, so we'll just pop up
 // a message box to let the user know we are here. For a production
 // addin, you would want to forward the event to a callback function
 // in your main addin class. There your addin could handle the event
 // in a more controled manner.
    MessageBox(NULL, "The Click event was fired!!", "My Addin", MB_SETFOREGROUND);

    return S_OK;
craig20120Author Commented:
I like option two the best and actually was actually trying to see how to get the pointer to the control before I posted this.  I figured it was in one of the arguments, but I am still not sure how to retrieve pCtrl and get the text.  I am somewhat new to COM programming.  ATL makes more sense to me then straight COM.  

All Courses

From novice to tech pro — start learning today.