summaryrefslogtreecommitdiff
path: root/ext/com_dotnet/com_wrapper.c
diff options
context:
space:
mode:
authorandy wharmby <wharmby@php.net>2007-02-02 15:27:35 +0000
committerandy wharmby <wharmby@php.net>2007-02-02 15:27:35 +0000
commitcda82bc0a3f06d0a5328071ba46a65fe7c8fbef9 (patch)
tree6eed6dbfc0ebf4d7707068967f5e5a57cbe1fbea /ext/com_dotnet/com_wrapper.c
parenta8c006235cd48c06768cb835ba8b4313713a6f81 (diff)
downloadphp-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.c11
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;