1 | #include "stdafx.h" |
---|
2 | |
---|
3 | #import "libid:D5B49BC2-6062-417E-897E-1018E62BF038" raw_interfaces_only // ComEvents01 |
---|
4 | |
---|
5 | class CSink : |
---|
6 | public IDispatch |
---|
7 | { |
---|
8 | private: |
---|
9 | CComPtr<ITypeLib> m_pTypeLib; |
---|
10 | CComPtr<ITypeInfo> m_pTypeInfo; |
---|
11 | |
---|
12 | public: |
---|
13 | // CSink |
---|
14 | CSink() |
---|
15 | { |
---|
16 | ATLENSURE_SUCCEEDED(LoadRegTypeLib(__uuidof(ComEvents01::__ComEvents01), 1, 0, 0, &m_pTypeLib)); |
---|
17 | ATLENSURE_SUCCEEDED(m_pTypeLib->GetTypeInfoOfGuid(__uuidof(ComEvents01::IParserStateEvents), &m_pTypeInfo)); |
---|
18 | } |
---|
19 | |
---|
20 | // IUnkonwn |
---|
21 | STDMETHOD(QueryInterface)(REFIID InterfaceIdentifier, VOID** ppvObject) override |
---|
22 | { |
---|
23 | if(!(InterfaceIdentifier == __uuidof(IUnknown) || InterfaceIdentifier == __uuidof(IDispatch) || InterfaceIdentifier == __uuidof(ComEvents01::IParserStateEvents))) |
---|
24 | return E_NOINTERFACE; |
---|
25 | *ppvObject = this; |
---|
26 | return S_OK; |
---|
27 | } |
---|
28 | STDMETHOD_(ULONG, AddRef)() override |
---|
29 | { |
---|
30 | return 2; |
---|
31 | } |
---|
32 | STDMETHOD_(ULONG, Release)() override |
---|
33 | { |
---|
34 | return 1; |
---|
35 | } |
---|
36 | |
---|
37 | // IDispatch |
---|
38 | STDMETHOD(GetTypeInfoCount)(UINT* pnCount) override |
---|
39 | { |
---|
40 | //_Z4(atlTraceCOM, 4, _T("this 0x%p\n"), this); |
---|
41 | *pnCount = 1; |
---|
42 | return S_OK; |
---|
43 | } |
---|
44 | STDMETHOD(GetTypeInfo)(UINT nIndex, LCID nLocaleIdentifier, ITypeInfo** ppTypeInfo) override |
---|
45 | { |
---|
46 | //_Z4(atlTraceCOM, 4, _T("this 0x%p, nIndex %d, nLocaleIdentifier %d\n"), this, nIndex, nLocaleIdentifier); |
---|
47 | if(nIndex != 0) |
---|
48 | return DISP_E_BADINDEX; |
---|
49 | nLocaleIdentifier; |
---|
50 | *ppTypeInfo = CComPtr<ITypeInfo>(m_pTypeInfo).Detach(); |
---|
51 | return S_OK; |
---|
52 | } |
---|
53 | STDMETHOD(GetIDsOfNames)(REFIID InterfaceIdentifier, LPOLESTR* ppszNames, UINT nNameCount, LCID nLocaleIdentifier, DISPID* pnDispatchIdentifiers) override |
---|
54 | { |
---|
55 | //_Z4(atlTraceCOM, 4, _T("this 0x%p, nNameCount %d, nLocaleIdentifier %d\n"), this, nNameCount, nLocaleIdentifier); |
---|
56 | nLocaleIdentifier; |
---|
57 | //ATLASSERT(InterfaceIdentifier == __uuidof(ComEvents01::IParserStateEvents)); |
---|
58 | return m_pTypeInfo->GetIDsOfNames(ppszNames, nNameCount, pnDispatchIdentifiers); |
---|
59 | } |
---|
60 | STDMETHOD(Invoke)(DISPID nDispatchIdentifier, REFIID InterfaceIdentifier, LCID nLocaleIdentifier, WORD nFlags, DISPPARAMS* pDispParams, VARIANT* pVariantResult, EXCEPINFO* pExcepInfo, UINT* pnErrorArgumentIndex) override |
---|
61 | { |
---|
62 | //_Z4(atlTraceCOM, 4, _T("this 0x%p, nDispatchIdentifier %d, nLocaleIdentifier %d, nFlags 0x%x\n"), this, nDispatchIdentifier, nLocaleIdentifier, nFlags); |
---|
63 | OutputDebugString(_T("IParserStateEvents::Invoke") _T("\r\n")); |
---|
64 | return S_OK; |
---|
65 | } |
---|
66 | }; |
---|
67 | |
---|
68 | int _tmain(int argc, _TCHAR* argv[]) |
---|
69 | { |
---|
70 | CTrace::SetLevel(4); |
---|
71 | ATLENSURE_SUCCEEDED(CoInitialize(NULL)); |
---|
72 | { |
---|
73 | CComPtr<IDispatch> pParserState; |
---|
74 | ATLENSURE_SUCCEEDED(pParserState.CoCreateInstance(__uuidof(ComEvents01::ParserState))); |
---|
75 | CSink Sink; |
---|
76 | DWORD nCookie; |
---|
77 | ATLENSURE_SUCCEEDED(AtlAdvise(pParserState, &Sink, __uuidof(ComEvents01::IParserStateEvents), &nCookie)); |
---|
78 | ATLENSURE_SUCCEEDED(pParserState.Invoke0(L"Initialize")); |
---|
79 | ATLENSURE_SUCCEEDED(AtlUnadvise(pParserState, __uuidof(ComEvents01::IParserStateEvents), nCookie)); |
---|
80 | } |
---|
81 | CoUninitialize(); |
---|
82 | return 0; |
---|
83 | } |
---|
84 | |
---|