cvs: php4 /ext/com COM.c
| From: | Harald Radi | Date: | Mon, 10 Sep 2001 09:22:39 +0000 |
| Subject: | cvs: php4 /ext/com COM.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-7360@lists.php.net to get a copy of this message | ||
phanto Mon Sep 10 05:22:39 2001 EDT
Modified files:
/php4/ext/com COM.c
Log:
IDispatchs got released if they were passed to another component
Index: php4/ext/com/COM.c
diff -u php4/ext/com/COM.c:1.53 php4/ext/com/COM.c:1.54
--- php4/ext/com/COM.c:1.53 Sat Sep 8 16:40:55 2001
+++ php4/ext/com/COM.c Mon Sep 10 05:22:39 2001
@@ -511,6 +511,12 @@
/* @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 @@
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);