oledb32: Convert dll registration to the IRegistrar mechanism.
[wine] / dlls / oledb32 / main.c
1 /* OLE DB Initialization
2  *
3  * Copyright 2009 Huw Davies
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19
20 #include <stdarg.h>
21
22 #define COBJMACROS
23 #define NONAMELESSUNION
24 #define NONAMELESSSTRUCT
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "ole2.h"
29 #include "rpcproxy.h"
30
31 #include "initguid.h"
32 #include "msdaguid.h"
33
34 #include "oledb_private.h"
35
36 #include "wine/debug.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(oledb);
39
40 static HINSTANCE instance;
41
42 BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpv)
43 {
44     switch(reason)
45     {
46     case DLL_PROCESS_ATTACH:
47         instance = hinst;
48         DisableThreadLibraryCalls(hinst);
49         break;
50
51     case DLL_PROCESS_DETACH:
52         break;
53     }
54     return TRUE;
55 }
56
57 /******************************************************************************
58  * ClassFactory
59  */
60 typedef struct
61 {
62     const IClassFactoryVtbl *lpVtbl;
63     HRESULT (*create_object)( IUnknown*, LPVOID* );
64 } cf;
65
66 static HRESULT WINAPI CF_QueryInterface(IClassFactory *iface, REFIID riid, void **obj)
67 {
68     cf *This = (cf *)iface;
69
70     TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), obj);
71
72     if( IsEqualCLSID( riid, &IID_IUnknown ) ||
73         IsEqualCLSID( riid, &IID_IClassFactory ) )
74     {
75         IClassFactory_AddRef( iface );
76         *obj = iface;
77         return S_OK;
78     }
79     return E_NOINTERFACE;
80 }
81
82 static ULONG WINAPI CF_AddRef(IClassFactory *iface)
83 {
84     return 2;
85 }
86
87 static ULONG WINAPI CF_Release(IClassFactory *iface)
88 {
89     return 1;
90 }
91
92 static HRESULT WINAPI CF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **obj)
93 {
94     cf *This = (cf *)iface;
95     IUnknown *unk = NULL;
96     HRESULT r;
97
98     TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), obj);
99
100     r = This->create_object( pOuter, (void **) &unk );
101     if (SUCCEEDED(r))
102     {
103         r = IUnknown_QueryInterface( unk, riid, obj );
104         IUnknown_Release( unk );
105     }
106     return r;
107 }
108
109 static HRESULT WINAPI CF_LockServer(IClassFactory *iface, BOOL dolock)
110 {
111     FIXME("(%p, %d): stub\n", iface, dolock);
112     return S_OK;
113 }
114
115 static const IClassFactoryVtbl CF_Vtbl =
116 {
117     CF_QueryInterface,
118     CF_AddRef,
119     CF_Release,
120     CF_CreateInstance,
121     CF_LockServer
122 };
123
124 static cf oledb_convert_cf = { &CF_Vtbl, create_oledb_convert };
125
126 /******************************************************************
127  * DllGetClassObject
128  */
129 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **obj)
130 {
131     TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), obj);
132
133     if ( IsEqualCLSID (rclsid, &CLSID_OLEDB_CONVERSIONLIBRARY) )
134     {
135         *obj = &oledb_convert_cf;
136         return S_OK;
137     }
138
139     return CLASS_E_CLASSNOTAVAILABLE;
140 }
141
142 /******************************************************************
143  *              DllCanUnloadNow
144  */
145 HRESULT WINAPI DllCanUnloadNow(void)
146 {
147     return S_FALSE;
148 }
149
150 /***********************************************************************
151  *              DllRegisterServer
152  */
153 HRESULT WINAPI DllRegisterServer(void)
154 {
155     return __wine_register_resources( instance, NULL );
156 }
157
158 /***********************************************************************
159  *              DllUnregisterServer
160  */
161 HRESULT WINAPI DllUnregisterServer(void)
162 {
163     return __wine_unregister_resources( instance, NULL );
164 }