--- com_wrapper.c.old 2007-01-25 10:40:38.265625000 +0000 +++ com_wrapper.c 2007-01-25 12:57:15.890625000 +0000 @@ -298,6 +298,20 @@ &retval, pdp->cArgs, params, 1, NULL TSRMLS_CC)) { ret = S_OK; trace("function called ok\n"); + + /* Copy any modifed values to callers copy of variant*/ + for (i = 0; i < pdp->cArgs; i++) { + php_com_dotnet_object *obj = CDNO_FETCH(*params[i]); + VARIANT *srcvar = &obj->v; + VARIANT *dstvar = &pdp->rgvarg[ pdp->cArgs - 1 - i]; + //todo: Unfortunatley some IN only parameters are passed by ref which so + // this does mean that a user method can incorrectly modify a IN only + // variant. Is this an issue ? + if ((V_VT(dstvar) & VT_BYREF) && obj->modified ) { + trace("percolate modified value for arg %d VT=%08x\n", i, V_VT(dstvar)); + php_com_copy_variant(dstvar, srcvar TSRMLS_CC); + } + } } else { trace("failed to call func\n"); ret = DISP_E_EXCEPTION;