Author: akhaldi Date: Fri Mar 4 09:33:46 2016 New Revision: 70904 URL: http://svn.reactos.org/svn/reactos?rev=70904&view=rev Log: [OLEAUT32_WINETEST] Sync with Wine Staging 1.9.4. CORE-10912
Modified: trunk/rostests/winetests/oleaut32/olepicture.c trunk/rostests/winetests/oleaut32/safearray.c trunk/rostests/winetests/oleaut32/test_reg.idl trunk/rostests/winetests/oleaut32/tmarshal.c trunk/rostests/winetests/oleaut32/tmarshal.idl trunk/rostests/winetests/oleaut32/typelib.c trunk/rostests/winetests/oleaut32/usrmarshal.c trunk/rostests/winetests/oleaut32/varformat.c trunk/rostests/winetests/oleaut32/vartype.c Modified: trunk/rostests/winetests/oleaut32/olepicture.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/olepicture.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/olepicture.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/olepicture.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -1056,7 +1056,9 @@ DWORD *mem; IPersistStream *src_stream; IStream *dst_stream; + LARGE_INTEGER offset; HRESULT hr; + LONG size; desc.cbSizeofstruct = sizeof(desc); desc.picType = PICTYPE_BITMAP; @@ -1077,6 +1079,27 @@ hmem = GlobalAlloc(GMEM_ZEROINIT, 4096); hr = CreateStreamOnHGlobal(hmem, FALSE, &dst_stream); ok(hr == S_OK, "createstreamonhglobal error %#x\n", hr); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); + ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine + ok(size == 66, "expected 66, got %d\n", size); + mem = GlobalLock(hmem); +todo_wine + ok(!memcmp(&mem[0], "BM", 2), "got wrong bmp header %04x\n", mem[0]); + GlobalUnlock(hmem); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); +todo_wine + ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); +todo_wine + ok(size == -1, "expected -1, got %d\n", size); + + offset.QuadPart = 0; + hr = IStream_Seek(dst_stream, offset, SEEK_SET, NULL); + ok(hr == S_OK, "IStream_Seek %#x\n", hr); hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); ok(hr == S_OK, "QueryInterface error %#x\n", hr); @@ -1109,7 +1132,9 @@ DWORD *mem; IPersistStream *src_stream; IStream *dst_stream; + LARGE_INTEGER offset; HRESULT hr; + LONG size; desc.cbSizeofstruct = sizeof(desc); desc.picType = PICTYPE_ICON; @@ -1129,6 +1154,27 @@ hmem = GlobalAlloc(GMEM_ZEROINIT, 8192); hr = CreateStreamOnHGlobal(hmem, FALSE, &dst_stream); ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); + ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine + ok(size == 766, "expected 766, got %d\n", size); + mem = GlobalLock(hmem); +todo_wine + ok(mem[0] == 0x00010000, "got wrong icon header %04x\n", mem[0]); + GlobalUnlock(hmem); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); +todo_wine + ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); +todo_wine + ok(size == -1, "expected -1, got %d\n", size); + + offset.QuadPart = 0; + hr = IStream_Seek(dst_stream, offset, SEEK_SET, NULL); + ok(hr == S_OK, "IStream_Seek %#x\n", hr); hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); ok(hr == S_OK, "QueryInterface error %#x\n", hr); @@ -1164,6 +1210,7 @@ IStream *dst_stream, *stream; LARGE_INTEGER offset; HRESULT hr; + LONG size; memset(&pic, 0, sizeof(pic)); desc.cbSizeofstruct = sizeof(desc); @@ -1173,7 +1220,7 @@ type = -1; hr = IPicture_get_Type(pic, &type); - ok(hr == S_OK,"get_Type error %#8x\n", hr); + ok(hr == S_OK, "get_Type error %#x\n", hr); ok(type == PICTYPE_NONE,"expected picture type PICTYPE_NONE, got %d\n", type); handle = (OLE_HANDLE)0xdeadbeef; @@ -1184,6 +1231,18 @@ hmem = GlobalAlloc(GMEM_ZEROINIT, 4096); hr = CreateStreamOnHGlobal(hmem, FALSE, &dst_stream); ok(hr == S_OK, "createstreamonhglobal error %#x\n", hr); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); + ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine + ok(size == -1, "expected -1, got %d\n", size); + + size = -1; + hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); + ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine + ok(size == -1, "expected -1, got %d\n", size); hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); ok(hr == S_OK, "QueryInterface error %#x\n", hr); Modified: trunk/rostests/winetests/oleaut32/safearray.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/safearray.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/safearray.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/safearray.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -1969,40 +1969,99 @@ static void test_SafeArrayDestroyData (void) { - SAFEARRAYBOUND sab; + SAFEARRAYBOUND sab[2]; SAFEARRAY *sa; HRESULT hres; int value = 0xdeadbeef; LONG index[1]; void *temp_pvData; - - sab.lLbound = 0; - sab.cElements = 10; - sa = SafeArrayCreate(VT_INT, 1, &sab); + USHORT features; + + sab[0].lLbound = 0; + sab[0].cElements = 10; + sa = SafeArrayCreate(VT_INT, 1, sab); ok(sa != NULL, "Create() failed.\n"); - if (!sa) - return; + ok(sa->fFeatures == FADF_HAVEVARTYPE, "got 0x%x\n", sa->fFeatures); + index[0] = 1; SafeArrayPutElement (sa, index, &value); /* SafeArrayDestroyData shouldn't free pvData if FADF_STATIC is set. */ - sa->fFeatures |= FADF_STATIC; + features = (sa->fFeatures |= FADF_STATIC); temp_pvData = sa->pvData; hres = SafeArrayDestroyData(sa); ok(hres == S_OK, "SADData FADF_STATIC failed, error code %x.\n",hres); + ok(features == sa->fFeatures, "got 0x%x\n", sa->fFeatures); ok(sa->pvData == temp_pvData, "SADData FADF_STATIC: pvData=%p, expected %p (fFeatures = %d).\n", sa->pvData, temp_pvData, sa->fFeatures); SafeArrayGetElement (sa, index, &value); ok(value == 0, "Data not cleared after SADData\n"); /* Clear FADF_STATIC, now really destroy the data. */ - sa->fFeatures ^= FADF_STATIC; + features = (sa->fFeatures ^= FADF_STATIC); hres = SafeArrayDestroyData(sa); ok(hres == S_OK, "SADData !FADF_STATIC failed, error code %x.\n",hres); + ok(features == sa->fFeatures, "got 0x%x\n", sa->fFeatures); ok(sa->pvData == NULL, "SADData !FADF_STATIC: pvData=%p, expected NULL.\n", sa->pvData); hres = SafeArrayDestroy(sa); ok(hres == S_OK, "SAD failed, error code %x.\n", hres); + + /* two dimensions */ + sab[0].lLbound = 0; + sab[0].cElements = 10; + sab[1].lLbound = 0; + sab[1].cElements = 10; + + sa = SafeArrayCreate(VT_INT, 2, sab); + ok(sa != NULL, "Create() failed.\n"); + ok(sa->fFeatures == FADF_HAVEVARTYPE, "got 0x%x\n", sa->fFeatures); + + features = sa->fFeatures; + hres = SafeArrayDestroyData(sa); + ok(hres == S_OK, "got 0x%08x\n",hres); + ok(features == sa->fFeatures, "got 0x%x\n", sa->fFeatures); + + SafeArrayDestroy(sa); + + /* try to destroy data from descriptor */ + hres = SafeArrayAllocDescriptor(1, &sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(sa->fFeatures == 0, "got 0x%x\n", sa->fFeatures); + + hres = SafeArrayDestroyData(sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(sa->fFeatures == 0, "got 0x%x\n", sa->fFeatures); + + hres = SafeArrayDestroyDescriptor(sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + + hres = SafeArrayAllocDescriptor(2, &sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(sa->fFeatures == 0, "got 0x%x\n", sa->fFeatures); + + hres = SafeArrayDestroyData(sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(sa->fFeatures == 0, "got 0x%x\n", sa->fFeatures); + + hres = SafeArrayDestroyDescriptor(sa); + ok(hres == S_OK, "got 0x%08x\n", hres); + + /* vector case */ + sa = SafeArrayCreateVector(VT_I4, 0, 10); + ok(sa != NULL, "got %p\n", sa); + ok(sa->fFeatures == (FADF_CREATEVECTOR|FADF_HAVEVARTYPE), "got 0x%x\n", sa->fFeatures); + + ok(sa->pvData != NULL, "got %p\n", sa->pvData); + hres = SafeArrayDestroyData(sa); + ok(hres == S_OK, "got 0x%08x\n", hres); +todo_wine + ok(sa->fFeatures == FADF_HAVEVARTYPE, "got 0x%x\n", sa->fFeatures); + ok(sa->pvData != NULL, "got %p\n", sa->pvData); + /* There seems to be a bug on windows, especially visible on 64bit systems, + probably double-free of similar issue. */ + sa->pvData = NULL; + SafeArrayDestroy(sa); } static void test_safearray_layout(void) Modified: trunk/rostests/winetests/oleaut32/test_reg.idl URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/test_reg.idl?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/test_reg.idl [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/test_reg.idl [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -141,6 +141,8 @@ LONG testprop([in] LONG *i); [propputref, id(2)] LONG testprop2([in] IUnknown *i); + [id(3)] + HRESULT testfunc([in] int i, [out, retval] int *p); } /* uuid is same as for test_struct2 in test_tlb.idl, fields are different */ Modified: trunk/rostests/winetests/oleaut32/tmarshal.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/tmarshal.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/tmarshal.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/tmarshal.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -919,11 +919,10 @@ } static HRESULT WINAPI Widget_Coclass( - IWidget *iface, - ApplicationObject2 *p) -{ - trace("Coclass(%p)\n", p); - ok(p == (ApplicationObject2 *)iface, "expected p == %p, got %p\n", iface, p); + IWidget *iface, ApplicationObject2 *param) +{ + trace("Coclass(%p)\n", param); + ok(param == (ApplicationObject2 *)iface, "expected param == %p, got %p\n", iface, param); return S_OK; } @@ -1515,7 +1514,7 @@ ok(V_VT(&varresult) == VT_DISPATCH, "V_VT(&varresult) was %d instead of VT_DISPATCH\n", V_VT(&varresult)); ok(V_DISPATCH(&varresult) != NULL, "expected V_DISPATCH(&varresult) != NULL\n"); - /* call CoClass with VT_DISPATCH type */ + /* call Coclass with VT_DISPATCH type */ vararg[0] = varresult; dispparams.cNamedArgs = 0; dispparams.rgdispidNamedArgs = NULL; Modified: trunk/rostests/winetests/oleaut32/tmarshal.idl URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/tmarshal.idl?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/tmarshal.idl [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/tmarshal.idl [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -187,7 +187,7 @@ HRESULT VarArg_Ref_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) *params, [out, retval] VARIANT *result); [id(DISPID_TM_COCLASS)] - HRESULT Coclass([in] ApplicationObject2 *p); + HRESULT Coclass([in] ApplicationObject2 *param); } [ Modified: trunk/rostests/winetests/oleaut32/typelib.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/typelib.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/typelib.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/typelib.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -39,6 +39,7 @@ //#include "ocidl.h" //#include "shlwapi.h" #include <tmarshal.h> +#include <olectl.h> #include <test_reg.h> #include <test_tlb.h> @@ -158,6 +159,12 @@ return 6; } +static HRESULT WINAPI invoketest_testfunc(IInvokeTest *iface, int i, int *p) +{ + *p = i+1; + return S_OK; +} + static const IInvokeTestVtbl invoketestvtbl = { invoketest_QueryInterface, invoketest_AddRef, @@ -168,7 +175,8 @@ invoketest_Invoke, invoketest_get_test, invoketest_putref_testprop, - invoketest_putref_testprop2 + invoketest_putref_testprop2, + invoketest_testfunc }; static IInvokeTest invoketest = { &invoketestvtbl }; @@ -204,7 +212,8 @@ hRes = ITypeLib_GetTypeInfo(iface, 1, &iti1); ok(hRes == S_OK, "ITypeLib_GetTypeInfo failed on index = 1\n"); - ok(ref_count=ITypeLib_Release(iface) > 0, "ITypeLib destroyed while ITypeInfo has back pointer\n"); + ref_count = ITypeLib_Release(iface); + ok(ref_count > 0, "ITypeLib destroyed while ITypeInfo has back pointer\n"); if(!ref_count) return; @@ -669,6 +678,33 @@ CloseHandle( file ); } +static void test_invoke_func(ITypeInfo *typeinfo) +{ + DISPID named_args[3] = { DISPID_THIS }; + VARIANT args[3], res; + DISPPARAMS dp = {args, named_args, 1, 0}; + UINT i; + HRESULT hres; + + V_VT(args) = VT_INT; + V_INT(args) = 3; + V_VT(&res) = VT_ERROR; + hres = ITypeInfo_Invoke(typeinfo, &invoketest, 3, DISPATCH_METHOD, &dp, &res, NULL, &i); + ok(hres == S_OK, "got 0x%08x\n", hres); + ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res)); + ok(V_I4(&res) == 4, "got %d\n", V_I4(&res)); + + V_VT(args) = VT_DISPATCH; + V_DISPATCH(args) = (IDispatch*)&invoketest; + V_VT(args+1) = VT_INT; + V_INT(args+1) = 3; + V_VT(&res) = VT_ERROR; + dp.cNamedArgs = 1; + dp.cArgs = 2; + hres = ITypeInfo_Invoke(typeinfo, &invoketest, 3, DISPATCH_METHOD, &dp, &res, NULL, &i); + ok(hres == DISP_E_BADPARAMCOUNT, "got 0x%08x\n", hres); +} + static const char *create_test_typelib(int res_no) { static char filename[MAX_PATH]; @@ -960,6 +996,8 @@ V_I4(&res) = 0; hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 2, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i); ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x, %d\n", hr, i); + + test_invoke_func(pTypeInfo); ITypeInfo_Release(pTypeInfo); ITypeLib_Release(pTypeLib); @@ -1621,7 +1659,6 @@ static OLECHAR dualW[] = {'d','u','a','l',0}; static OLECHAR coclassW[] = {'c','o','c','l','a','s','s',0}; static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0}; - static const WCHAR defaultQW[] = {'d','e','f','a','u','l','t','?',0}; static OLECHAR func1W[] = {'f','u','n','c','1',0}; static OLECHAR func2W[] = {'f','u','n','c','2',0}; static OLECHAR prop1W[] = {'P','r','o','p','1',0}; @@ -1633,6 +1670,7 @@ static OLECHAR *names1[] = {func1W, param1W, param2W}; static OLECHAR *names2[] = {func2W, param1W, param2W}; static OLECHAR *propname[] = {prop1W, param1W}; + static const GUID tlcustguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x69}}; static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}}; static const GUID bogusguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x71}}; static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}}; @@ -1644,6 +1682,7 @@ ICreateTypeInfo *createti; ICreateTypeInfo2 *createti2; ITypeLib *tl, *stdole; + ITypeLib2 *tl2; ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti; ITypeInfo *tinfos[2]; ITypeInfo2 *ti2; @@ -1666,6 +1705,8 @@ TYPEKIND kind; DESCKIND desckind; BINDPTR bindptr; + char nameA[16]; + WCHAR nameW[16]; switch(sys){ case SYS_WIN32: @@ -1760,6 +1801,23 @@ SysFreeString(name); SysFreeString(helpfile); + V_VT(&cust_data) = VT_I4; + V_I4(&cust_data) = 1; + hres = ICreateTypeLib2_SetCustData(createtl, &tlcustguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + + hres = ITypeLib_QueryInterface(tl, &IID_ITypeLib2, (void**)&tl2); + ok(hres == S_OK, "no ITypeLib2 interface (%x)\n", hres); + + V_VT(&cust_data) = VT_EMPTY; + V_I4(&cust_data) = 0; + hres = ITypeLib2_GetCustData(tl2, &tlcustguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + ok(V_VT(&cust_data) == VT_I4, "V_VT(&cust_data) = %d\n", V_VT(&cust_data)); + ok(V_I4(&cust_data) == 1, "V_I4(&cust_data) = %d\n", V_I4(&cust_data)); + + ITypeLib2_Release(tl2); + /* invalid parameters */ hres = ICreateTypeLib2_CreateTypeInfo(createtl, NULL, TKIND_INTERFACE, &createti); ok(hres == E_INVALIDARG, "got %08x\n", hres); @@ -2162,6 +2220,9 @@ ok(hres == S_OK, "got %08x\n", hres); SysFreeString(V_BSTR(¶mdescex.varDefaultValue)); + WideCharToMultiByte(CP_ACP, 0, defaultW, -1, nameA, sizeof(nameA), NULL, NULL); + MultiByteToWideChar(CP_ACP, 0, nameA, -1, nameW, sizeof(nameW)/sizeof(nameW[0])); + hres = ITypeInfo2_GetFuncDesc(ti2, 3, &pfuncdesc); ok(hres == S_OK, "got %08x\n", hres); @@ -2187,7 +2248,7 @@ U(*edesc).paramdesc.pparamdescex->cBytes); ok(V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n", V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue)); - ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), defaultQW), + ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), nameW), "got: %s\n", wine_dbgstr_w(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue))); @@ -2199,7 +2260,7 @@ U(*edesc).paramdesc.pparamdescex->cBytes); ok(V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n", V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue)); - ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), defaultQW), + ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), nameW), "got: %s\n", wine_dbgstr_w(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue))); @@ -2821,6 +2882,16 @@ SysFreeString(name); SysFreeString(helpfile); + hres = ITypeLib_QueryInterface(tl, &IID_ITypeLib2, (void**)&tl2); + ok(hres == S_OK, "no ITypeLib2 interface (%x)\n", hres); + V_VT(&cust_data) = VT_EMPTY; + V_I4(&cust_data) = 0; + hres = ITypeLib2_GetCustData(tl2, &tlcustguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + ok(V_VT(&cust_data) == VT_I4, "V_VT(&cust_data) = %d\n", V_VT(&cust_data)); + ok(V_I4(&cust_data) == 1, "V_I4(&cust_data) = %d\n", V_I4(&cust_data)); + ITypeLib2_Release(tl2); + hres = ITypeLib_GetTypeInfo(tl, 0, &ti); ok(hres == S_OK, "got %08x\n", hres); @@ -2985,7 +3056,7 @@ U(*edesc).paramdesc.pparamdescex->cBytes); ok(V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n", V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue)); - ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), defaultQW), + ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), nameW), "got: %s\n", wine_dbgstr_w(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue))); @@ -2997,7 +3068,7 @@ U(*edesc).paramdesc.pparamdescex->cBytes); ok(V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n", V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue)); - ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), defaultQW), + ok(!lstrcmpW(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue), nameW), "got: %s\n", wine_dbgstr_w(V_BSTR(&U(*edesc).paramdesc.pparamdescex->varDefaultValue))); @@ -5591,6 +5662,11 @@ ok(hr == TYPE_E_LIBNOTREGISTERED || broken(hr == S_OK) /* winxp */, "got 0x%08x\n", hr); SysFreeString(path); + path = NULL; + hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 0xffff, 0xffff, LOCALE_NEUTRAL, &path); + ok(hr == S_OK, "got 0x%08x\n", hr); + SysFreeString(path); + /* manifest version is 2.0, actual is 1.0 */ hr = LoadRegTypeLib(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, &tl); ok(hr == TYPE_E_LIBNOTREGISTERED || broken(hr == S_OK) /* winxp */, "got 0x%08x\n", hr); @@ -5635,6 +5711,20 @@ hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 7, LOCALE_NEUTRAL, &tl); ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08x\n", hr); + + hr = LoadRegTypeLib(&LIBID_TestTypelib, 0xffff, 0xffff, LOCALE_NEUTRAL, &tl); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = ITypeLib_GetLibAttr(tl, &attr); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok(attr->lcid == 0, "got %x\n", attr->lcid); + ok(attr->wMajorVerNum == 2, "got %d\n", attr->wMajorVerNum); + ok(attr->wMinorVerNum == 5, "got %d\n", attr->wMinorVerNum); + ok(attr->wLibFlags == LIBFLAG_FHASDISKIMAGE, "got %x\n", attr->wLibFlags); + + ITypeLib_ReleaseTLibAttr(tl, attr); + ITypeLib_Release(tl); DeleteFileA("test_actctx_tlb.tlb"); DeleteFileA("test_actctx_tlb2.tlb"); Modified: trunk/rostests/winetests/oleaut32/usrmarshal.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/usrmarshal.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/usrmarshal.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/usrmarshal.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -282,6 +282,7 @@ ok(lpsa2->cLocks == 0, "got lock count %u, expected 0\n", lpsa2->cLocks); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); + ok(!lpsa2, "lpsa2 was not set to 0 by LPSAFEARRAY_UserFree\n"); HeapFree(GetProcessHeap(), 0, buffer); lpsa->cLocks = 0; hr = SafeArrayDestroy(lpsa); @@ -771,10 +772,10 @@ double d; void *mem; DWORD *wirev; - BSTR b; + BSTR b, b2; WCHAR str[] = {'m','a','r','s','h','a','l',' ','t','e','s','t',0}; SAFEARRAYBOUND sab; - LPSAFEARRAY lpsa; + LPSAFEARRAY lpsa, lpsa2, lpsa_copy; DECIMAL dec, dec2; HeapUnknown *heap_unknown; DWORD expected; @@ -1241,15 +1242,21 @@ ok(*wirev, "wv[6] %08x\n", *wirev); /* win2k: this is b. winxp: this is (char*)b + 1 */ wirev++; check_bstr(wirev, b); - VariantInit(&v2); - stubMsg.Buffer = buffer; - next = VARIANT_UserUnmarshal(&umcb.Flags, buffer, &v2); - ok(next == buffer + stubMsg.BufferLength, "got %p expect %p\n", next, buffer + stubMsg.BufferLength); + b2 = SysAllocString(str); + b2[0] = 0; + V_VT(&v2) = VT_BSTR | VT_BYREF; + V_BSTRREF(&v2) = &b2; + mem = b2; + VariantInit(&v2); + stubMsg.Buffer = buffer; + next = VARIANT_UserUnmarshal(&umcb.Flags, buffer, &v2); + ok(next == buffer + stubMsg.BufferLength, "got %p expect %p\n", next, buffer + stubMsg.BufferLength); + ok(mem == b2, "BSTR should be reused\n"); ok(V_VT(&v) == V_VT(&v2), "got vt %d expect %d\n", V_VT(&v), V_VT(&v2)); ok(SysStringByteLen(*V_BSTRREF(&v)) == SysStringByteLen(*V_BSTRREF(&v2)), "bstr string lens differ\n"); ok(!memcmp(*V_BSTRREF(&v), *V_BSTRREF(&v2), SysStringByteLen(*V_BSTRREF(&v))), "bstrs differ\n"); - VARIANT_UserFree(&umcb.Flags, &v2); + SysFreeString(b2); HeapFree(GetProcessHeap(), 0, oldbuffer); SysFreeString(b); @@ -1341,6 +1348,59 @@ } VARIANT_UserFree(&umcb.Flags, &v2); HeapFree(GetProcessHeap(), 0, oldbuffer); + + /*** ARRAY BYREF ***/ + VariantInit(&v); + V_VT(&v) = VT_UI4 | VT_ARRAY | VT_BYREF; + V_ARRAYREF(&v) = &lpsa; + lpsa->fFeatures |= FADF_STATIC; + + rpcMsg.BufferLength = stubMsg.BufferLength = VARIANT_UserSize(&umcb.Flags, 0, &v); + expected = 152; + ok(stubMsg.BufferLength == expected || stubMsg.BufferLength == expected + 16, /* win64 */ + "size %u instead of %u\n", stubMsg.BufferLength, expected); + buffer = rpcMsg.Buffer = stubMsg.Buffer = stubMsg.BufferStart = alloc_aligned(stubMsg.BufferLength, &oldbuffer); + stubMsg.BufferEnd = stubMsg.Buffer + stubMsg.BufferLength; + next = VARIANT_UserMarshal(&umcb.Flags, buffer, &v); + ok(next == buffer + expected, "got %p expect %p\n", next, buffer + expected); + wirev = (DWORD*)buffer; + + wirev = check_variant_header(wirev, &v, expected); + ok(*wirev == 4, "wv[5] %08x\n", *wirev); + wirev++; + ok(*wirev, "wv[6] %08x\n", *wirev); /* win2k: this is lpsa. winxp: this is (char*)lpsa + 1 */ + wirev++; + check_safearray(wirev, lpsa); + lpsa_copy = lpsa2 = SafeArrayCreate(VT_I8, 1, &sab); + /* set FADF_STATIC feature to make sure lpsa2->pvData pointer changes if new data buffer is allocated */ + lpsa2->fFeatures |= FADF_STATIC; + mem = lpsa2->pvData; + V_VT(&v2) = VT_UI4 | VT_ARRAY | VT_BYREF; + V_ARRAYREF(&v2) = &lpsa2; + stubMsg.Buffer = buffer; + next = VARIANT_UserUnmarshal(&umcb.Flags, buffer, &v2); + ok(next == buffer + expected, "got %p expect %p\n", next, buffer + expected); + ok(V_VT(&v) == V_VT(&v2), "got vt %d expect %d\n", V_VT(&v), V_VT(&v2)); + ok(lpsa2 == lpsa_copy, "safearray should be reused\n"); + ok(mem == lpsa2->pvData, "safearray data should be reused\n"); + ok(SafeArrayGetDim(*V_ARRAYREF(&v)) == SafeArrayGetDim(*V_ARRAYREF(&v2)), "array dims differ\n"); + SafeArrayGetLBound(*V_ARRAYREF(&v), 1, &bound); + SafeArrayGetLBound(*V_ARRAYREF(&v2), 1, &bound2); + ok(bound == bound2, "array lbounds differ\n"); + SafeArrayGetUBound(*V_ARRAYREF(&v), 1, &bound); + SafeArrayGetUBound(*V_ARRAYREF(&v2), 1, &bound2); + ok(bound == bound2, "array ubounds differ\n"); + if (pSafeArrayGetVartype) + { + pSafeArrayGetVartype(*V_ARRAYREF(&v), &vt); + pSafeArrayGetVartype(*V_ARRAYREF(&v2), &vt2); + ok(vt == vt2, "array vts differ %x %x\n", vt, vt2); + } + lpsa2->fFeatures &= ~FADF_STATIC; + hr = SafeArrayDestroy(*V_ARRAYREF(&v2)); + ok(hr == S_OK, "got 0x%08x\n", hr); + HeapFree(GetProcessHeap(), 0, oldbuffer); + lpsa->fFeatures &= ~FADF_STATIC; hr = SafeArrayDestroy(lpsa); ok(hr == S_OK, "got 0x%08x\n", hr); Modified: trunk/rostests/winetests/oleaut32/varformat.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/varformat.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/varformat.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/varformat.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -562,6 +562,88 @@ } } +static void test_VarFormatFromTokens(void) +{ + static WCHAR number_fmt[] = {'#','#','#',',','#','#','0','.','0','0',0}; + static const WCHAR number[] = {'6',',','9','0',0}; + static const WCHAR number_us[] = {'6','9','0','.','0','0',0}; + + static WCHAR date_fmt[] = {'d','d','-','m','m',0}; + static const WCHAR date[] = {'1','2','-','1','1',0}; + static const WCHAR date_us[] = {'1','1','-','1','2',0}; + + static WCHAR string_fmt[] = {'@',0}; + static const WCHAR string_de[] = {'1',',','5',0}; + static const WCHAR string_us[] = {'1','.','5',0}; + + BYTE buff[256]; + LCID lcid; + VARIANT var; + BSTR bstr; + HRESULT hres; + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(number); + + lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + hres = VarTokenizeFormatString(number_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, number_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, number_us), "incorrectly formatted number: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + lcid = MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT); + hres = VarTokenizeFormatString(number_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, number_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, number), "incorrectly formatted number: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + VariantClear(&var); + + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(date); + + lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + hres = VarTokenizeFormatString(date_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, date_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, date_us), "incorrectly formatted date: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + lcid = MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT); + hres = VarTokenizeFormatString(date_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, date_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, date), "incorrectly formatted date: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + VariantClear(&var); + + V_VT(&var) = VT_R4; + V_R4(&var) = 1.5; + + lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + hres = VarTokenizeFormatString(string_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, string_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, string_us), "incorrectly formatted string: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + lcid = MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT); + hres = VarTokenizeFormatString(string_fmt, buff, sizeof(buff), 1, 1, lcid, NULL); + ok(hres == S_OK, "VarTokenizeFormatString failed: %x\n", hres); + hres = VarFormatFromTokens(&var, string_fmt, buff, 0, &bstr, lcid); + ok(hres == S_OK, "VarFormatFromTokens failed: %x\n", hres); + ok(!strcmpW(bstr, string_de), "incorrectly formatted string: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); +} + START_TEST(varformat) { hOleaut32 = GetModuleHandleA("oleaut32.dll"); @@ -571,4 +653,5 @@ test_VarFormatNumber(); test_VarFormat(); test_VarWeekdayName(); + test_VarFormatFromTokens(); } Modified: trunk/rostests/winetests/oleaut32/vartype.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/oleaut32/vartype.c?rev=70904&r1=70903&r2=70904&view=diff ============================================================================== --- trunk/rostests/winetests/oleaut32/vartype.c [iso-8859-1] (original) +++ trunk/rostests/winetests/oleaut32/vartype.c [iso-8859-1] Fri Mar 4 09:33:46 2016 @@ -5403,9 +5403,12 @@ if (str) { LPINTERNAL_BSTR bstr = Get(str); + DWORD_PTR p = (DWORD_PTR)str; + int align = sizeof(void *); ok (bstr->dwLen == 8, "Expected 8, got %d\n", bstr->dwLen); ok (!lstrcmpW(bstr->szString, szTest), "String different\n"); + ok ((p & ~(align-1)) == p, "Not aligned to %d\n", align); SysFreeString(str); } } @@ -5449,7 +5452,9 @@ { const OLECHAR szTest[10] = { 'T','e','s','t','\0' }; const CHAR szTestA[6] = { 'T','e','s','t','\0','?' }; + char *buf; BSTR str; + int i; if (sizeof(void *) == 4) /* not limited to 0x80000000 on Win64 */ { @@ -5492,6 +5497,7 @@ ok (bstr->dwLen == 3, "Expected 3, got %d\n", bstr->dwLen); ok (!lstrcmpA((LPCSTR)bstr->szString, szTestTruncA), "String different\n"); + ok (!bstr->szString[2], "String not terminated\n"); SysFreeString(str); } @@ -5505,6 +5511,32 @@ ok (!lstrcmpW(bstr->szString, szTest), "String different\n"); SysFreeString(str); } + + /* Make sure terminating null is aligned properly */ + buf = HeapAlloc(GetProcessHeap(), 0, 1025); + ok (buf != NULL, "Expected non-NULL\n"); + for (i = 0; i < 1024; i++) + { + LPINTERNAL_BSTR bstr; + + str = SysAllocStringByteLen(NULL, i); + ok (str != NULL, "Expected non-NULL\n"); + bstr = Get(str); + ok (bstr->dwLen == i, "Expected %d, got %d\n", i, bstr->dwLen); + ok (!bstr->szString[(i+sizeof(WCHAR)-1)/sizeof(WCHAR)], "String not terminated\n"); + SysFreeString(str); + + memset(buf, 0xaa, 1025); + str = SysAllocStringByteLen(buf, i); + ok (str != NULL, "Expected non-NULL\n"); + bstr = Get(str); + ok (bstr->dwLen == i, "Expected %d, got %d\n", i, bstr->dwLen); + buf[i] = 0; + ok (!lstrcmpA((LPCSTR)bstr->szString, buf), "String different\n"); + ok (!bstr->szString[(i+sizeof(WCHAR)-1)/sizeof(WCHAR)], "String not terminated\n"); + SysFreeString(str); + } + HeapFree(GetProcessHeap(), 0, buf); } static void test_SysReAllocString(void) @@ -6342,9 +6374,15 @@ ok(str == str2, "str != str2\n"); SysFreeString(str2); - /* Fill the bucket with cached entries. */ + /* Fill the bucket with cached entries. + We roll our own, to show that the cache doesn't use + the bstr length field to determine bucket allocation. */ for(i=0; i < sizeof(strs)/sizeof(*strs); i++) - strs[i] = SysAllocStringLen(NULL, 24); + { + DWORD_PTR *ptr = CoTaskMemAlloc(64); + ptr[0] = 0; + strs[i] = (BSTR)(ptr + 1); + } for(i=0; i < sizeof(strs)/sizeof(*strs); i++) SysFreeString(strs[i]);