vbscript: Added CreateObject implementation.
This commit is contained in:
parent
abb2d28721
commit
0d039cc6eb
|
@ -1,5 +1,5 @@
|
||||||
MODULE = vbscript.dll
|
MODULE = vbscript.dll
|
||||||
IMPORTS = oleaut32
|
IMPORTS = oleaut32 ole32
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
compile.c \
|
compile.c \
|
||||||
|
|
|
@ -19,10 +19,118 @@
|
||||||
#include "vbscript.h"
|
#include "vbscript.h"
|
||||||
#include "vbscript_defs.h"
|
#include "vbscript_defs.h"
|
||||||
|
|
||||||
|
#include "mshtmhst.h"
|
||||||
|
#include "objsafe.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
|
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
|
||||||
|
|
||||||
|
#define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
|
||||||
|
|
||||||
|
/* Defined as extern in urlmon.idl, but not exported by uuid.lib */
|
||||||
|
const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
|
||||||
|
{0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
|
||||||
|
|
||||||
|
static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
IInternetHostSecurityManager *secmgr;
|
||||||
|
IServiceProvider *sp;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
if(!ctx->site)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if(ctx->secmgr)
|
||||||
|
return ctx->secmgr;
|
||||||
|
|
||||||
|
hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
|
||||||
|
(void**)&secmgr);
|
||||||
|
IServiceProvider_Release(sp);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return ctx->secmgr = secmgr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
|
||||||
|
{
|
||||||
|
IInternetHostSecurityManager *secmgr = NULL;
|
||||||
|
IObjectWithSite *obj_site;
|
||||||
|
struct CONFIRMSAFETY cs;
|
||||||
|
IClassFactoryEx *cfex;
|
||||||
|
IClassFactory *cf;
|
||||||
|
DWORD policy_size;
|
||||||
|
BYTE *bpolicy;
|
||||||
|
IUnknown *obj;
|
||||||
|
DWORD policy;
|
||||||
|
GUID guid;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
hres = CLSIDFromProgID(progid, &guid);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
TRACE("GUID %s\n", debugstr_guid(&guid));
|
||||||
|
|
||||||
|
if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
|
||||||
|
secmgr = get_sec_mgr(ctx);
|
||||||
|
if(!secmgr)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
policy = 0;
|
||||||
|
hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
|
||||||
|
(BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
|
||||||
|
if(FAILED(hres) || policy != URLPOLICY_ALLOW)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
|
||||||
|
if(SUCCEEDED(hres)) {
|
||||||
|
FIXME("Use IClassFactoryEx\n");
|
||||||
|
IClassFactoryEx_Release(cfex);
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
|
||||||
|
if(FAILED(hres))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if(secmgr) {
|
||||||
|
cs.clsid = guid;
|
||||||
|
cs.pUnk = obj;
|
||||||
|
cs.dwFlags = 0;
|
||||||
|
hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
|
||||||
|
&bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
|
||||||
|
if(SUCCEEDED(hres)) {
|
||||||
|
policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
|
||||||
|
CoTaskMemFree(bpolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
|
||||||
|
IUnknown_Release(obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
|
||||||
|
if(SUCCEEDED(hres)) {
|
||||||
|
FIXME("ObjectWithSite\n");
|
||||||
|
IObjectWithSite_Release(obj_site);
|
||||||
|
IUnknown_Release(obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
FIXME("\n");
|
||||||
|
@ -483,8 +591,30 @@ static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VA
|
||||||
|
|
||||||
static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
IUnknown *obj;
|
||||||
return E_NOTIMPL;
|
HRESULT hres;
|
||||||
|
|
||||||
|
TRACE("(%s)\n", debugstr_variant(arg));
|
||||||
|
|
||||||
|
if(V_VT(arg) != VT_BSTR) {
|
||||||
|
FIXME("non-bstr arg\n");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj = create_object(This->desc->ctx, V_BSTR(arg));
|
||||||
|
if(!obj)
|
||||||
|
return VB_E_CANNOT_CREATE_OBJ;
|
||||||
|
|
||||||
|
if(res) {
|
||||||
|
hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
|
||||||
|
if(FAILED(hres))
|
||||||
|
return hres;
|
||||||
|
|
||||||
|
V_VT(res) = VT_DISPATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown_Release(obj);
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
|
||||||
|
|
|
@ -129,6 +129,8 @@ static void destroy_script(script_ctx_t *ctx)
|
||||||
|
|
||||||
if(ctx->host_global)
|
if(ctx->host_global)
|
||||||
IDispatch_Release(ctx->host_global);
|
IDispatch_Release(ctx->host_global);
|
||||||
|
if(ctx->secmgr)
|
||||||
|
IInternetHostSecurityManager_Release(ctx->secmgr);
|
||||||
if(ctx->site)
|
if(ctx->site)
|
||||||
IActiveScriptSite_Release(ctx->site);
|
IActiveScriptSite_Release(ctx->site);
|
||||||
if(ctx->err_obj)
|
if(ctx->err_obj)
|
||||||
|
@ -516,6 +518,7 @@ static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface)
|
||||||
if(!ctx)
|
if(!ctx)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
ctx->safeopt = This->safeopt;
|
||||||
vbsheap_init(&ctx->heap);
|
vbsheap_init(&ctx->heap);
|
||||||
list_init(&ctx->objects);
|
list_init(&ctx->objects);
|
||||||
list_init(&ctx->code_list);
|
list_init(&ctx->code_list);
|
||||||
|
|
|
@ -143,6 +143,9 @@ struct _script_ctx_t {
|
||||||
IActiveScriptSite *site;
|
IActiveScriptSite *site;
|
||||||
LCID lcid;
|
LCID lcid;
|
||||||
|
|
||||||
|
IInternetHostSecurityManager *secmgr;
|
||||||
|
DWORD safeopt;
|
||||||
|
|
||||||
IDispatch *host_global;
|
IDispatch *host_global;
|
||||||
|
|
||||||
class_desc_t script_desc;
|
class_desc_t script_desc;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "vbscript.h"
|
#include "vbscript.h"
|
||||||
#include "objsafe.h"
|
#include "objsafe.h"
|
||||||
|
#include "mshtmhst.h"
|
||||||
#include "rpcproxy.h"
|
#include "rpcproxy.h"
|
||||||
#include "vbscript_classes.h"
|
#include "vbscript_classes.h"
|
||||||
#include "vbsglobal.h"
|
#include "vbsglobal.h"
|
||||||
|
|
Loading…
Reference in New Issue