@@ -82,7 +82,7 @@ public static object GetProperty(this IDispatchEx dispatchEx, string name, bool
8282 {
8383 EXCEPINFO excepInfo ;
8484 var dispArgs = new DISPPARAMS { cArgs = args . Length , rgvarg = argVariantArrayBlock . Addr , cNamedArgs = 0 , rgdispidNamedArgs = IntPtr . Zero } ;
85- dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyGet , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ;
85+ Marshal . ThrowExceptionForHR ( dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyGet , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ) ;
8686 return Marshal . GetObjectForNativeVariant ( resultVariantBlock . Addr ) ;
8787 }
8888 }
@@ -110,7 +110,20 @@ public static void SetProperty(this IDispatchEx dispatchEx, string name, bool ig
110110 EXCEPINFO excepInfo ;
111111 Marshal . WriteInt32 ( namedArgDispidBlock . Addr , SpecialDispIDs . PropertyPut ) ;
112112 var dispArgs = new DISPPARAMS { cArgs = args . Length , rgvarg = argVariantArrayBlock . Addr , cNamedArgs = 1 , rgdispidNamedArgs = namedArgDispidBlock . Addr } ;
113- dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyPut | DispatchFlags . PropertyPutRef , ref dispArgs , IntPtr . Zero , out excepInfo ) ;
113+
114+ result = dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyPut | DispatchFlags . PropertyPutRef , ref dispArgs , IntPtr . Zero , out excepInfo ) ;
115+ if ( result == RawCOMHelpers . HResult . DISP_E_MEMBERNOTFOUND )
116+ {
117+ // VBScript objects can be finicky about property-put dispatch flags
118+
119+ result = dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyPut , ref dispArgs , IntPtr . Zero , out excepInfo ) ;
120+ if ( result == RawCOMHelpers . HResult . DISP_E_MEMBERNOTFOUND )
121+ {
122+ result = dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . PropertyPutRef , ref dispArgs , IntPtr . Zero , out excepInfo ) ;
123+ }
124+ }
125+
126+ Marshal . ThrowExceptionForHR ( result ) ;
114127 }
115128 }
116129 }
@@ -144,7 +157,7 @@ public static object Invoke(this IDispatchEx dispatchEx, object[] args, bool asC
144157 {
145158 EXCEPINFO excepInfo ;
146159 var dispArgs = new DISPPARAMS { cArgs = args . Length , rgvarg = argVariantArrayBlock . Addr , cNamedArgs = 0 , rgdispidNamedArgs = IntPtr . Zero } ;
147- dispatchEx . InvokeEx ( SpecialDispIDs . Default , 0 , asConstructor ? DispatchFlags . Construct : DispatchFlags . Method , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ;
160+ Marshal . ThrowExceptionForHR ( dispatchEx . InvokeEx ( SpecialDispIDs . Default , 0 , asConstructor ? DispatchFlags . Construct : DispatchFlags . Method , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ) ;
148161 return Marshal . GetObjectForNativeVariant ( resultVariantBlock . Addr ) ;
149162 }
150163 }
@@ -161,7 +174,7 @@ public static object InvokeMethod(this IDispatchEx dispatchEx, string name, bool
161174 {
162175 EXCEPINFO excepInfo ;
163176 var dispArgs = new DISPPARAMS { cArgs = args . Length , rgvarg = argVariantArrayBlock . Addr , cNamedArgs = 0 , rgdispidNamedArgs = IntPtr . Zero } ;
164- dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . Method , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ;
177+ Marshal . ThrowExceptionForHR ( dispatchEx . InvokeEx ( dispid , 0 , DispatchFlags . Method , ref dispArgs , resultVariantBlock . Addr , out excepInfo ) ) ;
165178 return Marshal . GetObjectForNativeVariant ( resultVariantBlock . Addr ) ;
166179 }
167180 }
0 commit comments