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