2 * Copyright 2019 Hans Leidekker for CodeWeavers
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
26 #include "msado15_backcompat.h"
28 #include "wine/debug.h"
29 #include "wine/heap.h"
31 #include "msado15_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(msado15
);
35 static HINSTANCE hinstance
;
37 BOOL WINAPI
DllMain( HINSTANCE dll
, DWORD reason
, LPVOID reserved
)
41 case DLL_PROCESS_ATTACH
:
43 DisableThreadLibraryCalls( dll
);
49 typedef HRESULT (*fnCreateInstance
)( void **obj
);
53 IClassFactory IClassFactory_iface
;
54 fnCreateInstance pfnCreateInstance
;
57 static inline struct msadocf
*impl_from_IClassFactory( IClassFactory
*iface
)
59 return CONTAINING_RECORD( iface
, struct msadocf
, IClassFactory_iface
);
62 static HRESULT WINAPI
msadocf_QueryInterface( IClassFactory
*iface
, REFIID riid
, void **obj
)
64 if (IsEqualGUID( riid
, &IID_IUnknown
) || IsEqualGUID( riid
, &IID_IClassFactory
))
66 IClassFactory_AddRef( iface
);
70 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
74 static ULONG WINAPI
msadocf_AddRef( IClassFactory
*iface
)
79 static ULONG WINAPI
msadocf_Release( IClassFactory
*iface
)
84 static HRESULT WINAPI
msadocf_CreateInstance( IClassFactory
*iface
, LPUNKNOWN outer
, REFIID riid
, void **obj
)
86 struct msadocf
*cf
= impl_from_IClassFactory( iface
);
90 TRACE( "%p, %s, %p\n", outer
, debugstr_guid(riid
), obj
);
94 return CLASS_E_NOAGGREGATION
;
96 hr
= cf
->pfnCreateInstance( (void **)&unknown
);
100 hr
= IUnknown_QueryInterface( unknown
, riid
, obj
);
101 IUnknown_Release( unknown
);
105 static HRESULT WINAPI
msadocf_LockServer( IClassFactory
*iface
, BOOL dolock
)
107 FIXME( "%p, %d\n", iface
, dolock
);
111 static const struct IClassFactoryVtbl msadocf_vtbl
=
113 msadocf_QueryInterface
,
116 msadocf_CreateInstance
,
120 static struct msadocf command_cf
= { { &msadocf_vtbl
}, Command_create
};
121 static struct msadocf connection_cf
= { { &msadocf_vtbl
}, Connection_create
};
122 static struct msadocf recordset_cf
= { { &msadocf_vtbl
}, Recordset_create
};
123 static struct msadocf stream_cf
= { { &msadocf_vtbl
}, Stream_create
};
125 /***********************************************************************
128 HRESULT WINAPI
DllGetClassObject( REFCLSID clsid
, REFIID iid
, void **obj
)
130 IClassFactory
*cf
= NULL
;
132 TRACE( "%s, %s, %p\n", debugstr_guid(clsid
), debugstr_guid(iid
), obj
);
134 if (IsEqualGUID( clsid
, &CLSID_Connection
))
136 cf
= &connection_cf
.IClassFactory_iface
;
138 else if (IsEqualGUID( clsid
, &CLSID_Recordset
))
140 cf
= &recordset_cf
.IClassFactory_iface
;
142 else if (IsEqualGUID( clsid
, &CLSID_Stream
))
144 cf
= &stream_cf
.IClassFactory_iface
;
146 else if (IsEqualGUID( clsid
, &CLSID_Command
))
148 cf
= &command_cf
.IClassFactory_iface
;
150 if (!cf
) return CLASS_E_CLASSNOTAVAILABLE
;
151 return IClassFactory_QueryInterface( cf
, iid
, obj
);
154 /******************************************************************
157 HRESULT WINAPI
DllCanUnloadNow(void)
162 /***********************************************************************
165 HRESULT WINAPI
DllRegisterServer( void )
167 return __wine_register_resources( hinstance
);
170 /***********************************************************************
171 * DllUnregisterServer
173 HRESULT WINAPI
DllUnregisterServer( void )
175 return __wine_unregister_resources( hinstance
);
178 static ITypeLib
*typelib
;
179 static ITypeInfo
*typeinfos
[LAST_tid
];
181 static REFIID tid_ids
[] = {
182 &IID_ADORecordsetConstruction
,
191 static HRESULT
load_typelib(void)
199 hres
= LoadRegTypeLib(&LIBID_ADODB
, 1, 0, LOCALE_SYSTEM_DEFAULT
, &tl
);
201 ERR("LoadRegTypeLib failed: %08x\n", hres
);
205 if(InterlockedCompareExchangePointer((void**)&typelib
, tl
, NULL
))
206 ITypeLib_Release(tl
);
210 HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
)
214 if (FAILED(hres
= load_typelib()))
217 if(!typeinfos
[tid
]) {
220 hres
= ITypeLib_GetTypeInfoOfGuid(typelib
, tid_ids
[tid
], &ti
);
222 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids
[tid
]), hres
);
226 if(InterlockedCompareExchangePointer((void**)(typeinfos
+tid
), ti
, NULL
))
227 ITypeInfo_Release(ti
);
230 *typeinfo
= typeinfos
[tid
];
231 ITypeInfo_AddRef(*typeinfo
);