2 * Copyright 2009 Maarten Lankhorst
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/debug.h"
31 #include "mmdeviceapi.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
37 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
39 TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
43 case DLL_PROCESS_ATTACH:
44 DisableThreadLibraryCalls(hinstDLL);
46 case DLL_PROCESS_DETACH:
54 HRESULT WINAPI DllCanUnloadNow(void)
60 typedef HRESULT (*FnCreateInstance)(REFIID riid, LPVOID *ppobj);
63 const IClassFactoryVtbl *lpVtbl;
65 FnCreateInstance pfnCreateInstance;
69 MMCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj)
71 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
72 TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj);
75 if (IsEqualIID(riid, &IID_IUnknown) ||
76 IsEqualIID(riid, &IID_IClassFactory))
79 IUnknown_AddRef(iface);
86 static ULONG WINAPI MMCF_AddRef(LPCLASSFACTORY iface)
91 static ULONG WINAPI MMCF_Release(LPCLASSFACTORY iface)
93 /* static class, won't be freed */
97 static HRESULT WINAPI MMCF_CreateInstance(
103 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
104 TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), ppobj);
107 return CLASS_E_NOAGGREGATION;
110 WARN("invalid parameter\n");
114 return This->pfnCreateInstance(riid, ppobj);
117 static HRESULT WINAPI MMCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
119 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
120 FIXME("(%p, %d) stub!\n", This, dolock);
124 static const IClassFactoryVtbl MMCF_Vtbl = {
132 static IClassFactoryImpl MMDEVAPI_CF[] = {
133 { &MMCF_Vtbl, &CLSID_MMDeviceEnumerator, (FnCreateInstance)MMDevEnum_Create }
136 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
139 TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
142 WARN("invalid parameter\n");
148 if (!IsEqualIID(riid, &IID_IClassFactory) &&
149 !IsEqualIID(riid, &IID_IUnknown)) {
150 WARN("no interface for %s\n", debugstr_guid(riid));
151 return E_NOINTERFACE;
154 for (i = 0; i < sizeof(MMDEVAPI_CF)/sizeof(MMDEVAPI_CF[0]); ++i)
156 if (IsEqualGUID(rclsid, MMDEVAPI_CF[i].rclsid)) {
157 IUnknown_AddRef((IClassFactory*) &MMDEVAPI_CF[i]);
158 *ppv = &MMDEVAPI_CF[i];
164 WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),
165 debugstr_guid(riid), ppv);
166 return CLASS_E_CLASSNOTAVAILABLE;