79
79
80
80
#define WC2VSTR (x ) ole_wc2vstr((x), TRUE)
81
81
82
- #define WIN32OLE_VERSION "0.7.4 "
82
+ #define WIN32OLE_VERSION "0.7.5 "
83
83
84
84
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX )
85
85
(REFCLSID , IUnknown * , DWORD , COSERVERINFO * , DWORD , MULTI_QI * );
@@ -522,6 +522,15 @@ ole_hresult2msg(hr)
522
522
return msg ;
523
523
}
524
524
525
+ static void
526
+ ole_freeexceptinfo (pExInfo )
527
+ EXCEPINFO * pExInfo ;
528
+ {
529
+ SysFreeString (pExInfo -> bstrDescription );
530
+ SysFreeString (pExInfo -> bstrSource );
531
+ SysFreeString (pExInfo -> bstrHelpFile );
532
+ }
533
+
525
534
static VALUE
526
535
ole_excepinfo2msg (pExInfo )
527
536
EXCEPINFO * pExInfo ;
@@ -561,9 +570,7 @@ ole_excepinfo2msg(pExInfo)
561
570
}
562
571
if (pSource ) free (pSource );
563
572
if (pDescription ) free (pDescription );
564
- SysFreeString (pExInfo -> bstrDescription );
565
- SysFreeString (pExInfo -> bstrSource );
566
- SysFreeString (pExInfo -> bstrHelpFile );
573
+ ole_freeexceptinfo (pExInfo );
567
574
return error_msg ;
568
575
}
569
576
@@ -2109,6 +2116,9 @@ ole_invoke(argc, argv, self, wFlags)
2109
2116
param = rb_ary_entry (paramS , i - cNamedArgs );
2110
2117
ole_val2variant (param , & op .dp .rgvarg [n ]);
2111
2118
}
2119
+ if (hr == DISP_E_EXCEPTION ) {
2120
+ ole_freeexceptinfo (& excepinfo );
2121
+ }
2112
2122
memset (& excepinfo , 0 , sizeof (EXCEPINFO ));
2113
2123
VariantInit (& result );
2114
2124
hr = pole -> pDispatch -> lpVtbl -> Invoke (pole -> pDispatch , DispID ,
@@ -2121,6 +2131,9 @@ ole_invoke(argc, argv, self, wFlags)
2121
2131
* hResult == DISP_E_EXCEPTION. this only happens on
2122
2132
* functions whose DISPID > 0x8000 */
2123
2133
if ((hr == DISP_E_EXCEPTION || hr == DISP_E_MEMBERNOTFOUND ) && DispID > 0x8000 ) {
2134
+ if (hr == DISP_E_EXCEPTION ) {
2135
+ ole_freeexceptinfo (& excepinfo );
2136
+ }
2124
2137
memset (& excepinfo , 0 , sizeof (EXCEPINFO ));
2125
2138
hr = pole -> pDispatch -> lpVtbl -> Invoke (pole -> pDispatch , DispID ,
2126
2139
& IID_NULL , lcid , wFlags ,
@@ -2140,6 +2153,9 @@ ole_invoke(argc, argv, self, wFlags)
2140
2153
param = rb_ary_entry (paramS , i - cNamedArgs );
2141
2154
ole_val2variant2 (param , & op .dp .rgvarg [n ]);
2142
2155
}
2156
+ if (hr == DISP_E_EXCEPTION ) {
2157
+ ole_freeexceptinfo (& excepinfo );
2158
+ }
2143
2159
memset (& excepinfo , 0 , sizeof (EXCEPINFO ));
2144
2160
VariantInit (& result );
2145
2161
hr = pole -> pDispatch -> lpVtbl -> Invoke (pole -> pDispatch , DispID ,
0 commit comments