diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index d060c5102a0..f5254c45553 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -107,25 +107,46 @@ static void stack_popn(exec_ctx_t *ctx, unsigned n)
         VariantClear(stack_pop(ctx));
 }
 
+static void vbstack_to_dp(exec_ctx_t *ctx, unsigned arg_cnt, DISPPARAMS *dp)
+{
+    dp->cArgs = arg_cnt;
+    dp->rgdispidNamedArgs = NULL;
+    dp->cNamedArgs = 0;
+
+    if(arg_cnt) {
+        VARIANT tmp;
+        unsigned i;
+
+        assert(ctx->top >= arg_cnt);
+
+        for(i=1; i*2 <= arg_cnt; i++) {
+            tmp = ctx->stack[ctx->top-i];
+            ctx->stack[ctx->top-i] = ctx->stack[ctx->top-arg_cnt+i-1];
+            ctx->stack[ctx->top-arg_cnt+i-1] = tmp;
+        }
+
+        dp->rgvarg = ctx->stack + ctx->top-arg_cnt;
+    }else {
+        dp->rgvarg = NULL;
+    }
+}
+
 static HRESULT interp_icallv(exec_ctx_t *ctx)
 {
     BSTR identifier = ctx->instr->arg1.bstr;
     const unsigned arg_cnt = ctx->instr->arg2.uint;
-    DISPPARAMS dp = {0};
-    ref_t ref;
+    ref_t ref = {0};
+    DISPPARAMS dp;
     HRESULT hres;
 
     TRACE("\n");
 
-    if(arg_cnt) {
-        FIXME("arguments not implemented\n");
-        return E_NOTIMPL;
-    }
-
     hres = lookup_identifier(ctx, identifier, &ref);
     if(FAILED(hres))
         return hres;
 
+    vbstack_to_dp(ctx, arg_cnt, &dp);
+
     switch(ref.type) {
     case REF_DISP:
         hres = disp_call(ctx->script, ref.u.d.disp, ref.u.d.id, &dp, NULL);
@@ -137,6 +158,7 @@ static HRESULT interp_icallv(exec_ctx_t *ctx)
         return DISP_E_UNKNOWNNAME;
     }
 
+    stack_popn(ctx, arg_cnt);
     return S_OK;
 }