oleaut32: Add an exception handler around code executed on the server side from the typelib marshaler.
diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index 2dee9d7..396cca3 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -40,12 +40,14 @@
 #include "winnls.h"
 #include "winreg.h"
 #include "winuser.h"
+#include "excpt.h"
 
 #include "ole2.h"
 #include "propidl.h" /* for LPSAFEARRAY_User* functions */
 #include "typelib.h"
 #include "variant.h"
 #include "wine/debug.h"
+#include "wine/exception.h"
 
 static const WCHAR IDispatchW[] = { 'I','D','i','s','p','a','t','c','h',0};
 
@@ -1785,12 +1787,30 @@
     }
 
     args[0] = (DWORD)This->pUnk;
-    res = _invoke(
-	(*((FARPROC**)args[0]))[fdesc->oVft/4],
-	fdesc->callconv,
-	(xargs-args),
-	args
-    );
+
+    __TRY
+    {
+        res = _invoke(
+            (*((FARPROC**)args[0]))[fdesc->oVft/4],
+            fdesc->callconv,
+            (xargs-args),
+            args
+        );
+    }
+    __EXCEPT(NULL)
+    {
+        DWORD dwExceptionCode = GetExceptionCode();
+        ERR("invoke call failed with exception 0x%08lx (%ld)\n", dwExceptionCode, dwExceptionCode);
+        if (FAILED(dwExceptionCode))
+            hres = dwExceptionCode;
+        else
+            hres = HRESULT_FROM_WIN32(dwExceptionCode);
+    }
+    __ENDTRY
+
+    if (hres != S_OK)
+        return hres;
+
     buf.curoff = 0;
 
     xargs = args+1;