AJA NTV2 SDK  17.6.0.2675
NTV2 SDK 17.6.0.2675
combase.h
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // File: ComBase.h
3 //
4 // Desc: DirectShow base classes - defines a class hierarchy for creating
5 // COM objects.
6 //
7 // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
8 //------------------------------------------------------------------------------
9 
10 
11 /*
12 
13 a. Derive your COM object from CUnknown
14 
15 b. Make a static CreateInstance function that takes an LPUNKNOWN, an HRESULT *
16  and a TCHAR *. The LPUNKNOWN defines the object to delegate IUnknown calls
17  to. The HRESULT * allows error codes to be passed around constructors and
18  the TCHAR * is a descriptive name that can be printed on the debugger.
19 
20  It is important that constructors only change the HRESULT * if they have
21  to set an ERROR code, if it was successful then leave it alone or you may
22  overwrite an error code from an object previously created.
23 
24  When you call a constructor the descriptive name should be in static store
25  as we do not copy the string. To stop large amounts of memory being used
26  in retail builds by all these static strings use the NAME macro,
27 
28  CMyFilter = new CImplFilter(NAME("My filter"),pUnknown,phr);
29  if (FAILED(hr)) {
30  return hr;
31  }
32 
33  In retail builds NAME(_x_) compiles to NULL, the base CBaseObject class
34  knows not to do anything with objects that don't have a name.
35 
36 c. Have a constructor for your object that passes the LPUNKNOWN, HRESULT * and
37  TCHAR * to the CUnknown constructor. You can set the HRESULT if you have an
38  error, or just simply pass it through to the constructor.
39 
40  The object creation will fail in the class factory if the HRESULT indicates
41  an error (ie FAILED(HRESULT) == TRUE)
42 
43 d. Create a FactoryTemplate with your object's class id and CreateInstance
44  function.
45 
46 Then (for each interface) either
47 
48 Multiple inheritance
49 
50 1. Also derive it from ISomeInterface
51 2. Include DECLARE_IUNKNOWN in your class definition to declare
52  implementations of QueryInterface, AddRef and Release that
53  call the outer unknown
54 3. Override NonDelegatingQueryInterface to expose ISomeInterface by
55  code something like
56 
57  if (riid == IID_ISomeInterface) {
58  return GetInterface((ISomeInterface *) this, ppv);
59  } else {
60  return CUnknown::NonDelegatingQueryInterface(riid, ppv);
61  }
62 
63 4. Declare and implement the member functions of ISomeInterface.
64 
65 or: Nested interfaces
66 
67 1. Declare a class derived from CUnknown
68 2. Include DECLARE_IUNKNOWN in your class definition
69 3. Override NonDelegatingQueryInterface to expose ISomeInterface by
70  code something like
71 
72  if (riid == IID_ISomeInterface) {
73  return GetInterface((ISomeInterface *) this, ppv);
74  } else {
75  return CUnknown::NonDelegatingQueryInterface(riid, ppv);
76  }
77 
78 4. Implement the member functions of ISomeInterface. Use GetOwner() to
79  access the COM object class.
80 
81 And in your COM object class:
82 
83 5. Make the nested class a friend of the COM object class, and declare
84  an instance of the nested class as a member of the COM object class.
85 
86  NOTE that because you must always pass the outer unknown and an hResult
87  to the CUnknown constructor you cannot use a default constructor, in
88  other words you will have to make the member variable a pointer to the
89  class and make a NEW call in your constructor to actually create it.
90 
91 6. override the NonDelegatingQueryInterface with code like this:
92 
93  if (riid == IID_ISomeInterface) {
94  return m_pImplFilter->
95  NonDelegatingQueryInterface(IID_ISomeInterface, ppv);
96  } else {
97  return CUnknown::NonDelegatingQueryInterface(riid, ppv);
98  }
99 
100 You can have mixed classes which support some interfaces via multiple
101 inheritance and some via nested classes
102 
103 */
104 
105 #ifndef __COMBASE__
106 #define __COMBASE__
107 
108 // Filter Setup data structures no defined in axextend.idl
109 
110 typedef REGPINTYPES
112 
113 typedef REGFILTERPINS
115 
116 typedef struct _AMOVIESETUP_FILTER
117 {
118  const CLSID * clsID;
119  const WCHAR * strName;
120  DWORD dwMerit;
121  UINT nPins;
123 }
125 
126 /* The DLLENTRY module initialises the module handle on loading */
127 
128 extern HINSTANCE g_hInst;
129 
130 /* On DLL load remember which platform we are running on */
131 
132 extern DWORD g_amPlatform;
133 extern OSVERSIONINFO g_osInfo; // Filled in by GetVersionEx
134 
135 /* Version of IUnknown that is renamed to allow a class to support both
136  non delegating and delegating IUnknowns in the same COM object */
137 
138 #ifndef INONDELEGATINGUNKNOWN_DEFINED
139 DECLARE_INTERFACE(INonDelegatingUnknown)
140 {
141  STDMETHOD(NonDelegatingQueryInterface) (THIS_ REFIID, LPVOID *) PURE;
142  STDMETHOD_(ULONG, NonDelegatingAddRef)(THIS) PURE;
143  STDMETHOD_(ULONG, NonDelegatingRelease)(THIS) PURE;
144 };
145 #define INONDELEGATINGUNKNOWN_DEFINED
146 #endif
147 
148 typedef INonDelegatingUnknown *PNDUNKNOWN;
149 
150 
151 /* This is the base object class that supports active object counting. As
152  part of the debug facilities we trace every time a C++ object is created
153  or destroyed. The name of the object has to be passed up through the class
154  derivation list during construction as you cannot call virtual functions
155  in the constructor. The downside of all this is that every single object
156  constructor has to take an object name parameter that describes it */
157 
159 {
160 
161 private:
162 
163  // Disable the copy constructor and assignment by default so you will get
164  // compiler errors instead of unexpected behaviour if you pass objects
165  // by value or assign objects.
166  CBaseObject(const CBaseObject& objectSrc); // no implementation
167  void operator=(const CBaseObject& objectSrc); // no implementation
168 
169 private:
170  static LONG m_cObjects; /* Total number of objects active */
171 
172 protected:
173 #ifdef DEBUG
174  DWORD m_dwCookie; /* Cookie identifying this object */
175 #endif
176 
177 
178 public:
179 
180  /* These increment and decrement the number of active objects */
181 
182  CBaseObject(__in_opt LPCTSTR pName);
183 #ifdef UNICODE
184  CBaseObject(__in_opt LPCSTR pName);
185 #endif
186  ~CBaseObject();
187 
188  /* Call this to find if there are any CUnknown derived objects active */
189 
190  static LONG ObjectsActive() {
191  return m_cObjects;
192  };
193 };
194 
195 
196 /* An object that supports one or more COM interfaces will be based on
197  this class. It supports counting of total objects for DLLCanUnloadNow
198  support, and an implementation of the core non delegating IUnknown */
199 
200 class AM_NOVTABLE CUnknown : public INonDelegatingUnknown,
201  public CBaseObject
202 {
203 private:
204  const LPUNKNOWN m_pUnknown; /* Owner of this object */
205 
206 protected: /* So we can override NonDelegatingRelease() */
207  volatile LONG m_cRef; /* Number of reference counts */
208 
209 public:
210 
211  CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk);
212  virtual ~CUnknown() {};
213 
214  // This is redundant, just use the other constructor
215  // as we never touch the HRESULT in this anyway
216  CUnknown(__in_opt LPCTSTR Name, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr);
217 #ifdef UNICODE
218  CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk);
219  CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk,__inout_opt HRESULT *phr);
220 #endif
221 
222  /* Return the owner of this object */
223 
224  LPUNKNOWN GetOwner() const {
225  return m_pUnknown;
226  };
227 
228  /* Called from the class factory to create a new instance, it is
229  pure virtual so it must be overriden in your derived class */
230 
231  /* static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *) */
232 
233  /* Non delegating unknown implementation */
234 
235  STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **);
236  STDMETHODIMP_(ULONG) NonDelegatingAddRef();
237  STDMETHODIMP_(ULONG) NonDelegatingRelease();
238 };
239 
240 /* Return an interface pointer to a requesting client
241  performing a thread safe AddRef as necessary */
242 
243 STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv);
244 
245 /* A function that can create a new COM object */
246 
247 typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(__in_opt LPUNKNOWN pUnkOuter, __inout_opt HRESULT *phr);
248 
249 /* A function (can be NULL) which is called from the DLL entrypoint
250  routine for each factory template:
251 
252  bLoading - TRUE on DLL load, FALSE on DLL unload
253  rclsid - the m_ClsID of the entry
254 */
255 typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
256 
257 /* Create one of these per object class in an array so that
258  the default class factory code can create new instances */
259 
261 
262 public:
263 
264  const WCHAR * m_Name;
265  const CLSID * m_ClsID;
269 
270  BOOL IsClassID(REFCLSID rclsid) const {
271  return (IsEqualCLSID(*m_ClsID,rclsid));
272  };
273 
274  CUnknown *CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) const {
275  CheckPointer(phr,NULL);
276  return m_lpfnNew(pUnk, phr);
277  };
278 };
279 
280 
281 /* You must override the (pure virtual) NonDelegatingQueryInterface to return
282  interface pointers (using GetInterface) to the interfaces your derived
283  class supports (the default implementation only supports IUnknown) */
284 
285 #define DECLARE_IUNKNOWN \
286  STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv) { \
287  return GetOwner()->QueryInterface(riid,ppv); \
288  }; \
289  STDMETHODIMP_(ULONG) AddRef() { \
290  return GetOwner()->AddRef(); \
291  }; \
292  STDMETHODIMP_(ULONG) Release() { \
293  return GetOwner()->Release(); \
294  };
295 
296 
297 
298 HINSTANCE LoadOLEAut32();
299 
300 
301 #endif /* __COMBASE__ */
302 
303 
304 
305 
AMOVIESETUP_PIN
REGFILTERPINS AMOVIESETUP_PIN
Definition: combase.h:114
CBaseObject::~CBaseObject
~CBaseObject()
Definition: combase.cpp:54
CFactoryTemplate::IsClassID
BOOL IsClassID(REFCLSID rclsid) const
Definition: combase.h:270
CUnknown::GetOwner
LPUNKNOWN GetOwner() const
Definition: combase.h:224
_AMOVIESETUP_FILTER::strName
const WCHAR * strName
Definition: combase.h:119
NULL
#define NULL
Definition: ntv2caption608types.h:19
CFactoryTemplate::m_lpfnInit
LPFNInitRoutine m_lpfnInit
Definition: combase.h:267
PNDUNKNOWN
INonDelegatingUnknown * PNDUNKNOWN
Definition: combase.h:148
STDMETHODIMP_
STDMETHODIMP_(ULONG) CUnknown
Definition: combase.cpp:163
g_hInst
HINSTANCE g_hInst
Definition: dllentry.cpp:28
nlohmann::json_abiNLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON_v3_11_NLOHMANN_JSON_VERSION_PATCH::detail::void
j template void())
Definition: json.hpp:4893
LPAMOVIESETUP_PIN
REGFILTERPINS *FAR LPAMOVIESETUP_PIN
Definition: combase.h:114
CFactoryTemplate
Definition: combase.h:260
_AMOVIESETUP_FILTER::dwMerit
DWORD dwMerit
Definition: combase.h:120
PAMOVIESETUP_MEDIATYPE
REGPINTYPES * PAMOVIESETUP_MEDIATYPE
Definition: combase.h:111
CUnknown::m_cRef
volatile LONG m_cRef
Definition: combase.h:207
_AMOVIESETUP_FILTER::clsID
const CLSID * clsID
Definition: combase.h:118
pName
CHAR * pName
Definition: amvideo.cpp:26
_AMOVIESETUP_FILTER::nPins
UINT nPins
Definition: combase.h:121
_AMOVIESETUP_FILTER
Definition: combase.h:116
DECLARE_INTERFACE
DECLARE_INTERFACE(INonDelegatingUnknown)
Definition: combase.h:139
CBaseObject::ObjectsActive
static LONG ObjectsActive()
Definition: combase.h:190
LoadOLEAut32
HINSTANCE LoadOLEAut32()
Definition: combase.cpp:73
CFactoryTemplate::m_pAMovieSetup_Filter
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter
Definition: combase.h:268
CFactoryTemplate::CreateInstance
CUnknown * CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) const
Definition: combase.h:274
AMOVIESETUP_FILTER
struct _AMOVIESETUP_FILTER AMOVIESETUP_FILTER
CUnknown::~CUnknown
virtual ~CUnknown()
Definition: combase.h:212
CFactoryTemplate::m_ClsID
const CLSID * m_ClsID
Definition: combase.h:265
PAMOVIESETUP_PIN
REGFILTERPINS * PAMOVIESETUP_PIN
Definition: combase.h:114
CUnknown
Definition: combase.h:200
CFactoryTemplate::m_lpfnNew
LPFNNewCOMObject m_lpfnNew
Definition: combase.h:266
PAMOVIESETUP_FILTER
struct _AMOVIESETUP_FILTER * PAMOVIESETUP_FILTER
g_amPlatform
DWORD g_amPlatform
Definition: dllentry.cpp:29
LPAMOVIESETUP_FILTER
struct _AMOVIESETUP_FILTER LPAMOVIESETUP_FILTER
_AMOVIESETUP_FILTER::lpPin
const AMOVIESETUP_PIN * lpPin
Definition: combase.h:122
ULONG
ULONG(__stdcall *_RegisterTraceGuids)(__in IN WMIDPREQUEST RequestAddress
LPAMOVIESETUP_MEDIATYPE
REGPINTYPES *FAR LPAMOVIESETUP_MEDIATYPE
Definition: combase.h:111
CFactoryTemplate::m_Name
const WCHAR * m_Name
Definition: combase.h:264
GetInterface
STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv)
Definition: combase.cpp:213
LPFNNewCOMObject
CUnknown *(CALLBACK * LPFNNewCOMObject)(__in_opt LPUNKNOWN pUnkOuter, __inout_opt HRESULT *phr)
Definition: combase.h:247
g_osInfo
OSVERSIONINFO g_osInfo
Definition: dllentry.cpp:30
CheckPointer
#define CheckPointer(p, ret)
Definition: wxdebug.h:225
LPFNInitRoutine
void(CALLBACK * LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid)
Definition: combase.h:255
CBaseObject
Definition: combase.h:158
AMOVIESETUP_MEDIATYPE
REGPINTYPES AMOVIESETUP_MEDIATYPE
Definition: combase.h:111