1 /* 2 * OLE32 proxy/stub handler 3 * 4 * Copyright 2002 Marcus Meissner 5 * Copyright 2001 Ove Kåven, TransGaming Technologies 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 20 */ 21 22 #include <stdlib.h> 23 #include <stdarg.h> 24 #include <stdio.h> 25 #include <string.h> 26 27 #define COBJMACROS 28 29 #include "windef.h" 30 #include "winbase.h" 31 #include "winuser.h" 32 #include "objbase.h" 33 #include "ole2.h" 34 #include "rpc.h" 35 36 #include "compobj_private.h" 37 #include "moniker.h" 38 #include "comcat.h" 39 40 #include "wine/debug.h" 41 42 WINE_DEFAULT_DEBUG_CHANNEL(ole); 43 44 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 45 { 46 TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 47 48 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) 49 { 50 *ppv = iface; 51 return S_OK; 52 } 53 54 *ppv = NULL; 55 return E_NOINTERFACE; 56 } 57 58 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) 59 { 60 return 2; 61 } 62 63 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) 64 { 65 return 1; 66 } 67 68 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) 69 { 70 TRACE("(%x)\n", fLock); 71 return S_OK; 72 } 73 74 static const IClassFactoryVtbl FileMonikerCFVtbl = 75 { 76 ClassFactory_QueryInterface, 77 ClassFactory_AddRef, 78 ClassFactory_Release, 79 FileMoniker_CreateInstance, 80 ClassFactory_LockServer 81 }; 82 83 static IClassFactory FileMonikerCF = { &FileMonikerCFVtbl }; 84 85 static const IClassFactoryVtbl ItemMonikerCFVtbl = 86 { 87 ClassFactory_QueryInterface, 88 ClassFactory_AddRef, 89 ClassFactory_Release, 90 ItemMoniker_CreateInstance, 91 ClassFactory_LockServer 92 }; 93 94 static IClassFactory ItemMonikerCF = { &ItemMonikerCFVtbl }; 95 96 static const IClassFactoryVtbl AntiMonikerCFVtbl = 97 { 98 ClassFactory_QueryInterface, 99 ClassFactory_AddRef, 100 ClassFactory_Release, 101 AntiMoniker_CreateInstance, 102 ClassFactory_LockServer 103 }; 104 105 static IClassFactory AntiMonikerCF = { &AntiMonikerCFVtbl }; 106 107 static const IClassFactoryVtbl CompositeMonikerCFVtbl = 108 { 109 ClassFactory_QueryInterface, 110 ClassFactory_AddRef, 111 ClassFactory_Release, 112 CompositeMoniker_CreateInstance, 113 ClassFactory_LockServer 114 }; 115 116 static IClassFactory CompositeMonikerCF = { &CompositeMonikerCFVtbl }; 117 118 static const IClassFactoryVtbl ClassMonikerCFVtbl = 119 { 120 ClassFactory_QueryInterface, 121 ClassFactory_AddRef, 122 ClassFactory_Release, 123 ClassMoniker_CreateInstance, 124 ClassFactory_LockServer 125 }; 126 127 static IClassFactory ClassMonikerCF = { &ClassMonikerCFVtbl }; 128 129 static const IClassFactoryVtbl PointerMonikerCFVtbl = 130 { 131 ClassFactory_QueryInterface, 132 ClassFactory_AddRef, 133 ClassFactory_Release, 134 PointerMoniker_CreateInstance, 135 ClassFactory_LockServer 136 }; 137 138 static IClassFactory PointerMonikerCF = { &PointerMonikerCFVtbl }; 139 140 static const IClassFactoryVtbl ComCatCFVtbl = 141 { 142 ClassFactory_QueryInterface, 143 ClassFactory_AddRef, 144 ClassFactory_Release, 145 ComCat_CreateInstance, 146 ClassFactory_LockServer 147 }; 148 149 static IClassFactory ComCatCF = { &ComCatCFVtbl }; 150 151 static const IClassFactoryVtbl GlobalOptionsCFVtbl = 152 { 153 ClassFactory_QueryInterface, 154 ClassFactory_AddRef, 155 ClassFactory_Release, 156 GlobalOptions_CreateInstance, 157 ClassFactory_LockServer 158 }; 159 160 IClassFactory GlobalOptionsCF = { &GlobalOptionsCFVtbl }; 161 162 /*********************************************************************** 163 * DllGetClassObject [OLE32.@] 164 */ 165 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) 166 { 167 HRESULT hr; 168 169 *ppv = NULL; 170 if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&( 171 IsEqualIID(iid,&IID_IClassFactory) || 172 IsEqualIID(iid,&IID_IUnknown) 173 ) 174 ) 175 return MARSHAL_GetStandardMarshalCF(ppv); 176 if (IsEqualIID(rclsid,&CLSID_StdGlobalInterfaceTable) && (IsEqualIID(iid,&IID_IClassFactory) || IsEqualIID(iid,&IID_IUnknown))) 177 return StdGlobalInterfaceTable_GetFactory(ppv); 178 if (IsEqualCLSID(rclsid, &CLSID_FileMoniker)) 179 return IClassFactory_QueryInterface(&FileMonikerCF, iid, ppv); 180 if (IsEqualCLSID(rclsid, &CLSID_ItemMoniker)) 181 return IClassFactory_QueryInterface(&ItemMonikerCF, iid, ppv); 182 if (IsEqualCLSID(rclsid, &CLSID_AntiMoniker)) 183 return IClassFactory_QueryInterface(&AntiMonikerCF, iid, ppv); 184 if (IsEqualCLSID(rclsid, &CLSID_CompositeMoniker)) 185 return IClassFactory_QueryInterface(&CompositeMonikerCF, iid, ppv); 186 if (IsEqualCLSID(rclsid, &CLSID_ClassMoniker)) 187 return IClassFactory_QueryInterface(&ClassMonikerCF, iid, ppv); 188 if (IsEqualCLSID(rclsid, &CLSID_PointerMoniker)) 189 return IClassFactory_QueryInterface(&PointerMonikerCF, iid, ppv); 190 if (IsEqualGUID(rclsid, &CLSID_StdComponentCategoriesMgr)) 191 return IClassFactory_QueryInterface(&ComCatCF, iid, ppv); 192 193 hr = OLE32_DllGetClassObject(rclsid, iid, ppv); 194 if (SUCCEEDED(hr)) 195 return hr; 196 197 return Handler_DllGetClassObject(rclsid, iid, ppv); 198 } 199