Solved

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

Posted on 2007-03-27
3
405 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Unable to start eclipse ? 17 133
Protection area in Word 2 37
Maximize a Word window WITHOUT converting to Two-Page view or changing zoom 4 37
MS Word Office 365 Mail Merge 2 51
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
Office 365 is currently available in five editions. Three of them are for business use: Office 365 Business Essentials, Office 365 Business, and Office 365 Business Premium. Two of them are for home/personal use: Office 365 Home and Office 365 Perso…

920 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

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now