IDispatchs got released if they were passed to another component

This commit is contained in:
Harald Radi 2001-09-10 09:22:40 +00:00
parent 3b52256bd1
commit d1a2dbfd9d
2 changed files with 22 additions and 2 deletions

View file

@ -511,6 +511,12 @@ PHP_FUNCTION(com_load)
/* @todo if (server_name) */ /* @todo if (server_name) */
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 = CreateBindCtx(0, &pBindCtx))) {
if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) { if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) {
hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj)); hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj));
@ -742,8 +748,12 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
efree(funcname); efree(funcname);
for (current_arg=0;current_arg<arg_count;current_arg++) { for (current_arg=0;current_arg<arg_count;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]); VariantClear(&variant_args[current_arg]);
} }
}
efree(variant_args); efree(variant_args);
if (FAILED(hr)) { if (FAILED(hr)) {

View file

@ -511,6 +511,12 @@ PHP_FUNCTION(com_load)
/* @todo if (server_name) */ /* @todo if (server_name) */
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 = CreateBindCtx(0, &pBindCtx))) {
if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) { if (SUCCEEDED(hr = MkParseDisplayName(pBindCtx, ProgID, &ulEaten, &pMoniker))) {
hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj)); hr = pMoniker->lpVtbl->BindToObject(pMoniker, pBindCtx, NULL, &IID_IDispatch, (LPVOID *) &C_DISPATCH(obj));
@ -742,8 +748,12 @@ int do_COM_invoke(comval *obj, pval *function_name, VARIANT *var_result, pval **
efree(funcname); efree(funcname);
for (current_arg=0;current_arg<arg_count;current_arg++) { for (current_arg=0;current_arg<arg_count;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]); VariantClear(&variant_args[current_arg]);
} }
}
efree(variant_args); efree(variant_args);
if (FAILED(hr)) { if (FAILED(hr)) {