Jacek Caban : vbscript: Added MsgBox implementation.

Alexandre Julliard julliard at winehq.org
Wed Sep 26 14:06:51 CDT 2012


Module: wine
Branch: master
Commit: 39da3b2ad765012092df376e4ec821d0e750d882
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=39da3b2ad765012092df376e4ec821d0e750d882

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 26 14:36:45 2012 +0200

vbscript: Added MsgBox implementation.

---

 dlls/vbscript/Makefile.in |    2 +-
 dlls/vbscript/global.c    |   76 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/dlls/vbscript/Makefile.in b/dlls/vbscript/Makefile.in
index e4765a0..6f91958 100644
--- a/dlls/vbscript/Makefile.in
+++ b/dlls/vbscript/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = vbscript.dll
-IMPORTS   = oleaut32 ole32
+IMPORTS   = oleaut32 ole32 user32
 
 C_SRCS = \
 	compile.c \
diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c
index 6e62a34..ae5db24 100644
--- a/dlls/vbscript/global.c
+++ b/dlls/vbscript/global.c
@@ -35,6 +35,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
 
+static const WCHAR emptyW[] = {0};
+static const WCHAR vbscriptW[] = {'V','B','S','c','r','i','p','t',0};
+
 static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
 {
     IInternetHostSecurityManager *secmgr;
@@ -272,6 +275,60 @@ static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
     return obj;
 }
 
+static HRESULT show_msgbox(script_ctx_t *ctx, BSTR prompt, VARIANT *res)
+{
+    SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_ALLOW;
+    IActiveScriptSiteUIControl *ui_control;
+    IActiveScriptSiteWindow *acts_window;
+    const WCHAR *title;
+    HWND hwnd = NULL;
+    int ret;
+    HRESULT hres;
+
+    hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteUIControl, (void**)&ui_control);
+    if(SUCCEEDED(hres)) {
+        hres = IActiveScriptSiteUIControl_GetUIBehavior(ui_control, SCRIPTUICITEM_MSGBOX, &uic_handling);
+        IActiveScriptSiteUIControl_Release(ui_control);
+        if(FAILED(hres))
+            uic_handling = SCRIPTUICHANDLING_ALLOW;
+    }
+
+    switch(uic_handling) {
+    case SCRIPTUICHANDLING_ALLOW:
+        break;
+    case SCRIPTUICHANDLING_NOUIDEFAULT:
+        return return_short(res, 0);
+    default:
+        FIXME("blocked\n");
+        return E_FAIL;
+    }
+
+    title = (ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) ? vbscriptW : emptyW;
+
+    hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteWindow, (void**)&acts_window);
+    if(FAILED(hres)) {
+        FIXME("No IActiveScriptSiteWindow\n");
+        return hres;
+    }
+
+    hres = IActiveScriptSiteWindow_GetWindow(acts_window, &hwnd);
+    if(SUCCEEDED(hres)) {
+        hres = IActiveScriptSiteWindow_EnableModeless(acts_window, FALSE);
+        if(SUCCEEDED(hres)) {
+            ret = MessageBoxW(hwnd, prompt, title, MB_OK);
+            hres = IActiveScriptSiteWindow_EnableModeless(acts_window, TRUE);
+        }
+    }
+
+    IActiveScriptSiteWindow_Release(acts_window);
+    if(FAILED(hres)) {
+        FIXME("failed: %08x\n", hres);
+        return hres;
+    }
+
+    return return_short(res, ret);
+}
+
 static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
 {
     FIXME("\n");
@@ -986,8 +1043,23 @@ static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt,
 
 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    BSTR prompt;
+    HRESULT hres;
+
+    TRACE("\n");
+
+    if(args_cnt != 1) {
+        FIXME("unsupported arg_cnt %d\n", args_cnt);
+        return E_NOTIMPL;
+    }
+
+    hres = to_string(arg, &prompt);
+    if(FAILED(hres))
+        return hres;
+
+    hres = show_msgbox(This->desc->ctx, prompt, res);
+    SysFreeString(prompt);
+    return hres;
 }
 
 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)




More information about the wine-cvs mailing list