diff options
author | andy wharmby <wharmby@php.net> | 2007-02-02 15:27:35 +0000 |
---|---|---|
committer | andy wharmby <wharmby@php.net> | 2007-02-02 15:27:35 +0000 |
commit | cda82bc0a3f06d0a5328071ba46a65fe7c8fbef9 (patch) | |
tree | 6eed6dbfc0ebf4d7707068967f5e5a57cbe1fbea /ext/com_dotnet/com_wrapper.c | |
parent | a8c006235cd48c06768cb835ba8b4313713a6f81 (diff) | |
download | php-git-cda82bc0a3f06d0a5328071ba46a65fe7c8fbef9.tar.gz |
Fixed bug #34564 (COM extension not returning modified "out" argument)
Diffstat (limited to 'ext/com_dotnet/com_wrapper.c')
-rw-r--r-- | ext/com_dotnet/com_wrapper.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c index af8579c6bd..4cc81aa04b 100644 --- a/ext/com_dotnet/com_wrapper.c +++ b/ext/com_dotnet/com_wrapper.c @@ -298,6 +298,17 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex( &retval, pdp->cArgs, params, 1, NULL TSRMLS_CC)) { ret = S_OK; trace("function called ok\n"); + + /* Copy any modified 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]; + 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; |