Update of /cvsroot/pywin32/pywin32/com/TestSources/PyCOMTest
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9704/TestSources/PyCOMTest
Modified Files:
PyCOMImpl.cpp PyCOMImpl.h PyCOMTest.idl
Log Message:
Fix [ 1203980 ] Universal Gateway mishandles ByRef Variant arguments
Index: PyCOMTest.idl
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/TestSources/PyCOMTest/PyCOMTest.idl,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** PyCOMTest.idl 31 May 2005 12:37:18 -0000 1.10
--- PyCOMTest.idl 27 Jun 2005 11:02:41 -0000 1.11
***************
*** 174,177 ****
--- 174,180 ----
HRESULT GetSetDispatch([in] IDispatch *indisp, [out, retval] IDispatch **outdisp);
HRESULT GetSetUnknown([in] IUnknown *inunk, [out, retval] IUnknown **outunk);
+ HRESULT GetSetVariant([in] VARIANT vin, [out, retval] VARIANT *vout);
+ HRESULT TestByRefVariant([in, out] VARIANT *v);
+ HRESULT TestByRefString([in, out] BSTR *v);
HRESULT TakeByRefTypedDispatch([in, out] IPyCOMTest **inout);
HRESULT TakeByRefDispatch([in, out] IDispatch **inout);
Index: PyCOMImpl.h
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/TestSources/PyCOMTest/PyCOMImpl.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** PyCOMImpl.h 31 May 2005 12:37:18 -0000 1.9
--- PyCOMImpl.h 27 Jun 2005 11:02:41 -0000 1.10
***************
*** 65,68 ****
--- 65,71 ----
STDMETHOD(GetSetDispatch)(IDispatch *indisp, IDispatch **outdisp);
STDMETHOD(GetSetUnknown)(IUnknown *inunk, IUnknown **outunk);
+ STDMETHOD(GetSetVariant)(VARIANT vin, VARIANT *vout);
+ STDMETHOD(TestByRefVariant)(VARIANT *v);
+ STDMETHOD(TestByRefString)(BSTR *v);
STDMETHOD(TakeByRefTypedDispatch)(IPyCOMTest **inout);
STDMETHOD(TakeByRefDispatch)(IDispatch **inout);
Index: PyCOMImpl.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/TestSources/PyCOMTest/PyCOMImpl.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** PyCOMImpl.cpp 31 May 2005 12:37:18 -0000 1.10
--- PyCOMImpl.cpp 27 Jun 2005 11:02:40 -0000 1.11
***************
*** 195,198 ****
--- 195,223 ----
}
+ STDMETHODIMP CPyCOMTest::GetSetVariant(VARIANT var, VARIANT *out)
+ {
+ VariantClear(out); // necessary?
+ return VariantCopy(out, &var);
+ }
+
+ STDMETHODIMP CPyCOMTest::TestByRefVariant(VARIANT *v)
+ {
+ if (V_VT(v)==VT_I4) {
+ V_I4(v) *= 2;
+ return S_OK;
+ }
+ return E_FAIL;
+ }
+
+ STDMETHODIMP CPyCOMTest::TestByRefString(BSTR *v)
+ {
+ BSTR out = SysAllocStringLen(NULL, SysStringLen(*v)*2);
+ wcscpy(out, *v);
+ wcscat(out, *v);
+ SysFreeString(*v);
+ *v = out;
+ return S_OK;
+ }
+
STDMETHODIMP CPyCOMTest::TakeByRefTypedDispatch(IPyCOMTest **inout)
{
***************
*** 462,465 ****
--- 487,494 ----
CHECK_TRUE(outstr == L"FooFoo");
+ instr = L"Foo";
+ CHECK_HR(tester->TestByRefString(&instr));
+ CHECK_TRUE(instr == L"FooFoo");
+
// Arrays
int result;
***************
*** 489,492 ****
--- 518,536 ----
CComPtr<IPyCOMTest>obresult;
CHECK_HR(tester->GetSetInterface(param, &obresult));
+
+ VARIANT v1, v2;
+ VariantInit(&v1);
+ VariantInit(&v2);
+ V_VT(&v1) = VT_I4;
+ V_I4(&v1) = 99;
+ CHECK_HR(tester->GetSetVariant(v1, &v2));
+ CHECK_TRUE(V_VT(&v2)==VT_I4);
+ CHECK_TRUE(V_I4(&v2)==99);
+ CHECK_HR(tester->TestByRefVariant(&v2));
+ CHECK_TRUE(V_VT(&v2)==VT_I4);
+ CHECK_TRUE(V_I4(&v2)==198);
+ VariantClear(&v1);
+ VariantClear(&v2);
+
// Make a vtable call on the returned object, so we
// crash if a bad vtable. Don't care about the value tho.
|