ReactOS 0.4.17-dev-966-gf06eace
scrrun.c
Go to the documentation of this file.
1/*
2 * Copyright 2011 Hans Leidekker 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#define COBJMACROS
19
20#include <stdarg.h>
21
22#include "windef.h"
23#include "winbase.h"
24#include "ole2.h"
25#include "olectl.h"
26#include "rpcproxy.h"
27
28#include <initguid.h>
29#include "scrrun.h"
30#include "scrrun_private.h"
31
32#include "wine/debug.h"
33
35
37{
39}
40
41typedef HRESULT (*fnCreateInstance)(LPVOID *ppObj);
42
44{
45 *ppv = NULL;
46
48 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
49 *ppv = iface;
51 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
52 *ppv = iface;
53 }
54
55 if(*ppv) {
56 IUnknown_AddRef((IUnknown*)*ppv);
57 return S_OK;
58 }
59
60 WARN("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
61 return E_NOINTERFACE;
62}
63
65{
66 TRACE("(%p)\n", iface);
67 return 2;
68}
69
71{
72 TRACE("(%p)\n", iface);
73 return 1;
74}
75
77{
78 TRACE("(%p)->(%x)\n", iface, fLock);
79 return S_OK;
80}
81
82static const struct IClassFactoryVtbl scrruncf_vtbl =
83{
89};
90
91static const struct IClassFactoryVtbl dictcf_vtbl =
92{
98};
99
102
105
106static REFIID tid_ids[] = {
107 &IID_NULL,
108 &IID_IDictionary,
109 &IID_IDrive,
110 &IID_IDriveCollection,
111 &IID_IFile,
112 &IID_IFileCollection,
113 &IID_IFileSystem3,
114 &IID_IFolder,
115 &IID_IFolderCollection,
116 &IID_ITextStream
117};
118
120{
122 ITypeLib *tl;
123
124 if(typelib)
125 return S_OK;
126
127 hres = LoadRegTypeLib(&LIBID_Scripting, 1, 0, LOCALE_SYSTEM_DEFAULT, &tl);
128 if(FAILED(hres)) {
129 ERR("LoadRegTypeLib failed: %#lx.\n", hres);
130 return hres;
131 }
132
134 ITypeLib_Release(tl);
135 return hres;
136}
137
139{
141
142 if(FAILED(hres = load_typelib()))
143 return hres;
144
145 return ITypeLib_GetTypeInfoOfGuid(typelib, guid, tinfo);
146}
147
149{
151
152 if (FAILED(hres = load_typelib()))
153 return hres;
154
155 if(!typeinfos[tid]) {
156 ITypeInfo *ti;
157
158 hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &ti);
159 if(FAILED(hres)) {
160 ERR("GetTypeInfoOfGuid(%s) failed: %#lx.\n", debugstr_guid(tid_ids[tid]), hres);
161 return hres;
162 }
163
165 ITypeInfo_Release(ti);
166 }
167
169 ITypeInfo_AddRef(typeinfos[tid]);
170 return S_OK;
171}
172
173static void release_typelib(void)
174{
175 unsigned i;
176
177 if(!typelib)
178 return;
179
180 for (i = 0; i < ARRAY_SIZE(typeinfos); i++)
181 if(typeinfos[i])
182 ITypeInfo_Release(typeinfos[i]);
183
184 ITypeLib_Release(typelib);
185}
186
188{
190
191 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
192
194 *obj = iface;
195 IProvideClassInfo_AddRef(iface);
196 return S_OK;
197 }
198 else
199 return IUnknown_QueryInterface(This->outer, riid, obj);
200}
201
203{
205 return IUnknown_AddRef(This->outer);
206}
207
209{
211 return IUnknown_Release(This->outer);
212}
213
215{
217
218 TRACE("(%p)->(%p)\n", This, ti);
219
220 return get_typeinfo_of_guid(This->guid, ti);
221}
222
223static const IProvideClassInfoVtbl provideclassinfovtbl = {
228};
229
231{
232 classinfo->IProvideClassInfo_iface.lpVtbl = &provideclassinfovtbl;
233 classinfo->outer = outer;
234 classinfo->guid = guid;
235}
236
238{
239 TRACE("%p, %lu, %p\n", hinst, reason, reserved);
240
241 switch (reason)
242 {
245 break;
247 if (reserved) break;
249 break;
250 }
251 return TRUE;
252}
253
254/***********************************************************************
255 * DllGetClassObject (scrrun.@)
256 */
257
259{
260 if(IsEqualGUID(&CLSID_FileSystemObject, rclsid)) {
261 TRACE("(CLSID_FileSystemObject %s %p)\n", debugstr_guid(riid), ppv);
262 return IClassFactory_QueryInterface(&FileSystemFactory, riid, ppv);
263 }
264 else if(IsEqualGUID(&CLSID_Dictionary, rclsid)) {
265 TRACE("(CLSID_Dictionary %s %p)\n", debugstr_guid(riid), ppv);
266 return IClassFactory_QueryInterface(&DictionaryFactory, riid, ppv);
267 }
268
269 FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
271}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1971
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
GUID guid
Definition: version.c:147
HRESULT WINAPI LoadRegTypeLib(REFGUID rguid, WORD wVerMajor, WORD wVerMinor, LCID lcid, ITypeLib **ppTLib)
Definition: typelib.c:507
HRESULT WINAPI Dictionary_CreateInstance(IClassFactory *factory, IUnknown *outer, REFIID riid, void **ret)
Definition: dictionary.c:972
HRESULT WINAPI FileSystem_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
Definition: filesystem.c:4177
r reserved
Definition: btrfs.c:3006
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
tid_t
Definition: ieframe.h:311
@ LAST_tid
Definition: ieframe.h:317
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
static TfClientId tid
#define InterlockedCompareExchangePointer
Definition: interlocked.h:144
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static HINSTANCE hinst
Definition: edit.c:551
HRESULT hres
Definition: protocol.c:432
static IUnknown * outer
Definition: compobj.c:82
#define LOCALE_SYSTEM_DEFAULT
const GUID IID_IProvideClassInfo
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
#define REFCLSID
Definition: guiddef.h:117
static const struct IClassFactoryVtbl dictcf_vtbl
Definition: scrrun.c:91
HRESULT(* fnCreateInstance)(LPVOID *ppObj)
Definition: scrrun.c:41
void init_classinfo(const GUID *guid, IUnknown *outer, struct provideclassinfo *classinfo)
Definition: scrrun.c:230
static HRESULT WINAPI scrruncf_LockServer(IClassFactory *iface, BOOL fLock)
Definition: scrrun.c:76
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
Definition: scrrun.c:237
static ITypeLib * typelib
Definition: scrrun.c:103
HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
Definition: scrrun.c:148
static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppv)
Definition: scrrun.c:43
static ULONG WINAPI provideclassinfo_Release(IProvideClassInfo *iface)
Definition: scrrun.c:208
static HRESULT WINAPI provideclassinfo_QueryInterface(IProvideClassInfo *iface, REFIID riid, void **obj)
Definition: scrrun.c:187
static ULONG WINAPI provideclassinfo_AddRef(IProvideClassInfo *iface)
Definition: scrrun.c:202
static const struct IClassFactoryVtbl scrruncf_vtbl
Definition: scrrun.c:82
static HRESULT get_typeinfo_of_guid(const GUID *guid, ITypeInfo **tinfo)
Definition: scrrun.c:138
static IClassFactory FileSystemFactory
Definition: scrrun.c:100
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: scrrun.c:258
static struct provideclassinfo * impl_from_IProvideClassInfo(IProvideClassInfo *iface)
Definition: scrrun.c:36
static HRESULT load_typelib(void)
Definition: scrrun.c:119
static ULONG WINAPI scrruncf_AddRef(IClassFactory *iface)
Definition: scrrun.c:64
static const IProvideClassInfoVtbl provideclassinfovtbl
Definition: scrrun.c:223
static REFIID tid_ids[]
Definition: scrrun.c:106
static HRESULT WINAPI provideclassinfo_GetClassInfo(IProvideClassInfo *iface, ITypeInfo **ti)
Definition: scrrun.c:214
static IClassFactory DictionaryFactory
Definition: scrrun.c:101
static void release_typelib(void)
Definition: scrrun.c:173
static ULONG WINAPI scrruncf_Release(IClassFactory *iface)
Definition: scrrun.c:70
static ITypeInfo * typeinfos[LAST_tid]
Definition: scrrun.c:104
#define TRACE(s)
Definition: solgame.cpp:4
IProvideClassInfo IProvideClassInfo_iface
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772