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