3 * Copyright 2006 Ulrich Czekalla
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/debug.h"
33 #include "ddrawex_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(ddrawex
);
37 static HINSTANCE instance
;
39 struct ddrawex_class_factory
41 IClassFactory IClassFactory_iface
;
43 HRESULT (*pfnCreateInstance
)(IUnknown
*outer
, REFIID iid
, void **out
);
46 static inline struct ddrawex_class_factory
*impl_from_IClassFactory(IClassFactory
*iface
)
48 return CONTAINING_RECORD(iface
, struct ddrawex_class_factory
, IClassFactory_iface
);
51 static HRESULT WINAPI
ddrawex_class_factory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **out
)
53 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
55 if (IsEqualGUID(riid
, &IID_IClassFactory
)
56 || IsEqualGUID(riid
, &IID_IUnknown
))
58 IClassFactory_AddRef(iface
);
63 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
69 static ULONG WINAPI
ddrawex_class_factory_AddRef(IClassFactory
*iface
)
71 struct ddrawex_class_factory
*factory
= impl_from_IClassFactory(iface
);
72 ULONG refcount
= InterlockedIncrement(&factory
->ref
);
74 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
79 static ULONG WINAPI
ddrawex_class_factory_Release(IClassFactory
*iface
)
81 struct ddrawex_class_factory
*factory
= impl_from_IClassFactory(iface
);
82 ULONG refcount
= InterlockedDecrement(&factory
->ref
);
84 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
87 HeapFree(GetProcessHeap(), 0, factory
);
92 static HRESULT WINAPI
ddrawex_class_factory_CreateInstance(IClassFactory
*iface
,
93 IUnknown
*outer_unknown
, REFIID riid
, void **out
)
95 struct ddrawex_class_factory
*factory
= impl_from_IClassFactory(iface
);
97 TRACE("iface %p, outer_unknown %p, riid %s, out %p.\n",
98 iface
, outer_unknown
, debugstr_guid(riid
), out
);
100 return factory
->pfnCreateInstance(outer_unknown
, riid
, out
);
103 static HRESULT WINAPI
ddrawex_class_factory_LockServer(IClassFactory
*iface
, BOOL dolock
)
105 FIXME("iface %p, dolock %#x stub!\n", iface
, dolock
);
110 static const IClassFactoryVtbl ddrawex_class_factory_vtbl
=
112 ddrawex_class_factory_QueryInterface
,
113 ddrawex_class_factory_AddRef
,
114 ddrawex_class_factory_Release
,
115 ddrawex_class_factory_CreateInstance
,
116 ddrawex_class_factory_LockServer
,
119 struct ddrawex_factory
121 IDirectDrawFactory IDirectDrawFactory_iface
;
125 static inline struct ddrawex_factory
*impl_from_IDirectDrawFactory(IDirectDrawFactory
*iface
)
127 return CONTAINING_RECORD(iface
, struct ddrawex_factory
, IDirectDrawFactory_iface
);
130 static HRESULT WINAPI
ddrawex_factory_QueryInterface(IDirectDrawFactory
*iface
, REFIID riid
, void **out
)
132 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
134 if (IsEqualGUID(riid
, &IID_IDirectDrawFactory
)
135 || IsEqualGUID(riid
, &IID_IUnknown
))
137 IDirectDrawFactory_AddRef(iface
);
142 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
145 return E_NOINTERFACE
;
148 static ULONG WINAPI
ddrawex_factory_AddRef(IDirectDrawFactory
*iface
)
150 struct ddrawex_factory
*factory
= impl_from_IDirectDrawFactory(iface
);
151 ULONG refcount
= InterlockedIncrement(&factory
->ref
);
153 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
158 static ULONG WINAPI
ddrawex_factory_Release(IDirectDrawFactory
*iface
)
160 struct ddrawex_factory
*factory
= impl_from_IDirectDrawFactory(iface
);
161 ULONG refcount
= InterlockedDecrement(&factory
->ref
);
163 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
166 HeapFree(GetProcessHeap(), 0, factory
);
171 static HRESULT WINAPI
ddrawex_factory_DirectDrawEnumerate(IDirectDrawFactory
*iface
,
172 LPDDENUMCALLBACKW cb
, void *ctx
)
174 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
179 static const IDirectDrawFactoryVtbl ddrawex_factory_vtbl
=
181 ddrawex_factory_QueryInterface
,
182 ddrawex_factory_AddRef
,
183 ddrawex_factory_Release
,
184 ddrawex_factory_CreateDirectDraw
,
185 ddrawex_factory_DirectDrawEnumerate
,
188 static HRESULT
ddrawex_factory_create(IUnknown
*outer_unknown
, REFIID riid
, void **out
)
190 struct ddrawex_factory
*factory
;
193 TRACE("outer_unknown %p, riid %s, out %p.\n", outer_unknown
, debugstr_guid(riid
), out
);
196 return CLASS_E_NOAGGREGATION
;
198 if (!(factory
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*factory
))))
199 return E_OUTOFMEMORY
;
201 factory
->IDirectDrawFactory_iface
.lpVtbl
= &ddrawex_factory_vtbl
;
203 if (FAILED(hr
= ddrawex_factory_QueryInterface(&factory
->IDirectDrawFactory_iface
, riid
, out
)))
204 HeapFree(GetProcessHeap(), 0, factory
);
209 /*******************************************************************************
210 * DllCanUnloadNow [DDRAWEX.@] Determines whether the DLL is in use.
212 HRESULT WINAPI
DllCanUnloadNow(void)
218 /*******************************************************************************
219 * DllGetClassObject [DDRAWEX.@]
221 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **out
)
223 struct ddrawex_class_factory
*factory
;
225 TRACE("rclsid %s, riid %s, out %p.\n", debugstr_guid(rclsid
), debugstr_guid(riid
), out
);
227 if (!IsEqualGUID( &IID_IClassFactory
, riid
)
228 && !IsEqualGUID( &IID_IUnknown
, riid
))
229 return E_NOINTERFACE
;
231 if (!IsEqualGUID(&CLSID_DirectDrawFactory
, rclsid
))
233 FIXME("%s: no class found.\n", debugstr_guid(rclsid
));
234 return CLASS_E_CLASSNOTAVAILABLE
;
237 factory
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*factory
));
238 if (factory
== NULL
) return E_OUTOFMEMORY
;
240 factory
->IClassFactory_iface
.lpVtbl
= &ddrawex_class_factory_vtbl
;
243 factory
->pfnCreateInstance
= ddrawex_factory_create
;
251 /***********************************************************************
254 BOOL WINAPI
DllMain(HINSTANCE inst
, DWORD reason
, void *reserved
)
258 case DLL_PROCESS_ATTACH
:
260 DisableThreadLibraryCalls( inst
);
266 /***********************************************************************
267 * DllRegisterServer (DDRAWEX.@)
269 HRESULT WINAPI
DllRegisterServer(void)
271 return __wine_register_resources( instance
);
274 /***********************************************************************
275 * DllUnregisterServer (DDRAWEX.@)
277 HRESULT WINAPI
DllUnregisterServer(void)
279 return __wine_unregister_resources( instance
);