Jacek Caban : vbscript: Added GetObject implementation.
Alexandre Julliard
julliard at winehq.org
Thu Jan 24 12:59:49 CST 2013
Module: wine
Branch: master
Commit: 3a87b4c1c5c642ad3ee7093afafac5f46d294070
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3a87b4c1c5c642ad3ee7093afafac5f46d294070
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jan 24 12:26:54 2013 +0100
vbscript: Added GetObject implementation.
---
dlls/vbscript/global.c | 97 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 79 insertions(+), 18 deletions(-)
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 6886ff7..39b75ab 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -30,6 +30,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
#define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
+#define VB_E_MK_PARSE_ERROR 0x800a01b0
/* Defined as extern in urlmon.idl, but not exported by uuid.lib */
const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
@@ -216,10 +217,29 @@ static HRESULT to_string(VARIANT *v, BSTR *ret)
return S_OK;
}
+static HRESULT set_object_site(script_ctx_t *ctx, IUnknown *obj)
+{
+ IObjectWithSite *obj_site;
+ IUnknown *ax_site;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
+ if(FAILED(hres))
+ return S_OK;
+
+ ax_site = create_ax_site(ctx);
+ if(ax_site)
+ hres = IObjectWithSite_SetSite(obj_site, ax_site);
+ else
+ hres = E_OUTOFMEMORY;
+ IUnknown_Release(ax_site);
+ IObjectWithSite_Release(obj_site);
+ return hres;
+}
+
static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
{
IInternetHostSecurityManager *secmgr = NULL;
- IObjectWithSite *obj_site;
struct CONFIRMSAFETY cs;
IClassFactoryEx *cfex;
IClassFactory *cf;
@@ -279,20 +299,10 @@ static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
}
}
- hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
- if(SUCCEEDED(hres)) {
- IUnknown *ax_site;
-
- ax_site = create_ax_site(ctx);
- if(ax_site) {
- hres = IObjectWithSite_SetSite(obj_site, ax_site);
- IUnknown_Release(ax_site);
- }
- IObjectWithSite_Release(obj_site);
- if(!ax_site || FAILED(hres)) {
- IUnknown_Release(obj);
- return NULL;
- }
+ hres = set_object_site(ctx, obj);
+ if(FAILED(hres)) {
+ IUnknown_Release(obj);
+ return NULL;
}
return obj;
@@ -1275,10 +1285,61 @@ static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_c
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 *args, unsigned args_cnt, VARIANT *res)
{
- FIXME("\n");
- return E_NOTIMPL;
+ IBindCtx *bind_ctx;
+ IUnknown *obj_unk;
+ IDispatch *disp;
+ ULONG eaten = 0;
+ IMoniker *mon;
+ HRESULT hres;
+
+ TRACE("%s %s\n", args_cnt ? debugstr_variant(args) : "", args_cnt > 1 ? debugstr_variant(args+1) : "");
+
+ if(args_cnt != 1 || V_VT(args) != VT_BSTR) {
+ FIXME("unsupported args\n");
+ return E_NOTIMPL;
+ }
+
+ if(This->desc->ctx->safeopt & (INTERFACE_USES_SECURITY_MANAGER|INTERFACESAFE_FOR_UNTRUSTED_DATA)) {
+ WARN("blocked in current safety mode\n");
+ return VB_E_CANNOT_CREATE_OBJ;
+ }
+
+ hres = CreateBindCtx(0, &bind_ctx);
+ if(FAILED(hres))
+ return hres;
+
+ hres = MkParseDisplayName(bind_ctx, V_BSTR(args), &eaten, &mon);
+ if(SUCCEEDED(hres)) {
+ hres = IMoniker_BindToObject(mon, bind_ctx, NULL, &IID_IUnknown, (void**)&obj_unk);
+ IMoniker_Release(mon);
+ }else {
+ hres = MK_E_SYNTAX;
+ }
+ IBindCtx_Release(bind_ctx);
+ if(FAILED(hres))
+ return hres;
+
+ hres = set_object_site(This->desc->ctx, obj_unk);
+ if(FAILED(hres)) {
+ IUnknown_Release(obj_unk);
+ return hres;
+ }
+
+ hres = IUnknown_QueryInterface(obj_unk, &IID_IDispatch, (void**)&disp);
+ if(SUCCEEDED(hres)) {
+ if(res) {
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = disp;
+ }else {
+ IDispatch_Release(disp);
+ }
+ }else {
+ FIXME("object does not support IDispatch\n");
+ }
+
+ return hres;
}
static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
More information about the wine-cvs
mailing list