ReactOS 0.4.17-dev-243-g1369312
main.c
Go to the documentation of this file.
1/*
2 * Copyright 2010 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
21#define COBJMACROS
22#ifdef __REACTOS__
23#define CONST_VTABLE
24#endif
25
26#include <windef.h>
27#include <winbase.h>
28#include <winreg.h>
29#include <ole2.h>
30#include <shellapi.h>
31#include <activscp.h>
32#include <initguid.h>
33
34#include "wscript.h"
35
36#include <wine/debug.h>
37
38#ifdef _WIN64
39
40#define IActiveScriptParse_Release IActiveScriptParse64_Release
41#define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
42#define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
43
44#else
45
46#define IActiveScriptParse_Release IActiveScriptParse32_Release
47#define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
48#define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
49
50#endif
51
53
54static const WCHAR wscriptW[] = {'W','S','c','r','i','p','t',0};
55static const WCHAR wshW[] = {'W','S','H',0};
57
60
61static HRESULT query_interface(REFIID,void**);
62
63#ifdef __REACTOS__
64#include <commctrl.h>
65
66PCWSTR g_force_engine = NULL;
67
68typedef struct {
69 UINT itemsize, count;
70 void *mem;
71} SIMPLEVECTOR;
72
73static void SVect_Free(SIMPLEVECTOR *pV)
74{
75 if (pV->mem)
76 LocalFree(pV->mem);
77 pV->mem = NULL;
78}
79
80static void* SVect_Add(SIMPLEVECTOR *pV)
81{
82 void *p = NULL;
83 if (pV->mem)
84 {
85 p = LocalReAlloc(pV->mem, pV->itemsize * (pV->count + 1), LMEM_FIXED | LMEM_MOVEABLE);
86 if (p)
87 {
88 pV->mem = p;
89 p = (char*)p + (pV->count * pV->itemsize);
90 pV->count++;
91 }
92 }
93 else
94 {
95 p = pV->mem = LocalAlloc(LMEM_FIXED, pV->itemsize);
96 if (p)
97 {
98 pV->count = 1;
99 }
100 }
101 return p;
102}
103
104#define SVect_Delete(pV, pItem) ( (pV), (pItem) ) /* Should not be required for global items */
105
106static void* SVect_Get(SIMPLEVECTOR *pV, UINT i)
107{
108 return pV->mem && i < pV->count ? (char*)pV->mem + (i * pV->itemsize) : NULL;
109}
110
111typedef struct {
112 BSTR name;
113 IUnknown *punk;
114} GLOBAL_ITEM;
115
116SIMPLEVECTOR g_global_items = { sizeof(GLOBAL_ITEM) };
117
118static void free_globals(void)
119{
120 UINT i;
121 for (i = 0;; ++i)
122 {
123 GLOBAL_ITEM *p = (GLOBAL_ITEM*)SVect_Get(&g_global_items, i);
124 if (!p)
125 break;
126 IUnknown_Release(p->punk);
127 SysFreeString(p->name);
128 }
129 SVect_Free(&g_global_items);
130}
131
132static HRESULT add_globalitem(IActiveScript *script, BSTR name, IUnknown *punk, DWORD siflags)
133{
134 GLOBAL_ITEM *item;
135 HRESULT hr;
136
138 if (!name)
139 return E_OUTOFMEMORY;
140
141 item = SVect_Add(&g_global_items);
142 if (item)
143 {
144 item->name = name;
145 item->punk = punk;
146 hr = IActiveScript_AddNamedItem(script, name, siflags);
147 if (SUCCEEDED(hr))
148 {
149 IUnknown_AddRef(punk);
150 return hr;
151 }
152 SVect_Delete(&g_global_items, item);
153 }
155 return E_OUTOFMEMORY;
156}
157
158static HRESULT add_globalitem_from_clsid(IActiveScript *script, BSTR name, REFCLSID clsid, DWORD siflags)
159{
160 IUnknown *punk;
161 HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&punk);
162 if (SUCCEEDED(hr))
163 {
164 hr = add_globalitem(script, name, punk, siflags);
165 IUnknown_Release(punk);
166 }
167 return hr;
168}
169
170static HRESULT get_globalitem_info(LPCOLESTR Name, DWORD Mask, IUnknown **ppunk, ITypeInfo **ppti, BOOL *pHandled)
171{
173 UINT i;
174 for (i = 0;; ++i)
175 {
176 GLOBAL_ITEM *p = (GLOBAL_ITEM*)SVect_Get(&g_global_items, i);
177 if (!p)
178 break;
179 if (!lstrcmpiW(Name, p->name))
180 {
181 if (ppti)
182 *ppti = NULL;
183 if (Mask & SCRIPTINFO_IUNKNOWN)
184 {
185 *ppunk = p->punk;
186 if (p->punk)
187 {
188 IUnknown_AddRef(p->punk);
189 *pHandled = TRUE;
190 }
191 return S_OK;
192 }
193 break;
194 }
195 }
196 return hr;
197}
198#endif
199
201 REFIID riid, void **ppv)
202{
203 return query_interface(riid, ppv);
204}
205
207{
208 return 2;
209}
210
212{
213 return 1;
214}
215
217{
218 WINE_TRACE("()\n");
219
220 *plcid = GetUserDefaultLCID();
221 return S_OK;
222}
223
225 LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppti)
226{
227 WINE_TRACE("(%s %x %p %p)\n", wine_dbgstr_w(pstrName), dwReturnMask, ppunkItem, ppti);
228
229#ifdef __REACTOS__
230 {
231 BOOL handled = FALSE;
232 HRESULT hr = get_globalitem_info(pstrName, dwReturnMask, ppunkItem, ppti, &handled);
233 if (handled)
234 return hr;
235 }
236#endif
237
238 if(lstrcmpW(pstrName, wshW) && lstrcmpW(pstrName, wscriptW))
239 return E_FAIL;
240
241 if(dwReturnMask & SCRIPTINFO_ITYPEINFO) {
242 ITypeInfo_AddRef(host_ti);
243 *ppti = host_ti;
244 }
245
246 if(dwReturnMask & SCRIPTINFO_IUNKNOWN) {
247 IHost_AddRef(&host_obj);
248 *ppunkItem = (IUnknown*)&host_obj;
249 }
250
251 return S_OK;
252}
253
255 BSTR *pbstrVersion)
256{
257 WINE_FIXME("()\n");
258 return E_NOTIMPL;
259}
260
262 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
263{
264 WINE_FIXME("()\n");
265 return E_NOTIMPL;
266}
267
269 SCRIPTSTATE ssScriptState)
270{
271 WINE_TRACE("(%x)\n", ssScriptState);
272 return S_OK;
273}
274
276 IActiveScriptError *pscripterror)
277{
278 WINE_FIXME("()\n");
279 return E_NOTIMPL;
280}
281
283{
284 WINE_TRACE("()\n");
285 return S_OK;
286}
287
289{
290 WINE_TRACE("()\n");
291 return S_OK;
292}
293
294static IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
306};
307
309
311{
312 return query_interface(riid, ppv);
313}
314
316{
317 return 2;
318}
319
321{
322 return 1;
323}
324
326{
327 TRACE("(%p)\n", phwnd);
328
329 *phwnd = NULL;
330 return S_OK;
331}
332
334{
335 TRACE("(%x)\n", fEnable);
336 return S_OK;
337}
338
339static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
345};
346
348
350{
352 TRACE("(IID_IUnknown %p)\n", ppv);
353 *ppv = &script_site;
354 }else if(IsEqualGUID(riid, &IID_IActiveScriptSite)) {
355 TRACE("(IID_IActiveScriptSite %p)\n", ppv);
356 *ppv = &script_site;
357 }else if(IsEqualGUID(riid, &IID_IActiveScriptSiteWindow)) {
358 TRACE("(IID_IActiveScriptSiteWindow %p)\n", ppv);
360 }else {
361 *ppv = NULL;
362 TRACE("(%s %p)\n", wine_dbgstr_guid(riid), ppv);
363 return E_NOINTERFACE;
364 }
365
366 IUnknown_AddRef((IUnknown*)*ppv);
367 return S_OK;
368}
369
370static BOOL load_typelib(void)
371{
374
375 static const WCHAR wscript_exeW[] = {'w','s','c','r','i','p','t','.','e','x','e',0};
376
377 hres = LoadTypeLib(wscript_exeW, &typelib);
378 if(FAILED(hres))
379 return FALSE;
380
381 hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IHost, &host_ti);
382 if(SUCCEEDED(hres))
383 hres = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IArguments2, &arguments_ti);
384
385 ITypeLib_Release(typelib);
386 return SUCCEEDED(hres);
387}
388
390{
391 WCHAR fileid[64], progid[64];
392 DWORD res;
393 LONG size;
394 HKEY hkey;
396
397 static const WCHAR script_engineW[] =
398 {'\\','S','c','r','i','p','t','E','n','g','i','n','e',0};
399
401 if(res != ERROR_SUCCESS)
402 return FALSE;
403
404 size = ARRAY_SIZE(fileid);
405 res = RegQueryValueW(hkey, NULL, fileid, &size);
406 RegCloseKey(hkey);
407 if(res != ERROR_SUCCESS)
408 return FALSE;
409
410 WINE_TRACE("fileid is %s\n", wine_dbgstr_w(fileid));
411
412 lstrcatW(fileid, script_engineW);
413 res = RegOpenKeyW(HKEY_CLASSES_ROOT, fileid, &hkey);
414 if(res != ERROR_SUCCESS)
415 return FALSE;
416
418 res = RegQueryValueW(hkey, NULL, progid, &size);
419 RegCloseKey(hkey);
420 if(res != ERROR_SUCCESS)
421 return FALSE;
422
423 WINE_TRACE("ProgID is %s\n", wine_dbgstr_w(progid));
424
426 return SUCCEEDED(hres);
427}
428
430 IActiveScriptParse **parser)
431{
433 IUnknown *unk;
435
436 hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
437 &IID_IUnknown, (void**)&unk);
438 if(FAILED(hres))
439 return FALSE;
440
441 hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script);
442 IUnknown_Release(unk);
443 if(FAILED(hres))
444 return FALSE;
445
446 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)parser);
447 if(FAILED(hres)) {
448 IActiveScript_Release(script);
449 return FALSE;
450 }
451
452 *script_ret = script;
453 return TRUE;
454}
455
456static BOOL init_engine(IActiveScript *script, IActiveScriptParse *parser)
457{
459
460 if(!load_typelib())
461 return FALSE;
462
463 hres = IActiveScript_SetScriptSite(script, &script_site);
464 if(FAILED(hres))
465 return FALSE;
466
468 if(FAILED(hres))
469 return FALSE;
470
471 hres = IActiveScript_AddNamedItem(script, wscriptW, SCRIPTITEM_ISVISIBLE);
472 if(FAILED(hres))
473 return FALSE;
474
475 hres = IActiveScript_AddNamedItem(script, wshW, SCRIPTITEM_ISVISIBLE);
476 if(FAILED(hres))
477 return FALSE;
478
479 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_INITIALIZED);
480 return SUCCEEDED(hres);
481}
482
484{
485 const char *file_map;
486 HANDLE file, map;
487 DWORD size, len;
488 BSTR ret;
489
492 return NULL;
493
498 return NULL;
499
500 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
502 if(!file_map)
503 return NULL;
504
505#ifdef __REACTOS__
506 if(size >= 2 && (BYTE)file_map[0] == 0xFF && (BYTE)file_map[1] == 0xFE) // UTF-16LE
507 {
509 if (ret)
510 CopyMemory(ret, file_map + 2, size - 2);
511 UnmapViewOfFile(file_map);
512 return ret;
513 }
514#endif
515
516 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
518 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
519
520 UnmapViewOfFile(file_map);
521 return ret;
522}
523
524static void run_script(const WCHAR *filename, IActiveScript *script, IActiveScriptParse *parser)
525{
526 BSTR text;
528
530 if(!text) {
531 WINE_FIXME("Could not get script text\n");
532 return;
533 }
534
536 SCRIPTTEXT_HOSTMANAGESSOURCE|SCRIPTITEM_ISVISIBLE, NULL, NULL);
538 if(FAILED(hres)) {
539 WINE_FIXME("ParseScriptText failed: %08x\n", hres);
540 return;
541 }
542
543 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
544 if(FAILED(hres))
545 WINE_FIXME("SetScriptState failed: %08x\n", hres);
546}
547
548#ifdef __REACTOS__
549#include <msxml2.h>
550#include <shlwapi.h>
551
552static HRESULT xmldomnode_getattributevalue(IXMLDOMNode *pnode, LPCWSTR name, BSTR *pout)
553{
556 BSTR bsname = SysAllocString(name);
557 *pout = NULL;
558 if (bsname && SUCCEEDED(hr = IXMLDOMNode_get_attributes(pnode, &pmap)))
559 {
560 if (SUCCEEDED(hr = IXMLDOMNamedNodeMap_getNamedItem(pmap, bsname, &pnode)))
561 {
563 if (pnode)
564 {
565 hr = IXMLDOMNode_get_text(pnode, pout);
566 if (SUCCEEDED(hr) && !*pout)
568 IXMLDOMNode_Release(pnode);
569 }
570 }
571 IXMLDOMNamedNodeMap_Release(pmap);
572 }
573 SysFreeString(bsname);
574 return hr;
575}
576
577static HRESULT xmldomelem_getelembytag(IXMLDOMElement *pelem, LPCWSTR name, long index, IXMLDOMNode**ppout)
578{
580 IXMLDOMNodeList *pnl;
581 BSTR bsname = SysAllocString(name);
582 *ppout = NULL;
583 if (bsname && SUCCEEDED(hr = IXMLDOMElement_getElementsByTagName(pelem, bsname, &pnl)))
584 {
585 hr = IXMLDOMNodeList_get_item(pnl, index, ppout);
586 if (SUCCEEDED(hr) && !*ppout)
588 IUnknown_Release(pnl);
589 }
590 SysFreeString(bsname);
591 return hr;
592}
593
594static HRESULT xmldomelem_getelembytagasdomelem(IXMLDOMElement *pelem, LPCWSTR name, long index, IXMLDOMElement**ppout)
595{
596 IXMLDOMNode *pnode;
597 HRESULT hr = xmldomelem_getelembytag(pelem, name, index, &pnode);
598 *ppout = NULL;
599 if (SUCCEEDED(hr))
600 {
601 hr = IUnknown_QueryInterface(pnode, &IID_IXMLDOMElement, (void**)ppout);
602 IUnknown_Release(pnode);
603 }
604 return hr;
605}
606
607static void wsf_addobjectfromnode(IActiveScript *script, IXMLDOMNode *obj)
608{
609 BSTR bsid, bsclsid = NULL;
610 if (SUCCEEDED(xmldomnode_getattributevalue(obj, L"id", &bsid)))
611 {
612 CLSID clsid;
613 HRESULT hr;
614 hr = xmldomnode_getattributevalue(obj, L"clsid", &bsclsid);
615 if (FAILED(hr) || FAILED(CLSIDFromString(bsclsid, &clsid)))
616 {
617 SysFreeString(bsclsid);
618 if (SUCCEEDED(hr = xmldomnode_getattributevalue(obj, L"progid", &bsclsid)))
619 {
620 hr = CLSIDFromProgID(bsclsid, &clsid);
621 SysFreeString(bsclsid);
622 }
623 }
624 if (SUCCEEDED(hr))
625 {
626 hr = add_globalitem_from_clsid(script, bsid, &clsid, SCRIPTITEM_ISVISIBLE);
627 }
628 SysFreeString(bsid);
629 }
630}
631
632static HRESULT run_wsfjob(IXMLDOMElement *jobtag)
633{
634 // FIXME: We are supposed to somehow handle multiple languages in the same IActiveScript.
636 LPCWSTR deflang = L"JScript";
637 IXMLDOMNode *scripttag;
638 HRESULT hr = S_OK;
639 if (SUCCEEDED(xmldomelem_getelembytag(jobtag, L"script", 0, &scripttag)))
640 {
641 CLSID clsid;
642 IActiveScriptParse *parser;
643 BSTR lang, code;
644 if (FAILED(xmldomnode_getattributevalue(scripttag, L"language", &lang)))
645 lang = NULL;
646 hr = CLSIDFromProgID(lang ? lang : deflang, &clsid);
648
649 if (SUCCEEDED(hr))
650 {
651 hr = E_FAIL;
653 {
655 {
656 long index;
657 for (index = 0; index < 0x7fffffff; ++index)
658 {
660 if (SUCCEEDED(xmldomelem_getelembytag(jobtag, L"object", index, &obj)))
661 {
662 wsf_addobjectfromnode(script, obj);
663 IUnknown_Release(obj);
664 }
665 else
666 {
667 break;
668 }
669 }
670
671 if (SUCCEEDED(hr = IXMLDOMNode_get_text(scripttag, &code)))
672 {
674 SCRIPTTEXT_HOSTMANAGESSOURCE|SCRIPTITEM_ISVISIBLE,
675 NULL, NULL);
676 if (SUCCEEDED(hr))
677 {
678 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
679 IActiveScript_Close(script);
680 }
682 }
683 ITypeInfo_Release(host_ti);
684 }
685 IUnknown_Release(parser);
686 IUnknown_Release(script);
687 }
688 }
689 IUnknown_Release(scripttag);
690 }
691 return hr;
692}
693
694/*
695.WSF files can contain a single job, or multiple jobs if contained in a package.
696Jobs are identified by their id and if no id is specified, the first job is used.
697Each job can contain multiple script tags and all scripts are merged into one.
698
699<job><script language="JScript">WScript.Echo("JS");</script></job>
700or
701<package>
702<job><script language="JScript">WScript.Echo("JS");</script></job>
703</package>
704or
705<?xml version="1.0" ?>
706<job>
707<script language="JScript"><![CDATA[function JS(s) {WScript.Echo(s)}]]></script>
708<script language="VBScript">JS "VB2JS"</script>
709</job>
710*/
711static HRESULT run_wsf(LPCWSTR xmlpath)
712{
715 IXMLDOMDocument *pdoc;
716 HRESULT hr = UrlCreateFromPathW(xmlpath, url, &cch, 0), hrCom;
717 if (FAILED(hr))
718 return hr;
719
720 hrCom = CoInitialize(NULL);
721 hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER,
722 &IID_IXMLDOMDocument, (void**)&pdoc);
723 if (SUCCEEDED(hr))
724 {
725 VARIANT_BOOL succ = VARIANT_FALSE;
726 IXMLDOMElement *pdocelm;
727 BSTR bsurl = SysAllocString(url);
728 VARIANT v;
729 V_VT(&v) = VT_BSTR;
730 V_BSTR(&v) = bsurl;
731 if (!bsurl || (hr = IXMLDOMDocument_load(pdoc, v, &succ)) > 0 || (SUCCEEDED(hr) && !succ))
732 {
733 hr = E_FAIL;
734 }
735 if (SUCCEEDED(hr) && SUCCEEDED(hr = IXMLDOMDocument_get_documentElement(pdoc, &pdocelm)))
736 {
737 BSTR tagName = NULL;
738 if (SUCCEEDED(hr = IXMLDOMElement_get_tagName(pdocelm, &tagName)))
739 {
740 if (lstrcmpiW(tagName, L"package") == 0)
741 {
742 // FIXME: Accept job id as a function parameter and find the job here
744 if (SUCCEEDED(hr = xmldomelem_getelembytagasdomelem(pdocelm, L"job", 0, &p)))
745 {
746 IUnknown_Release(pdocelm);
747 pdocelm = p;
748 }
749 }
750 else if (lstrcmpiW(tagName, L"job") != 0)
751 {
752 hr = 0x800400C0ul;
753 }
754 SysFreeString(tagName);
755 }
756 if (SUCCEEDED(hr))
757 {
758 // FIXME: Only support CDATA blocks if the xml tag is present?
759 hr = run_wsfjob(pdocelm);
760 }
761 IUnknown_Release(pdocelm);
762 }
763 VariantClear(&v);
764 IUnknown_Release(pdoc);
765 }
766 free_globals();
767 if (SUCCEEDED(hrCom))
769 return hr;
770}
771#endif
772
773static BOOL set_host_properties(const WCHAR *prop)
774{
775 static const WCHAR nologoW[] = {'n','o','l','o','g','o',0};
776 static const WCHAR iactive[] = {'i',0};
777 static const WCHAR batch[] = {'b',0};
778
779 if(*prop == '/') {
780 ++prop;
781 if(*prop == '/')
782 ++prop;
783 }
784 else
785 ++prop;
786
787 if(wcsicmp(prop, iactive) == 0)
788 wshInteractive = VARIANT_TRUE;
789 else if(wcsicmp(prop, batch) == 0)
790 wshInteractive = VARIANT_FALSE;
791 else if(wcsicmp(prop, nologoW) == 0)
792 WINE_FIXME("ignored %s switch\n", debugstr_w(nologoW));
793#ifdef __REACTOS__
794 else if((prop[0] | 32) == 'e' && prop[1] == ':')
795 g_force_engine = &prop[2];
796#endif
797 else
798 {
799 WINE_FIXME("unsupported switch %s\n", debugstr_w(prop));
800 return FALSE;
801 }
802 return TRUE;
803}
804
805int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow)
806{
807 WCHAR *ext, *filepart, *filename = NULL;
808 IActiveScriptParse *parser;
810 WCHAR **argv;
811 CLSID clsid;
812 int argc, i;
813 DWORD res;
814
815 WINE_TRACE("(%p %p %s %x)\n", hInst, hPrevInst, wine_dbgstr_w(cmdline), cmdshow);
816
818 if(!argv)
819 return 1;
820
821 for(i=1; i<argc; i++) {
822 if(*argv[i] == '/' || *argv[i] == '-') {
824 return 1;
825 }else {
826 filename = argv[i];
827 argums = argv+i+1;
828 numOfArgs = argc-i-1;
829 break;
830 }
831 }
832
833 if(!filename) {
834 WINE_FIXME("No file name specified\n");
835 return 1;
836 }
839 return 1;
840
841 ext = wcsrchr(filepart, '.');
842#ifdef __REACTOS__
843 if (ext && !lstrcmpiW(ext, L".wsf")) {
844 return run_wsf(scriptFullName);
845 }
846
847 if(g_force_engine) {
848 CLSIDFromProgID(g_force_engine, &clsid);
849 }
850 else
851#endif
852 if(!ext || !get_engine_clsid(ext, &clsid)) {
853 WINE_FIXME("Could not find engine for %s\n", wine_dbgstr_w(ext));
854 return 1;
855 }
856
858
859 if(!create_engine(&clsid, &script, &parser)) {
860 WINE_FIXME("Could not create script engine\n");
862 return 1;
863 }
864
867 IActiveScript_Close(script);
868 ITypeInfo_Release(host_ti);
869 }else {
870 WINE_FIXME("Script initialization failed\n");
871 }
872
873 IActiveScript_Release(script);
875
876#ifdef __REACTOS__
877 free_globals();
878#endif
879
881
882 return 0;
883}
@ SCRIPTSTATE_INITIALIZED
Definition: activscp.idl:62
@ SCRIPTSTATE_STARTED
Definition: activscp.idl:58
enum tagSCRIPTSTATE SCRIPTSTATE
int numOfArgs
Definition: arguments.c:35
WCHAR ** argums
Definition: arguments.c:34
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
Definition: main.c:211
ITypeInfo * arguments_ti
Definition: main.c:59
static ULONG WINAPI ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow *iface)
Definition: main.c:320
static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
Definition: main.c:288
static BSTR get_script_str(const WCHAR *filename)
Definition: main.c:483
static HRESULT query_interface(REFIID, void **)
Definition: main.c:349
static const WCHAR wshW[]
Definition: main.c:55
static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
Definition: main.c:268
WCHAR scriptFullName[MAX_PATH]
Definition: main.c:56
static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
Definition: main.c:339
static void run_script(const WCHAR *filename, IActiveScript *script, IActiveScriptParse *parser)
Definition: main.c:524
static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
Definition: main.c:254
static BOOL get_engine_clsid(const WCHAR *ext, CLSID *clsid)
Definition: main.c:389
#define IActiveScriptParse_InitNew
Definition: main.c:47
#define IActiveScriptParse_ParseScriptText
Definition: main.c:48
#define IActiveScriptParse_Release
Definition: main.c:46
static BOOL init_engine(IActiveScript *script, IActiveScriptParse *parser)
Definition: main.c:456
static BOOL load_typelib(void)
Definition: main.c:370
static HRESULT WINAPI ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow *iface, HWND *phwnd)
Definition: main.c:325
static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
Definition: main.c:200
static BOOL create_engine(CLSID *clsid, IActiveScript **script_ret, IActiveScriptParse **parser)
Definition: main.c:429
static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
Definition: main.c:282
static const WCHAR wscriptW[]
Definition: main.c:54
static HRESULT WINAPI ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow *iface, BOOL fEnable)
Definition: main.c:333
static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
Definition: main.c:206
static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
Definition: main.c:261
static HRESULT WINAPI ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow *iface, REFIID riid, void **ppv)
Definition: main.c:310
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow)
Definition: main.c:805
static IActiveScriptSiteWindow script_site_window
Definition: main.c:347
static IActiveScriptSiteVtbl ActiveScriptSiteVtbl
Definition: main.c:294
static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
Definition: main.c:216
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppunkItem, ITypeInfo **ppti)
Definition: main.c:224
static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
Definition: main.c:275
static IActiveScriptSite script_site
Definition: main.c:308
ITypeInfo * host_ti
Definition: main.c:58
static ULONG WINAPI ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow *iface)
Definition: main.c:315
static BOOL set_host_properties(const WCHAR *prop)
Definition: main.c:773
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
Definition: _map.h:48
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
HRESULT WINAPI DECLSPEC_HOTPATCH CLSIDFromProgID(LPCOLESTR progid, CLSID *clsid)
Definition: combase.c:1437
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#define CloseHandle
Definition: compat.h:739
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define wcsrchr
Definition: compat.h:16
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
OLECHAR * BSTR
Definition: compat.h:2293
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_MAP_READ
Definition: compat.h:776
short VARIANT_BOOL
Definition: compat.h:2290
#define MapViewOfFile
Definition: compat.h:745
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_BSTR
Definition: compat.h:2303
#define wcsicmp
Definition: compat.h:15
static const WCHAR *const ext[]
Definition: module.c:53
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
HRESULT WINAPI UrlCreateFromPathW(const WCHAR *path, WCHAR *url, DWORD *url_len, DWORD reserved)
Definition: path.c:4916
LPWSTR WINAPI GetCommandLineW(void)
Definition: process.c:1338
MonoAssembly int argc
Definition: metahost.c:107
const WCHAR * text
Definition: package.c:1794
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI LoadTypeLib(const OLECHAR *szFile, ITypeLib **pptLib)
Definition: typelib.c:458
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
HINSTANCE hInst
Definition: dxdiag.c:13
#define progid(str)
Definition: exdisp.idl:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned int Mask
Definition: fpcontrol.c:82
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
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
HLOCAL NTAPI LocalReAlloc(HLOCAL hMem, SIZE_T dwBytes, UINT uFlags)
Definition: heapmem.c:1625
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
IHost host_obj
Definition: host.c:479
VARIANT_BOOL wshInteractive
Definition: host.c:40
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define LMEM_MOVEABLE
Definition: minwinbase.h:82
#define CopyMemory
Definition: minwinbase.h:29
#define LMEM_FIXED
Definition: minwinbase.h:81
static const WCHAR url[]
Definition: encode.c:1384
HRESULT hres
Definition: protocol.c:465
#define argv
Definition: mplay32.c:18
const CLSID * clsid
Definition: msctf.cpp:50
script
Definition: msipriv.h:383
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
DWORD LCID
Definition: nls.h:13
#define WINE_TRACE
Definition: debug.h:328
#define WINE_FIXME
Definition: debug.h:340
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
LPWSTR *WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int *numargs)
Definition: shell32_main.c:79
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define TRACE(s)
Definition: solgame.cpp:4
TCHAR * cmdline
Definition: stretchblt.cpp:32
Definition: inflate.c:139
Definition: fci.c:127
Definition: mem.c:349
Definition: name.c:39
Definition: import.c:81
Definition: pmap_prot.h:88
#define max(a, b)
Definition: svc.c:63
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
static const WCHAR lang[]
Definition: wbemdisp.c:287
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_NOT_FOUND
Definition: winerror.h:1014
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
unsigned char BYTE
Definition: xxhash.c:193