cvs: php4(EXPERIMENTAL) /ext/com COM.c php_COM.h
| From: | Alan Brown | Date: | Sat, 11 Aug 2001 16:57:19 +0000 |
| Subject: | cvs: php4(EXPERIMENTAL) /ext/com COM.c php_COM.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-6741@lists.php.net to get a copy of this message | ||
abrown Sat Aug 11 12:57:19 2001 EDT
Modified files: (Branch: EXPERIMENTAL)
/php4/ext/com php_COM.h COM.c
Log:
Added support to display argument and EXCEPTINFO in appropriate places.
Index: php4/ext/com/php_COM.h diff -u php4/ext/com/php_COM.h:1.7.2.4 php4/ext/com/php_COM.h:1.7.2.5 --- php4/ext/com/php_COM.h:1.7.2.4 Tue Jul 31 12:03:11 2001 +++ php4/ext/com/php_COM.h Sat Aug 11 12:57:18 2001 @@ -19,7 +19,7 @@ PHP_FUNCTION(com_load_typelib); PHP_FUNCTION(com_isenum); -PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult TSRMLS_DC); +PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, char **ErrString TSRMLS_DC); PHPAPI HRESULT php_COM_get_ids_of_names(comval *obj, OLECHAR FAR* FAR* rgszNames, DISPID FAR* rgDispId TSRMLS_DC); PHPAPI HRESULT php_COM_release(comval *obj TSRMLS_DC); PHPAPI HRESULT php_COM_addref(comval *obj TSRMLS_DC); Index: php4/ext/com/COM.c diff -u php4/ext/com/COM.c:1.29.2.7 php4/ext/com/COM.c:1.29.2.8 --- php4/ext/com/COM.c:1.29.2.7 Tue Jul 31 12:03:11 2001 +++ php4/ext/com/COM.c Sat Aug 11 12:57:18 2001 @@ -102,15 +102,14 @@ DISPLAY_INI_ENTRIES(); } -PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult TSRMLS_DC) +PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, char **ErrString TSRMLS_DC) { HRESULT hr; int failed = FALSE; unsigned int ArgErr; EXCEPINFO ExceptInfo; - /* TODO: Make use of the ArgError when hr==E_INVALIDARG */ - /* TODO: Deal with the ExceptInfo structure in the error message */ + *ErrString = NULL; if(C_ISREFD(obj)) { if(C_HASTLIB(obj)) @@ -136,6 +135,33 @@ hr = C_DISPATCH_VT(obj)->Invoke(C_DISPATCH(obj), dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, &ExceptInfo, &ArgErr); } + if (FAILED(hr)) + { + switch (hr) + { + case DISP_E_EXCEPTION: + { + int srclen; + char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, 1, codepage TSRMLS_CC); + int desclen; + char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, 1, codepage TSRMLS_CC); + *ErrString = pemalloc(srclen+desclen+50, 1); + sprintf(*ErrString, "<b>Source</b>: %s <b>Description</b>: %s", src, desc); + pefree(src, 1); + pefree(desc, 1); + SysFreeString(ExceptInfo.bstrSource); + SysFreeString(ExceptInfo.bstrDescription); + SysFreeString(ExceptInfo.bstrHelpFile); + } + break; + case DISP_E_PARAMNOTFOUND: + case DISP_E_TYPEMISMATCH: + *ErrString = pemalloc(25, 1); + sprintf(*ErrString, "<b>Argument</b>: %d", pDispParams->cArgs-ArgErr+1); + break; + } + } + return hr; } else @@ -550,7 +576,7 @@ { php_COM_destruct(obj TSRMLS_CC); error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Invalid ProgID or Moniker: %s\n", error_message); + php_error(E_WARNING,"Invalid ProgID, GUID string, or Moniker: %s", error_message); LocalFree(error_message); RETURN_FALSE; } @@ -589,7 +615,7 @@ { error_message = php_COM_error_message(hr TSRMLS_CC); clsid_str = php_string_from_clsid(&clsid TSRMLS_CC); - php_error(E_WARNING,"Unable to obtain IDispatch interface for CLSID %s: %s",clsid_str,error_message); + php_error(E_WARNING,"Unable to obtain IDispatch interface for CLSID %s: %s",clsid_str,error_message); LocalFree(error_message); efree(clsid_str); php_COM_destruct(obj TSRMLS_CC); @@ -673,7 +699,7 @@ break; default: - php_error(E_WARNING,"Wrong argument count to IEnumVariant::Next()\n"); + php_error(E_WARNING,"Wrong argument count to IEnumVariant::Next()"); return FAILURE; } @@ -696,7 +722,7 @@ if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Next(C_ENUMVARIANT(obj), count, pSA->pvData, &count))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); VariantClear(var_result); return FAILURE; @@ -708,7 +734,7 @@ if(FAILED(SafeArrayRedim(pSA, rgsabound))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); VariantClear(var_result); return FAILURE; @@ -722,7 +748,7 @@ if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Reset(C_ENUMVARIANT(obj)))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); return FAILURE; } @@ -744,13 +770,13 @@ break; default: - php_error(E_WARNING,"Wrong argument count to IEnumVariant::Skip()\n"); + php_error(E_WARNING,"Wrong argument count to IEnumVariant::Skip()"); return FAILURE; } if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Skip(C_ENUMVARIANT(obj), count))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); return FAILURE; } @@ -759,6 +785,8 @@ } else { + char *ErrString; + funcname = php_char_to_OLECHAR(Z_STRVAL_P(function_name), Z_STRLEN_P(function_name), codepage TSRMLS_CC); hr = php_COM_get_ids_of_names(obj, &funcname, &dispid TSRMLS_CC); @@ -766,7 +794,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(function_name), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(function_name), error_message); LocalFree(error_message); efree(funcname); return FAILURE; @@ -785,7 +813,7 @@ dispparams.cArgs = arg_count; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); efree(funcname); for (current_arg=0;current_arg<arg_count;current_arg++) @@ -797,7 +825,15 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Invoke() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"Invoke() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"Invoke() failed: %s", error_message); + } LocalFree(error_message); return FAILURE; } @@ -945,7 +981,7 @@ OLECHAR *propname; char *error_message; DISPPARAMS dispparams; - + char *ErrString; /* obtain property handler */ propname = php_char_to_OLECHAR(Z_STRVAL_P(arg_property), Z_STRLEN_P(arg_property), codepage TSRMLS_CC); @@ -955,7 +991,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(arg_property), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(arg_property), error_message); LocalFree(error_message); efree(propname); if(cleanup) @@ -968,12 +1004,20 @@ dispparams.cArgs = 0; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"PropGet() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"PropGet() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"PropGet() failed: %s", error_message); + } LocalFree(error_message); efree(propname); if(cleanup) @@ -1001,6 +1045,7 @@ VARIANT *var_result, *new_value; DISPPARAMS dispparams; DISPID mydispid = DISPID_PROPERTYPUT; + char *ErrString; ALLOC_VARIANT(var_result); ALLOC_VARIANT(new_value); @@ -1013,7 +1058,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(arg_property), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(arg_property), error_message); LocalFree(error_message); efree(propname); @@ -1029,12 +1074,20 @@ dispparams.cArgs = 1; dispparams.cNamedArgs = 1; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYPUT, &dispparams, NULL TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYPUT, &dispparams, NULL, &ErrString TSRMLS_CC); if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"PropPut() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"PropPut() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"PropPut() failed: %s", error_message); + } LocalFree(error_message); efree(propname); @@ -1047,7 +1100,7 @@ dispparams.cArgs = 0; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); if(SUCCEEDED(hr)) { @@ -1057,6 +1110,11 @@ { *return_value = *value; zval_copy_ctor(return_value); + } + + if (ErrString) + { + pefree(ErrString, 1); } FREE_VARIANT(var_result);
Index: php4/ext/com/php_COM.h diff -u php4/ext/com/php_COM.h:1.7.2.4 php4/ext/com/php_COM.h:1.7.2.5 --- php4/ext/com/php_COM.h:1.7.2.4 Tue Jul 31 12:03:11 2001 +++ php4/ext/com/php_COM.h Sat Aug 11 12:57:18 2001 @@ -19,7 +19,7 @@ PHP_FUNCTION(com_load_typelib); PHP_FUNCTION(com_isenum); -PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult TSRMLS_DC); +PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, char **ErrString TSRMLS_DC); PHPAPI HRESULT php_COM_get_ids_of_names(comval *obj, OLECHAR FAR* FAR* rgszNames, DISPID FAR* rgDispId TSRMLS_DC); PHPAPI HRESULT php_COM_release(comval *obj TSRMLS_DC); PHPAPI HRESULT php_COM_addref(comval *obj TSRMLS_DC); Index: php4/ext/com/COM.c diff -u php4/ext/com/COM.c:1.29.2.7 php4/ext/com/COM.c:1.29.2.8 --- php4/ext/com/COM.c:1.29.2.7 Tue Jul 31 12:03:11 2001 +++ php4/ext/com/COM.c Sat Aug 11 12:57:18 2001 @@ -102,15 +102,14 @@ DISPLAY_INI_ENTRIES(); } -PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult TSRMLS_DC) +PHPAPI HRESULT php_COM_invoke(comval *obj, DISPID dispIdMember, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, char **ErrString TSRMLS_DC) { HRESULT hr; int failed = FALSE; unsigned int ArgErr; EXCEPINFO ExceptInfo; - /* TODO: Make use of the ArgError when hr==E_INVALIDARG */ - /* TODO: Deal with the ExceptInfo structure in the error message */ + *ErrString = NULL; if(C_ISREFD(obj)) { if(C_HASTLIB(obj)) @@ -136,6 +135,33 @@ hr = C_DISPATCH_VT(obj)->Invoke(C_DISPATCH(obj), dispIdMember, &IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags, pDispParams, pVarResult, &ExceptInfo, &ArgErr); } + if (FAILED(hr)) + { + switch (hr) + { + case DISP_E_EXCEPTION: + { + int srclen; + char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, 1, codepage TSRMLS_CC); + int desclen; + char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, 1, codepage TSRMLS_CC); + *ErrString = pemalloc(srclen+desclen+50, 1); + sprintf(*ErrString, "<b>Source</b>: %s <b>Description</b>: %s", src, desc); + pefree(src, 1); + pefree(desc, 1); + SysFreeString(ExceptInfo.bstrSource); + SysFreeString(ExceptInfo.bstrDescription); + SysFreeString(ExceptInfo.bstrHelpFile); + } + break; + case DISP_E_PARAMNOTFOUND: + case DISP_E_TYPEMISMATCH: + *ErrString = pemalloc(25, 1); + sprintf(*ErrString, "<b>Argument</b>: %d", pDispParams->cArgs-ArgErr+1); + break; + } + } + return hr; } else @@ -550,7 +576,7 @@ { php_COM_destruct(obj TSRMLS_CC); error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Invalid ProgID or Moniker: %s\n", error_message); + php_error(E_WARNING,"Invalid ProgID, GUID string, or Moniker: %s", error_message); LocalFree(error_message); RETURN_FALSE; } @@ -589,7 +615,7 @@ { error_message = php_COM_error_message(hr TSRMLS_CC); clsid_str = php_string_from_clsid(&clsid TSRMLS_CC); - php_error(E_WARNING,"Unable to obtain IDispatch interface for CLSID %s: %s",clsid_str,error_message); + php_error(E_WARNING,"Unable to obtain IDispatch interface for CLSID %s: %s",clsid_str,error_message); LocalFree(error_message); efree(clsid_str); php_COM_destruct(obj TSRMLS_CC); @@ -673,7 +699,7 @@ break; default: - php_error(E_WARNING,"Wrong argument count to IEnumVariant::Next()\n"); + php_error(E_WARNING,"Wrong argument count to IEnumVariant::Next()"); return FAILURE; } @@ -696,7 +722,7 @@ if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Next(C_ENUMVARIANT(obj), count, pSA->pvData, &count))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); VariantClear(var_result); return FAILURE; @@ -708,7 +734,7 @@ if(FAILED(SafeArrayRedim(pSA, rgsabound))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); VariantClear(var_result); return FAILURE; @@ -722,7 +748,7 @@ if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Reset(C_ENUMVARIANT(obj)))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); return FAILURE; } @@ -744,13 +770,13 @@ break; default: - php_error(E_WARNING,"Wrong argument count to IEnumVariant::Skip()\n"); + php_error(E_WARNING,"Wrong argument count to IEnumVariant::Skip()"); return FAILURE; } if(FAILED(hr = C_ENUMVARIANT_VT(obj)->Skip(C_ENUMVARIANT(obj), count))) { char *error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"IEnumVariant::Next() failed: %s\n", error_message); + php_error(E_WARNING,"IEnumVariant::Next() failed: %s", error_message); efree(error_message); return FAILURE; } @@ -759,6 +785,8 @@ } else { + char *ErrString; + funcname = php_char_to_OLECHAR(Z_STRVAL_P(function_name), Z_STRLEN_P(function_name), codepage TSRMLS_CC); hr = php_COM_get_ids_of_names(obj, &funcname, &dispid TSRMLS_CC); @@ -766,7 +794,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(function_name), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(function_name), error_message); LocalFree(error_message); efree(funcname); return FAILURE; @@ -785,7 +813,7 @@ dispparams.cArgs = arg_count; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); efree(funcname); for (current_arg=0;current_arg<arg_count;current_arg++) @@ -797,7 +825,15 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Invoke() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"Invoke() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"Invoke() failed: %s", error_message); + } LocalFree(error_message); return FAILURE; } @@ -945,7 +981,7 @@ OLECHAR *propname; char *error_message; DISPPARAMS dispparams; - + char *ErrString; /* obtain property handler */ propname = php_char_to_OLECHAR(Z_STRVAL_P(arg_property), Z_STRLEN_P(arg_property), codepage TSRMLS_CC); @@ -955,7 +991,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(arg_property), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(arg_property), error_message); LocalFree(error_message); efree(propname); if(cleanup) @@ -968,12 +1004,20 @@ dispparams.cArgs = 0; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"PropGet() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"PropGet() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"PropGet() failed: %s", error_message); + } LocalFree(error_message); efree(propname); if(cleanup) @@ -1001,6 +1045,7 @@ VARIANT *var_result, *new_value; DISPPARAMS dispparams; DISPID mydispid = DISPID_PROPERTYPUT; + char *ErrString; ALLOC_VARIANT(var_result); ALLOC_VARIANT(new_value); @@ -1013,7 +1058,7 @@ if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"Unable to lookup %s: %s\n", Z_STRVAL_P(arg_property), error_message); + php_error(E_WARNING,"Unable to lookup %s: %s", Z_STRVAL_P(arg_property), error_message); LocalFree(error_message); efree(propname); @@ -1029,12 +1074,20 @@ dispparams.cArgs = 1; dispparams.cNamedArgs = 1; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYPUT, &dispparams, NULL TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYPUT, &dispparams, NULL, &ErrString TSRMLS_CC); if(FAILED(hr)) { error_message = php_COM_error_message(hr TSRMLS_CC); - php_error(E_WARNING,"PropPut() failed: %s\n", error_message); + if (ErrString) + { + php_error(E_WARNING,"PropPut() failed: %s %s", error_message, ErrString); + pefree(ErrString, 1); + } + else + { + php_error(E_WARNING,"PropPut() failed: %s", error_message); + } LocalFree(error_message); efree(propname); @@ -1047,7 +1100,7 @@ dispparams.cArgs = 0; dispparams.cNamedArgs = 0; - hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result TSRMLS_CC); + hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC); if(SUCCEEDED(hr)) { @@ -1057,6 +1110,11 @@ { *return_value = *value; zval_copy_ctor(return_value); + } + + if (ErrString) + { + pefree(ErrString, 1); } FREE_VARIANT(var_result);