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:
53 HRESULT WINAPI DllCanUnloadNow(void)
59 typedef HRESULT (*FnCreateInstance)(REFIID riid, LPVOID *ppobj);
62 const IClassFactoryVtbl *lpVtbl;
64 FnCreateInstance pfnCreateInstance;
68 MMCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj)
70 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
71 TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj);
74 if (IsEqualIID(riid, &IID_IUnknown) ||
75 IsEqualIID(riid, &IID_IClassFactory))
78 IUnknown_AddRef(iface);
85 static ULONG WINAPI MMCF_AddRef(LPCLASSFACTORY iface)
90 static ULONG WINAPI MMCF_Release(LPCLASSFACTORY iface)
92 /* static class, won't be freed */
96 static HRESULT WINAPI MMCF_CreateInstance(
102 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
103 TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), ppobj);
106 return CLASS_E_NOAGGREGATION;
109 WARN("invalid parameter\n");
113 return This->pfnCreateInstance(riid, ppobj);
116 static HRESULT WINAPI MMCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
118 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
119 FIXME("(%p, %d) stub!\n", This, dolock);
123 static const IClassFactoryVtbl MMCF_Vtbl = {
131 static IClassFactoryImpl MMDEVAPI_CF[] = {
132 { &MMCF_Vtbl, &CLSID_MMDeviceEnumerator, (FnCreateInstance)MMDevEnum_Create }
135 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
138 TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
141 WARN("invalid parameter\n");
147 if (!IsEqualIID(riid, &IID_IClassFactory) &&
148 !IsEqualIID(riid, &IID_IUnknown)) {
149 WARN("no interface for %s\n", debugstr_guid(riid));
150 return E_NOINTERFACE;
153 for (i = 0; i < sizeof(MMDEVAPI_CF)/sizeof(MMDEVAPI_CF[0]); ++i)
155 if (IsEqualGUID(rclsid, MMDEVAPI_CF[i].rclsid)) {
156 IUnknown_AddRef((IClassFactory*) &MMDEVAPI_CF[i]);
157 *ppv = &MMDEVAPI_CF[i];
163 WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),
164 debugstr_guid(riid), ppv);
165 return CLASS_E_CLASSNOTAVAILABLE;