Browse Source

IDispatchs got released if they were passed to another component

experimental/namespaces
Harald Radi 25 years ago
parent
commit
d1a2dbfd9d
  1. 12
      ext/com/COM.c
  2. 12
      ext/rpc/com/com_wrapper.c

12
ext/com/COM.c

@ -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);

12
ext/rpc/com/com_wrapper.c

@ -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);

Loading…
Cancel
Save