Solved

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

Posted on 2007-03-27
3
413 Views
Last Modified: 2013-11-17
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.  

http://support.microsoft.com/support/kb/articles/Q230/6/89.ASP

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...
0
Comment
Question by:craig20120
  • 2
3 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 18802664
>>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;
    m_pButtonHandler->AddRef();
    m_pButtonHandler->SinkEvents(vtButton.pdispVal);

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)
        return DISP_E_UNKNOWNINTERFACE;

    if (dispIdMember != 0x00000001)
        return DISP_E_MEMBERNOTFOUND;

    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;
}
0
 

Author Comment

by:craig20120
ID: 18804082
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.  

Thanks!
0
 
LVL 86

Accepted Solution

by:
jkr earned 250 total points
ID: 18805034
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
}

See also http://msdn2.microsoft.com/en-us/ms891678.aspx ("VARIANT and VARIANTARG")
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you work with Word a lot, you probably use styles. If you use styles a lot, you've probably balled your fist more often than not when working with the ribbon. In Word 2007/2010, one of the things that I find missing when using styles is a quic…
This article describes how to use the Send to Mail Recipient command. The instructions apply generally to Office 2007 and later versions, but Microsoft® Word 2013 was used for the specific steps and figures.  What is Send to Mail Recipient? Send…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
In a previous video Micro Tutorial here at Experts Exchange (http://www.experts-exchange.com/videos/1358/How-to-get-a-free-trial-of-Office-365-with-the-Office-2016-desktop-applications.html), I explained how to get a free, one-month trial of Office …

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question