3 * Copyright 2006 Ulrich Czekalla
5 * This file contains the (internal) driver registration functions,
6 * driver enumeration APIs and DirectDraw creation functions.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/debug.h"
36 #include "ddrawex_private.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ddrawex);
40 static HINSTANCE instance;
42 /******************************************************************************
43 * DirectDraw ClassFactory implementation
44 ******************************************************************************/
47 IClassFactory IClassFactory_iface;
49 HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID iid, LPVOID *ppObj);
52 static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
54 return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
57 /*******************************************************************************
58 * IDirectDrawClassFactory::QueryInterface
60 *******************************************************************************/
61 static HRESULT WINAPI IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface, REFIID riid,
64 IClassFactoryImpl *This = impl_from_IClassFactory(iface);
66 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj);
68 if (IsEqualGUID(riid, &IID_IUnknown)
69 || IsEqualGUID(riid, &IID_IClassFactory))
71 IClassFactory_AddRef(iface);
76 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),obj);
80 /*******************************************************************************
81 * IDirectDrawClassFactory::AddRef
83 *******************************************************************************/
84 static ULONG WINAPI IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface)
86 IClassFactoryImpl *This = impl_from_IClassFactory(iface);
87 ULONG ref = InterlockedIncrement(&This->ref);
89 TRACE("(%p)->() incrementing from %d.\n", This, ref - 1);
94 /*******************************************************************************
95 * IDirectDrawClassFactory::Release
97 *******************************************************************************/
98 static ULONG WINAPI IDirectDrawClassFactoryImpl_Release(IClassFactory *iface)
100 IClassFactoryImpl *This = impl_from_IClassFactory(iface);
101 ULONG ref = InterlockedDecrement(&This->ref);
103 TRACE("(%p)->() decrementing from %d.\n", This, ref+1);
106 HeapFree(GetProcessHeap(), 0, This);
112 /*******************************************************************************
113 * IDirectDrawClassFactory::CreateInstance
115 *******************************************************************************/
116 static HRESULT WINAPI IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface,
117 IUnknown *UnkOuter, REFIID riid, void **obj)
119 IClassFactoryImpl *This = impl_from_IClassFactory(iface);
121 TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj);
123 return This->pfnCreateInstance(UnkOuter, riid, obj);
126 /*******************************************************************************
127 * IDirectDrawClassFactory::LockServer
129 *******************************************************************************/
130 static HRESULT WINAPI IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock)
132 IClassFactoryImpl *This = impl_from_IClassFactory(iface);
134 FIXME("(%p)->(%d),stub!\n",This,dolock);
140 /*******************************************************************************
141 * The class factory VTable
142 *******************************************************************************/
143 static const IClassFactoryVtbl IClassFactory_Vtbl =
145 IDirectDrawClassFactoryImpl_QueryInterface,
146 IDirectDrawClassFactoryImpl_AddRef,
147 IDirectDrawClassFactoryImpl_Release,
148 IDirectDrawClassFactoryImpl_CreateInstance,
149 IDirectDrawClassFactoryImpl_LockServer
153 /******************************************************************************
154 * DirectDrawFactory implementation
155 ******************************************************************************/
158 IDirectDrawFactory IDirectDrawFactory_iface;
160 } IDirectDrawFactoryImpl;
162 static inline IDirectDrawFactoryImpl *impl_from_IDirectDrawFactory(IDirectDrawFactory *iface)
164 return CONTAINING_RECORD(iface, IDirectDrawFactoryImpl, IDirectDrawFactory_iface);
167 /*******************************************************************************
168 * IDirectDrawFactory::QueryInterface
170 *******************************************************************************/
171 static HRESULT WINAPI IDirectDrawFactoryImpl_QueryInterface(IDirectDrawFactory *iface, REFIID riid,
174 IDirectDrawFactoryImpl *This = impl_from_IDirectDrawFactory(iface);
176 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj);
178 if (IsEqualGUID(riid, &IID_IUnknown)
179 || IsEqualGUID(riid, &IID_IDirectDrawFactory))
181 IDirectDrawFactory_AddRef(iface);
186 WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),obj);
187 return E_NOINTERFACE;
190 /*******************************************************************************
191 * IDirectDrawFactory::AddRef
193 *******************************************************************************/
194 static ULONG WINAPI IDirectDrawFactoryImpl_AddRef(IDirectDrawFactory *iface)
196 IDirectDrawFactoryImpl *This = impl_from_IDirectDrawFactory(iface);
197 ULONG ref = InterlockedIncrement(&This->ref);
199 TRACE("(%p)->() incrementing from %d.\n", This, ref - 1);
204 /*******************************************************************************
205 * IDirectDrawFactory::Release
207 *******************************************************************************/
208 static ULONG WINAPI IDirectDrawFactoryImpl_Release(IDirectDrawFactory *iface)
210 IDirectDrawFactoryImpl *This = impl_from_IDirectDrawFactory(iface);
211 ULONG ref = InterlockedDecrement(&This->ref);
213 TRACE("(%p)->() decrementing from %d.\n", This, ref+1);
216 HeapFree(GetProcessHeap(), 0, This);
221 /*******************************************************************************
222 * IDirectDrawFactoryImpl_DirectDrawEnumerate
223 *******************************************************************************/
224 static HRESULT WINAPI
225 IDirectDrawFactoryImpl_DirectDrawEnumerate(IDirectDrawFactory* iface,
226 LPDDENUMCALLBACKW lpCallback,
234 /*******************************************************************************
235 * Direct Draw Factory VTable
236 *******************************************************************************/
237 static const IDirectDrawFactoryVtbl IDirectDrawFactory_Vtbl =
239 IDirectDrawFactoryImpl_QueryInterface,
240 IDirectDrawFactoryImpl_AddRef,
241 IDirectDrawFactoryImpl_Release,
242 IDirectDrawFactoryImpl_CreateDirectDraw,
243 IDirectDrawFactoryImpl_DirectDrawEnumerate,
246 /***********************************************************************
247 * CreateDirectDrawFactory
249 ***********************************************************************/
251 CreateDirectDrawFactory(IUnknown* UnkOuter, REFIID iid, void **obj)
254 IDirectDrawFactoryImpl *This = NULL;
256 TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj);
258 if (UnkOuter != NULL)
259 return CLASS_E_NOAGGREGATION;
261 This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawFactoryImpl));
265 ERR("Out of memory when creating DirectDraw\n");
266 return E_OUTOFMEMORY;
269 This->IDirectDrawFactory_iface.lpVtbl = &IDirectDrawFactory_Vtbl;
271 hr = IDirectDrawFactory_QueryInterface(&This->IDirectDrawFactory_iface, iid, obj);
274 HeapFree(GetProcessHeap(), 0, This);
280 /*******************************************************************************
281 * DllCanUnloadNow [DDRAWEX.@] Determines whether the DLL is in use.
283 HRESULT WINAPI DllCanUnloadNow(void)
289 /*******************************************************************************
290 * DllGetClassObject [DDRAWEX.@]
292 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
294 IClassFactoryImpl *factory;
296 TRACE("ddrawex (%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
298 if (!IsEqualGUID( &IID_IClassFactory, riid)
299 && !IsEqualGUID( &IID_IUnknown, riid))
300 return E_NOINTERFACE;
302 if (!IsEqualGUID(&CLSID_DirectDrawFactory, rclsid))
304 FIXME("%s: no class found.\n", debugstr_guid(rclsid));
305 return CLASS_E_CLASSNOTAVAILABLE;
308 factory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*factory));
309 if (factory == NULL) return E_OUTOFMEMORY;
311 factory->IClassFactory_iface.lpVtbl = &IClassFactory_Vtbl;
314 factory->pfnCreateInstance = CreateDirectDrawFactory;
322 /***********************************************************************
325 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD reason, LPVOID lpv)
329 case DLL_PROCESS_ATTACH:
331 DisableThreadLibraryCalls( hInstDLL );
337 /***********************************************************************
338 * DllRegisterServer (DDRAWEX.@)
340 HRESULT WINAPI DllRegisterServer(void)
342 return __wine_register_resources( instance, NULL );
345 /***********************************************************************
346 * DllUnregisterServer (DDRAWEX.@)
348 HRESULT WINAPI DllUnregisterServer(void)
350 return __wine_unregister_resources( instance, NULL );