]> granicus.if.org Git - php/commitdiff
IDispatchs got released if they were passed to another component
authorHarald Radi <phanto@php.net>
Mon, 10 Sep 2001 09:22:40 +0000 (09:22 +0000)
committerHarald Radi <phanto@php.net>
Mon, 10 Sep 2001 09:22:40 +0000 (09:22 +0000)
ext/com/COM.c
ext/rpc/com/com_wrapper.c

index fda0b948dabe07cdcbece0b4d48f7e7e69dcbcdf..b4d855242ebf1470fc8f25b4d3fcefc8ce350e03 100644 (file)
@@ -511,6 +511,12 @@ PHP_FUNCTION(com_load)
                /* @todo if (server_name) */
 
                if (!server_name) {
+                       /* @todo shouldn't the bind context be fetched on module startup and kept as a global shared instance ?
+                        * all calls to BindToObject would deliver the same instance then (as desired)
+                        * IBindCtx::RegisterObjectBound() should be called then after  mkparsedisplayname()
+                        *
+                        * @todo use mkparsedisplaynameex() ?
+                        */ 
                        if (SUCCEEDED(hr = CreateBindCtx(0, &pBindCtx))) {
                                if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) {
                                        hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj));
@@ -742,7 +748,11 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
 
                efree(funcname);
                for (current_arg=0;current_arg<arg_count;current_arg++) {
-                       VariantClear(&variant_args[current_arg]);
+                       /* don't release IDispatch pointers as they are used afterwards */
+                       if (V_VT(&variant_args[current_arg]) != VT_DISPATCH) {
+                               /* @todo review this: what happens to an array of IDispatchs or a VARIANT->IDispatch */
+                               VariantClear(&variant_args[current_arg]);
+                       }
                }
                efree(variant_args);
 
index fda0b948dabe07cdcbece0b4d48f7e7e69dcbcdf..b4d855242ebf1470fc8f25b4d3fcefc8ce350e03 100644 (file)
@@ -511,6 +511,12 @@ PHP_FUNCTION(com_load)
                /* @todo if (server_name) */
 
                if (!server_name) {
+                       /* @todo shouldn't the bind context be fetched on module startup and kept as a global shared instance ?
+                        * all calls to BindToObject would deliver the same instance then (as desired)
+                        * IBindCtx::RegisterObjectBound() should be called then after  mkparsedisplayname()
+                        *
+                        * @todo use mkparsedisplaynameex() ?
+                        */ 
                        if (SUCCEEDED(hr = CreateBindCtx(0, &pBindCtx))) {
                                if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) {
                                        hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj));
@@ -742,7 +748,11 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
 
                efree(funcname);
                for (current_arg=0;current_arg<arg_count;current_arg++) {
-                       VariantClear(&variant_args[current_arg]);
+                       /* don't release IDispatch pointers as they are used afterwards */
+                       if (V_VT(&variant_args[current_arg]) != VT_DISPATCH) {
+                               /* @todo review this: what happens to an array of IDispatchs or a VARIANT->IDispatch */
+                               VariantClear(&variant_args[current_arg]);
+                       }
                }
                efree(variant_args);