1 /* 2 * Copyright 2007 Jacek Caban for CodeWeavers 3 * 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. 8 * 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. 13 * 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 17 */ 18 19 #include <stdarg.h> 20 #include <stdio.h> 21 22 #define COBJMACROS 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "wingdi.h" 27 #include "winuser.h" 28 #include "ole2.h" 29 #include "rpcproxy.h" 30 #include "dimm.h" 31 32 #include "wine/debug.h" 33 34 WINE_DEFAULT_DEBUG_CHANNEL(msimtf); 35 36 extern HRESULT ActiveIMMApp_Constructor(IUnknown *punkOuter, IUnknown **ppOut); 37 38 static HINSTANCE msimtf_instance; 39 40 /****************************************************************** 41 * DllMain (msimtf.@) 42 */ 43 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) 44 { 45 switch(fdwReason) 46 { 47 case DLL_WINE_PREATTACH: 48 return FALSE; /* prefer native version */ 49 case DLL_PROCESS_ATTACH: 50 msimtf_instance = hInstDLL; 51 DisableThreadLibraryCalls(hInstDLL); 52 break; 53 } 54 return TRUE; 55 } 56 57 typedef struct { 58 IClassFactory IClassFactory_iface; 59 60 HRESULT (*cf)(IUnknown*,IUnknown**); 61 } ClassFactory; 62 63 static inline ClassFactory *impl_from_IClassFactory(IClassFactory *iface) 64 { 65 return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface); 66 } 67 68 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, 69 REFIID riid, void **ppv) 70 { 71 *ppv = NULL; 72 73 if(IsEqualGUID(&IID_IUnknown, riid)) { 74 TRACE("(IID_IUnknown %p)\n", ppv); 75 *ppv = iface; 76 }else if(IsEqualGUID(&IID_IClassFactory, riid)) { 77 TRACE("IID_IClassFactory %p)\n", ppv); 78 *ppv = iface; 79 } 80 81 if(*ppv) { 82 IUnknown_AddRef((IUnknown*)*ppv); 83 return S_OK; 84 } 85 86 FIXME("(%s %p)\n", debugstr_guid(riid), ppv); 87 return E_NOINTERFACE; 88 } 89 90 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) 91 { 92 return 2; 93 } 94 95 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) 96 { 97 return 1; 98 } 99 100 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, 101 IUnknown *pOuter, REFIID riid, void **ppv) 102 { 103 ClassFactory *This = impl_from_IClassFactory(iface); 104 HRESULT ret; 105 IUnknown *obj; 106 TRACE("(%p, %p, %s, %p)\n", iface, pOuter, debugstr_guid(riid), ppv); 107 108 ret = This->cf(pOuter, &obj); 109 if (FAILED(ret)) 110 return ret; 111 112 ret = IUnknown_QueryInterface(obj,riid,ppv); 113 IUnknown_Release(obj); 114 return ret; 115 } 116 117 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock) 118 { 119 FIXME("(%d)\n", dolock); 120 return S_OK; 121 } 122 123 static const IClassFactoryVtbl ClassFactoryVtbl = { 124 ClassFactory_QueryInterface, 125 ClassFactory_AddRef, 126 ClassFactory_Release, 127 ClassFactory_CreateInstance, 128 ClassFactory_LockServer 129 }; 130 131 /****************************************************************** 132 * DllGetClassObject (msimtf.@) 133 */ 134 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 135 { 136 if(IsEqualGUID(&CLSID_CActiveIMM, rclsid)) { 137 static ClassFactory cf = { 138 { &ClassFactoryVtbl }, 139 ActiveIMMApp_Constructor, 140 }; 141 142 return IClassFactory_QueryInterface(&cf.IClassFactory_iface, riid, ppv); 143 } 144 145 FIXME("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 146 return CLASS_E_CLASSNOTAVAILABLE; 147 } 148 149 /****************************************************************** 150 * DllCanUnloadNow (msimtf.@) 151 */ 152 HRESULT WINAPI DllCanUnloadNow(void) 153 { 154 return S_FALSE; 155 } 156 157 /*********************************************************************** 158 * DllRegisterServer (msimtf.@) 159 */ 160 HRESULT WINAPI DllRegisterServer(void) 161 { 162 return __wine_register_resources( msimtf_instance ); 163 } 164 165 /*********************************************************************** 166 * DllUnregisterServer (msimtf.@) 167 */ 168 HRESULT WINAPI DllUnregisterServer(void) 169 { 170 return __wine_unregister_resources( msimtf_instance ); 171 } 172