]> granicus.if.org Git - php/commitdiff
- Fix #32758 Cannot access safearray properties
authorWez Furlong <wez@php.net>
Tue, 19 Apr 2005 05:57:21 +0000 (05:57 +0000)
committerWez Furlong <wez@php.net>
Tue, 19 Apr 2005 05:57:21 +0000 (05:57 +0000)
- Fix #32759 incorrect determination of default value

ext/com_dotnet/com_com.c
ext/com_dotnet/com_handlers.c
ext/com_dotnet/com_typeinfo.c
ext/com_dotnet/php_com_dotnet_internal.h

index 39c90eae1f811704d28ce67d66909f7a4dab2106..25a5c73e516103accf6623695306c3c4fd3f64d0 100644 (file)
@@ -398,7 +398,7 @@ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member,
                                
                        default:
                                desc = php_win_err(hr);
-                               spprintf(&msg, 0, "Error %s", desc);
+                               spprintf(&msg, 0, "Error [0x%08x] %s", hr, desc);
                                LocalFree(desc);
                                break;
                }
@@ -620,7 +620,7 @@ int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid,
                efree(vargs);
        }
 
-       /* a bit strange this, but... */
+       /* a bit of a hack this, but it's needed for COM array access. */
        if (hr == DISP_E_BADPARAMCOUNT)
                return hr;
        
index 531c20273376a7b8378aa84f938aca87ef669485..824046f0ea9e7eedea74d56e8bf1466fbdc486f0 100644 (file)
@@ -49,7 +49,7 @@ static zval *com_property_read(zval *object, zval *member, int type TSRMLS_DC)
                convert_to_string_ex(&member);
 
                res = php_com_do_invoke(obj, Z_STRVAL_P(member), Z_STRLEN_P(member),
-                               DISPATCH_PROPERTYGET, &v, 0, NULL TSRMLS_CC);
+                               DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, 0, NULL TSRMLS_CC);
 
                if (res == SUCCESS) {
                        php_com_zval_from_variant(return_value, &v, obj->code_page TSRMLS_CC);
@@ -84,30 +84,6 @@ static void com_property_write(zval *object, zval *member, zval *value TSRMLS_DC
        }
 }
 
-static HRESULT com_get_default_binding(php_com_dotnet_object *obj TSRMLS_DC)
-{
-       VARDESC *vardesc;
-       int i;
-
-       if (!obj->typeinfo) {
-               return FAILURE;
-       }
-
-       for (i = 0; !obj->have_default_bind; i++) {
-               if (FAILED(ITypeInfo_GetVarDesc(obj->typeinfo, i, &vardesc))) {
-                       return FAILURE;
-               }
-
-               if (vardesc->wVarFlags & VARFLAG_FDEFAULTBIND) {
-                       obj->default_bind = (DISPID)vardesc->memid;
-                       obj->have_default_bind = 1;
-               }
-
-               ITypeInfo_ReleaseVarDesc(obj->typeinfo, vardesc);
-       }
-       return obj->have_default_bind ? SUCCESS : FAILURE;
-}
-
 static zval *com_read_dimension(zval *object, zval *offset, int type TSRMLS_DC)
 {
        zval *return_value;
@@ -122,14 +98,9 @@ static zval *com_read_dimension(zval *object, zval *offset, int type TSRMLS_DC)
        obj = CDNO_FETCH(object);
 
        if (V_VT(&obj->v) == VT_DISPATCH) {
-               if (!obj->have_default_bind && !com_get_default_binding(obj TSRMLS_CC)) {
-                       php_com_throw_exception(E_INVALIDARG, "this COM object has no default property" TSRMLS_CC);
-                       return return_value;
-               }
-
                VariantInit(&v);
 
-               if (SUCCESS == php_com_do_invoke_by_id(obj, obj->default_bind,
+               if (SUCCESS == php_com_do_invoke_by_id(obj, DISPID_VALUE,
                                DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, 1, &offset TSRMLS_CC)) {
                        php_com_zval_from_variant(return_value, &v, obj->code_page TSRMLS_CC);
                        VariantClear(&v);
@@ -163,17 +134,12 @@ static void com_write_dimension(zval *object, zval *offset, zval *value TSRMLS_D
        obj = CDNO_FETCH(object);
 
        if (V_VT(&obj->v) == VT_DISPATCH) {
-               if (!obj->have_default_bind && !com_get_default_binding(obj TSRMLS_CC)) {
-                       php_com_throw_exception(E_INVALIDARG, "this COM object has no default property" TSRMLS_CC);
-                       return;
-               }
-
                args[0] = offset;
                args[1] = value;
 
                VariantInit(&v);
 
-               if (SUCCESS == php_com_do_invoke_by_id(obj, obj->default_bind,
+               if (SUCCESS == php_com_do_invoke_by_id(obj, DISPID_VALUE,
                                DISPATCH_METHOD|DISPATCH_PROPERTYPUT, &v, 2, args TSRMLS_CC)) {
                        VariantClear(&v);
                }
@@ -536,12 +502,7 @@ static int com_object_cast(zval *readobj, zval *writeobj, int type, int should_f
        VariantInit(&v);
 
        if (V_VT(&obj->v) == VT_DISPATCH) {
-
-               if (!obj->have_default_bind && !com_get_default_binding(obj TSRMLS_CC)) {
-                       return FAILURE;
-               }
-
-               if (FAILURE == php_com_do_invoke_by_id(obj, obj->default_bind,
+               if (FAILURE == php_com_do_invoke_by_id(obj, DISPID_VALUE,
                                DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, 0, NULL TSRMLS_CC)) {
                        return FAILURE;
                }
index 9a10376d0b5ab2f8772863de048b8ef07fa7be85..181cd5e3577eb4926edf818c47e3c0a570e1d4c1 100644 (file)
@@ -400,6 +400,7 @@ static const struct {
        { VT_VOID,              "VT_VOID" },
        { VT_PTR,               "VT_PTR" },
        { VT_HRESULT,   "VT_HRESULT" },
+       { VT_SAFEARRAY, "VT_SAFEARRAY" },
        { 0, NULL }
 };
 
index f24f7cfbfbc72a2478d85b51269fc6bde9db8131..9cf7723818efd869c6d5c8808896fd4705605b57 100644 (file)
@@ -37,10 +37,8 @@ typedef struct _php_com_dotnet_object {
 
        ITypeInfo *typeinfo;
        long code_page;
-       unsigned int have_default_bind:1;
 
        zend_class_entry *ce;
-       DISPID default_bind; /* default property for array accesses */
 
        /* associated event sink */
        IDispatch *sink_dispatch;