From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcp90/exception.c | 12 ++++++++++++ dlls/msvcrt/cppexcept.h | 12 ++++++++++++ 2 files changed, 24 insertions(+)
diff --git a/dlls/msvcp90/exception.c b/dlls/msvcp90/exception.c index daa0cdf72bc..015d6e85da6 100644 --- a/dlls/msvcp90/exception.c +++ b/dlls/msvcp90/exception.c @@ -19,11 +19,14 @@ #include <errno.h> #include <stdarg.h>
+#define COBJMACROS + #include "msvcp90.h" #include "windef.h" #include "winbase.h" #include "winternl.h" #include "rtlsupportapi.h" +#include "unknwn.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(msvcp); @@ -40,6 +43,7 @@ CREATE_TYPE_INFO_VTABLE
#define CLASS_IS_SIMPLE_TYPE 1 #define CLASS_HAS_VIRTUAL_BASE_CLASS 4 +#define CLASS_IS_IUNKNOWN 8
int* __cdecl __processing_throw(void);
@@ -1205,6 +1209,8 @@ static inline void copy_exception( void *object, void **dest, UINT catch_flags, { if (type->flags & CLASS_IS_SIMPLE_TYPE) { + if (type->flags & CLASS_IS_IUNKNOWN && *(IUnknown**)object) + IUnknown_AddRef(*(IUnknown**)object); memmove( dest, object, type->size ); /* if it is a pointer, adjust it */ if (type->size == sizeof(void*)) *dest = get_this_pointer( &type->offsets, *dest ); @@ -1212,11 +1218,17 @@ static inline void copy_exception( void *object, void **dest, UINT catch_flags, else /* copy the object */ { if (type->copy_ctor) + { call_copy_ctor( cxx_rva( type->copy_ctor, base ), dest, get_this_pointer( &type->offsets, object ), (type->flags & CLASS_HAS_VIRTUAL_BASE_CLASS) ); + } else + { + if (type->flags & CLASS_IS_IUNKNOWN && *(IUnknown**)object) + IUnknown_AddRef(*(IUnknown**)object); memmove( dest, get_this_pointer( &type->offsets, object ), type->size ); + } } }
diff --git a/dlls/msvcrt/cppexcept.h b/dlls/msvcrt/cppexcept.h index 2bd2e2f9c62..21a7e6a8009 100644 --- a/dlls/msvcrt/cppexcept.h +++ b/dlls/msvcrt/cppexcept.h @@ -21,7 +21,10 @@ #ifndef __MSVCRT_CPPEXCEPT_H #define __MSVCRT_CPPEXCEPT_H
+#define COBJMACROS + #include <fpieee.h> +#include "unknwn.h" #include "cxx.h"
#define CXX_FRAME_MAGIC_VC6 0x19930520 @@ -132,6 +135,7 @@ typedef struct
#define CLASS_IS_SIMPLE_TYPE 1 #define CLASS_HAS_VIRTUAL_BASE_CLASS 4 +#define CLASS_IS_IUNKNOWN 8
#define TYPE_FLAG_CONST 1 #define TYPE_FLAG_VOLATILE 2 @@ -244,6 +248,8 @@ static inline void copy_exception( void *object, void **dest, UINT catch_flags, } else if (type->flags & CLASS_IS_SIMPLE_TYPE) { + if (type->flags & CLASS_IS_IUNKNOWN && *(IUnknown**)object) + IUnknown_AddRef(*(IUnknown**)object); memmove( dest, object, type->size ); /* if it is a pointer, adjust it */ if (type->size == sizeof(void*)) *dest = get_this_pointer( &type->offsets, *dest ); @@ -251,11 +257,17 @@ static inline void copy_exception( void *object, void **dest, UINT catch_flags, else /* copy the object */ { if (type->copy_ctor) + { call_copy_ctor( cxx_rva( type->copy_ctor, base ), dest, get_this_pointer( &type->offsets, object ), (type->flags & CLASS_HAS_VIRTUAL_BASE_CLASS) ); + } else + { + if (type->flags & CLASS_IS_IUNKNOWN && *(IUnknown**)object) + IUnknown_AddRef(*(IUnknown**)object); memmove( dest, get_this_pointer( &type->offsets, object ), type->size ); + } } }