Using IDispEventSimpleImpl
Quando si utilizza IDispEventSimpleImpl per gestire gli eventi, sarà necessario:
Derivare la classe da IDispEventSimpleImpl.
Aggiungere mappa del sink di eventi alla classe.
Definire le strutture _ATL_FUNC_INFORMATION che descrivono gli eventi.
Aggiungere voci alla mappa del sink di eventi utilizzando la macro SINK_ENTRY_INFORMATION.
Implementare i metodi desiderato gestione.
Consigli e unadvise origine eventi.
Esempio
L'esempio riportato di seguito viene illustrato come gestire l'evento DocumentChange generato dall'oggetto Applicazione di Word. Questo evento viene definito come metodo sull'interfaccia dispatch ApplicationEvents.
l'esempio proviene da Esempio ATLEventHandling.
[
uuid(000209F7-0000-0000-C000-000000000046),
hidden
]
dispinterface ApplicationEvents {
properties:
methods:
[id(0x00000001), restricted, hidden]
void Startup();
[id(0x00000002)]
void Quit();
[id(0x00000003)]
void DocumentChange();
};
L'esempio utilizza #import per generare file di intestazione necessari dalla libreria dei tipi di Word. Se si desidera utilizzare questo esempio con altre versioni di Word, è necessario specificare il file corretto della DLL mso. Ad esempio, Office 2000 fornisce mso9.dll e Office XP fornisce mso.dll. Questo codice viene semplificato in stdafx.h:
#pragma warning (disable : 4146)
// Paths to required MS OFFICE files (replace "MSO.DLL" and "MSWORD.OLB" with the actual paths to those files...)
#define _MSDLL_PATH "MSO.DLL"
// Delete the *.tlh files when changing import qualifiers
#import _MSDLL_PATH rename("RGB", "MSRGB") rename("DocumentProperties", "WordDocumentProperties") raw_interfaces_only
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only
#define _MSWORDOLB_PATH "MSWORD.OLB"
#import _MSWORDOLB_PATH rename("ExitWindows", "WordExitWindows") rename("FindText", "WordFindText") raw_interfaces_only
#pragma warning (default : 4146)
Le uniche informazioni dalla libreria dei tipi effettivamente utilizzata in questo esempio vengono il CLSID dell'oggetto di Word Applicazione e dell'IID dell'interfaccia ApplicationEvents. Queste informazioni sono utilizzate solo in fase di compilazione.
Verrà visualizzato il codice seguente in Simple.h. Il codice rilevante è indicato dai commenti:
// Note declaration of structure for type information
extern _ATL_FUNC_INFO OnDocChangeInfo;
extern _ATL_FUNC_INFO OnQuitInfo;
class ATL_NO_VTABLE CSimple :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSimple, &CLSID_Simple>,
public IDispatchImpl<ISwitch, &IID_ISwitch, &LIBID_ATLEVENTHANDLINGLib>,
// Note inheritance from IDispEventSimpleImpl
public IDispEventSimpleImpl</*nID =*/ 1, CSimple, &__uuidof(Word::ApplicationEvents)>
{
public:
CSimple()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLE)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSimple)
COM_INTERFACE_ENTRY(ISwitch)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
CComPtr<Word::_Application> m_pApp;
// Event handlers
// Note the __stdcall calling convention and
// dispinterface-style signature
void __stdcall OnQuit()
{
Stop();
}
void __stdcall OnDocChange()
{
ATLASSERT(m_pApp != NULL);
// Get a pointer to the _Document interface on the active document
CComPtr<Word::_Document> pDoc;
m_pApp->get_ActiveDocument(&pDoc);
// Get the name from the active document
CComBSTR bstrName;
if (pDoc)
pDoc->get_Name(&bstrName);
// Create a display string
CComBSTR bstrDisplay(_T("New document title:\n"));
bstrDisplay += bstrName;
// Display the name to the user
USES_CONVERSION;
MessageBox(NULL, W2CT(bstrDisplay), _T("IDispEventSimpleImpl : Active Document Changed"), MB_OK);
}
// Note the mapping from Word events to our event handler functions.
BEGIN_SINK_MAP(CSimple)
SINK_ENTRY_INFO(/*nID =*/ 1, __uuidof(Word::ApplicationEvents), /*dispid =*/ 3, OnDocChange, &OnDocChangeInfo)
SINK_ENTRY_INFO(/*nID =*/ 1, __uuidof(Word::ApplicationEvents), /*dispid =*/ 2, OnQuit, &OnQuitInfo)
END_SINK_MAP()
// ISwitch
public:
STDMETHOD(Start)()
{
// If we already have an object, just return
if (m_pApp)
return S_OK;
// Create an instance of Word's Application object
HRESULT hr = m_pApp.CoCreateInstance(__uuidof(Word::Application), NULL, CLSCTX_SERVER);
if (FAILED(hr))
return hr;
ATLASSERT(m_pApp != NULL);
// Make the Word user interface visible
m_pApp->put_Visible(true);
// Note call to advise
// Forge a connection to enable us to receive events
DispEventAdvise(m_pApp);
return S_OK;
}
STDMETHOD(Stop)()
{
// Check we have an object to unadvise on
if (!m_pApp)
return S_OK;
// Note call to unadvise
// Break the connection with the event source
DispEventUnadvise(m_pApp);
// Release the Word application
m_pApp.Release();
return S_OK;
}
};
Il codice seguente proviene da Simple.cpp:
// Define type info structure
_ATL_FUNC_INFO OnDocChangeInfo = {CC_STDCALL, VT_EMPTY, 0};
_ATL_FUNC_INFO OnQuitInfo = {CC_STDCALL, VT_EMPTY, 0};
// (don't actually need two structure since they're the same)