1 | //////////////////////////////////////////////////////////// |
---|
2 | // Copyright (C) Roman Ryltsov, 2008-2013 |
---|
3 | // Created by Roman Ryltsov roman@alax.info |
---|
4 | |
---|
5 | #pragma once |
---|
6 | |
---|
7 | #include "resource.h" |
---|
8 | #include "Server_i.h" |
---|
9 | |
---|
10 | //////////////////////////////////////////////////////////// |
---|
11 | // CValueMarshalT |
---|
12 | |
---|
13 | template <typename T> |
---|
14 | class ATL_NO_VTABLE CValueMarshalT : |
---|
15 | public IMarshal |
---|
16 | { |
---|
17 | public: |
---|
18 | // CValueMarshalT |
---|
19 | |
---|
20 | // IMarshal |
---|
21 | STDMETHOD(GetUnmarshalClass)(REFIID InterfaceIdentifier, VOID* pvInstance, DWORD nContext, VOID* pvContext, DWORD nFlags, CLSID* pClassIdentifier) throw() |
---|
22 | { |
---|
23 | _Z4(atlTraceCOM, 4, _T("InterfaceIdentifier %ls, pvInstance 0x%p, nContext %d, nFlags 0x%x\n"), _PersistHelper::StringFromInterfaceIdentifier(InterfaceIdentifier), pvInstance, nContext, nFlags); |
---|
24 | _ATLTRY |
---|
25 | { |
---|
26 | __D(pClassIdentifier, E_POINTER); |
---|
27 | InterfaceIdentifier; pvInstance; nContext; pvContext; nFlags; |
---|
28 | *pClassIdentifier = T::GetObjectCLSID(); |
---|
29 | } |
---|
30 | _ATLCATCH(Exception) |
---|
31 | { |
---|
32 | _C(Exception); |
---|
33 | } |
---|
34 | return S_OK; |
---|
35 | } |
---|
36 | STDMETHOD(GetMarshalSizeMax)(REFIID InterfaceIdentifier, VOID* pvInstance, DWORD nContext, VOID* pvContext, DWORD nFlags, DWORD* pnSize) throw() |
---|
37 | { |
---|
38 | _Z4(atlTraceCOM, 4, _T("InterfaceIdentifier %ls, pvInstance 0x%p, nContext %d, nFlags 0x%x\n"), _PersistHelper::StringFromInterfaceIdentifier(InterfaceIdentifier), pvInstance, nContext, nFlags); |
---|
39 | _ATLTRY |
---|
40 | { |
---|
41 | __D(pnSize, E_POINTER); |
---|
42 | InterfaceIdentifier; pvInstance; nContext; pvContext; nFlags; |
---|
43 | T* pT = static_cast<T*>(this); |
---|
44 | IPersistStreamInit* pPersistStreamInit = pT; |
---|
45 | ULARGE_INTEGER nSize; |
---|
46 | __C(pPersistStreamInit->GetSizeMax(&nSize)); |
---|
47 | _A(!nSize.HighPart); |
---|
48 | *pnSize = (DWORD) nSize.LowPart; |
---|
49 | } |
---|
50 | _ATLCATCH(Exception) |
---|
51 | { |
---|
52 | _C(Exception); |
---|
53 | } |
---|
54 | return S_OK; |
---|
55 | } |
---|
56 | STDMETHOD(MarshalInterface)(IStream* pStream, REFIID InterfaceIdentifier, VOID* pvInstance, DWORD nContext, VOID* pvContext, DWORD nFlags) throw() |
---|
57 | { |
---|
58 | _Z4(atlTraceCOM, 4, _T("InterfaceIdentifier %ls, pvInstance 0x%p, nContext %d, nFlags 0x%x\n"), _PersistHelper::StringFromInterfaceIdentifier(InterfaceIdentifier), pvInstance, nContext, nFlags); |
---|
59 | _ATLTRY |
---|
60 | { |
---|
61 | __D(pStream, E_INVALIDARG); |
---|
62 | InterfaceIdentifier; pvInstance; nContext; pvContext; nFlags; |
---|
63 | T* pT = static_cast<T*>(this); |
---|
64 | IPersistStreamInit* pPersistStreamInit = pT; |
---|
65 | __C(pPersistStreamInit->Save(pStream, FALSE)); |
---|
66 | } |
---|
67 | _ATLCATCH(Exception) |
---|
68 | { |
---|
69 | _C(Exception); |
---|
70 | } |
---|
71 | return S_OK; |
---|
72 | } |
---|
73 | STDMETHOD(UnmarshalInterface)(IStream* pStream, const IID& InterfaceIdentifier, VOID** ppvInstance) throw() |
---|
74 | { |
---|
75 | _Z4(atlTraceCOM, 4, _T("InterfaceIdentifier %ls\n"), _PersistHelper::StringFromInterfaceIdentifier(InterfaceIdentifier)); |
---|
76 | _ATLTRY |
---|
77 | { |
---|
78 | T* pT = static_cast<T*>(this); |
---|
79 | IPersistStreamInit* pPersistStreamInit = pT; |
---|
80 | __C(pPersistStreamInit->Load(pStream)); |
---|
81 | __C(pT->QueryInterface(InterfaceIdentifier, ppvInstance)); |
---|
82 | } |
---|
83 | _ATLCATCH(Exception) |
---|
84 | { |
---|
85 | _C(Exception); |
---|
86 | } |
---|
87 | return S_OK; |
---|
88 | } |
---|
89 | STDMETHOD(ReleaseMarshalData)(IStream* pStream) throw() |
---|
90 | { |
---|
91 | _Z4(atlTraceCOM, 4, _T("...\n")); |
---|
92 | pStream; |
---|
93 | return S_OK; |
---|
94 | } |
---|
95 | STDMETHOD(DisconnectObject)(DWORD nReserved) throw() |
---|
96 | { |
---|
97 | _Z4(atlTraceCOM, 4, _T("...\n")); |
---|
98 | nReserved; |
---|
99 | return S_OK; |
---|
100 | } |
---|
101 | }; |
---|
102 | |
---|
103 | //////////////////////////////////////////////////////////// |
---|
104 | // CFoo |
---|
105 | |
---|
106 | class ATL_NO_VTABLE CFoo : |
---|
107 | public CComObjectRootEx<CComMultiThreadModelNoCS>, |
---|
108 | public CComCoClass<CFoo, &__uuidof(Foo)>, |
---|
109 | public CBasePersistT<CFoo>, |
---|
110 | public IRoPersistStreamInitT<CFoo>, |
---|
111 | public CValueMarshalT<CFoo>, |
---|
112 | public IDispatchImpl<IFoo> |
---|
113 | { |
---|
114 | public: |
---|
115 | enum { IDR = IDR_FOO }; |
---|
116 | |
---|
117 | //DECLARE_REGISTRY_RESOURCEID(IDR) |
---|
118 | |
---|
119 | DECLARE_PROTECT_FINAL_CONSTRUCT() |
---|
120 | |
---|
121 | DECLARE_QI_TRACE(CFoo) |
---|
122 | |
---|
123 | BEGIN_COM_MAP(CFoo) |
---|
124 | COM_INTERFACE_ENTRY(IPersist) |
---|
125 | COM_INTERFACE_ENTRY_IID(__uuidof(IPersistStream), IPersistStreamInit) |
---|
126 | COM_INTERFACE_ENTRY(IPersistStreamInit) |
---|
127 | COM_INTERFACE_ENTRY(IMarshal) |
---|
128 | COM_INTERFACE_ENTRY(IFoo) |
---|
129 | COM_INTERFACE_ENTRY(IDispatch) |
---|
130 | END_COM_MAP() |
---|
131 | |
---|
132 | BEGIN_PROP_MAP(CFoo) |
---|
133 | PROP_ENTRY_TYPE_EX("Value", DISPID_VALUE, CLSID_NULL, __uuidof(IFoo), VT_VARIANT) |
---|
134 | END_PROP_MAP() |
---|
135 | |
---|
136 | private: |
---|
137 | mutable CRoCriticalSection m_DataCriticalSection; |
---|
138 | CComVariantArray m_vValue; |
---|
139 | |
---|
140 | public: |
---|
141 | // CFoo |
---|
142 | static CString GetObjectFriendlyName() |
---|
143 | { |
---|
144 | return _StringHelper::GetLine(IDR, 2); |
---|
145 | } |
---|
146 | static HRESULT WINAPI UpdateRegistry(BOOL bRegister) throw() |
---|
147 | { |
---|
148 | _Z2(atlTraceRegistrar, 2, _T("bRegister %d\n"), bRegister); |
---|
149 | _ATLTRY |
---|
150 | { |
---|
151 | UpdateRegistryFromResource<CFoo>(bRegister); |
---|
152 | } |
---|
153 | _ATLCATCH(Exception) |
---|
154 | { |
---|
155 | _C(Exception); |
---|
156 | } |
---|
157 | return S_OK; |
---|
158 | } |
---|
159 | CFoo() : |
---|
160 | CBasePersistT<CFoo>(m_DataCriticalSection) |
---|
161 | { |
---|
162 | _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this); |
---|
163 | } |
---|
164 | ~CFoo() |
---|
165 | { |
---|
166 | _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this); |
---|
167 | } |
---|
168 | |
---|
169 | // IFoo |
---|
170 | STDMETHOD(get_Value)(VARIANT* pvValue) throw() |
---|
171 | { |
---|
172 | _Z4(atlTraceCOM, 4, _T("...\n")); |
---|
173 | _ATLTRY |
---|
174 | { |
---|
175 | __D(pvValue, E_POINTER); |
---|
176 | _V(CComVariant(m_vValue).Detach(pvValue)); |
---|
177 | } |
---|
178 | _ATLCATCH(Exception) |
---|
179 | { |
---|
180 | _C(Exception); |
---|
181 | } |
---|
182 | return S_OK; |
---|
183 | } |
---|
184 | STDMETHOD(put_Value)(VARIANT vValue) throw() |
---|
185 | { |
---|
186 | _Z4(atlTraceCOM, 4, _T("vValue.vt 0x%02X\n"), vValue.vt); |
---|
187 | _ATLTRY |
---|
188 | { |
---|
189 | m_vValue = vValue; |
---|
190 | } |
---|
191 | _ATLCATCH(Exception) |
---|
192 | { |
---|
193 | _C(Exception); |
---|
194 | } |
---|
195 | return S_OK; |
---|
196 | } |
---|
197 | }; |
---|
198 | |
---|
199 | OBJECT_ENTRY_AUTO(__uuidof(Foo), CFoo) |
---|