source: trunk/Utilities/Miscellaneous/CustomMarshal/Server/Foo.h @ 218

Last change on this file since 218 was 218, checked in by roman, 11 years ago
File size: 5.2 KB
Line 
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
13template <typename T>
14class ATL_NO_VTABLE CValueMarshalT :
15        public IMarshal
16{
17public:
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
106class 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{
114public:
115        enum { IDR = IDR_FOO };
116
117//DECLARE_REGISTRY_RESOURCEID(IDR)
118
119DECLARE_PROTECT_FINAL_CONSTRUCT()
120
121DECLARE_QI_TRACE(CFoo)
122
123BEGIN_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)
130END_COM_MAP()
131
132BEGIN_PROP_MAP(CFoo)
133        PROP_ENTRY_TYPE_EX("Value", DISPID_VALUE, CLSID_NULL, __uuidof(IFoo), VT_VARIANT)
134END_PROP_MAP()
135
136private:
137        mutable CRoCriticalSection m_DataCriticalSection;
138        CComVariantArray m_vValue;
139
140public:
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
199OBJECT_ENTRY_AUTO(__uuidof(Foo), CFoo)
Note: See TracBrowser for help on using the repository browser.