safearray.c

来自「Wine-20031016」· C语言 代码 · 共 409 行 · 第 1/2 页

C
409
字号
	hres = SafeArrayGetElement(a, indices, &i);	ok(S_OK == hres,"SAGE failed [42,23], hres 0x%lx",hres);	hres = SafeArrayAccessData(a, (void**)&ptr1);	ok(S_OK == hres, "SAAD failed with 0x%lx", hres);	indices[0] = 3;	indices[1] = 23;	hres = SafeArrayPtrOfIndex(a, indices, (void**)&ptr2);	ok(S_OK == hres,"SAPOI failed [1,23], hres 0x%lx",hres);	ok(ptr2 - ptr1 == 8,"ptr difference is not 8, but %d (%p vs %p)", ptr2-ptr1, ptr2, ptr1);	indices[0] = 3;	indices[1] = 24;	hres = SafeArrayPtrOfIndex(a, indices, (void**)&ptr2);	ok(S_OK == hres,"SAPOI failed [5,24], hres 0x%lx",hres);	ok(ptr2 - ptr1 == 176,"ptr difference is not 176, but %d (%p vs %p)", ptr2-ptr1, ptr2, ptr1);	indices[0] = 20;	indices[1] = 23;	hres = SafeArrayPtrOfIndex(a, indices, (void**)&ptr2);	ok(S_OK == hres,"SAPOI failed [20,23], hres 0x%lx",hres);	ok(ptr2 - ptr1 == 76,"ptr difference is not 176, but %d (%p vs %p)", ptr2-ptr1, ptr2, ptr1);	hres = SafeArrayUnaccessData(a);	ok(S_OK == hres, "SAUAD failed with 0x%lx", hres);	for (i=0;i<sizeof(vttypes)/sizeof(vttypes[0]);i++) {		a = SafeArrayCreate(vttypes[i].vt, 1, &bound);		ok(	((a == NULL) && (vttypes[i].elemsize == 0)) ||			((a != NULL) && (vttypes[i].elemsize == a->cbElements)),		"SAC(%d,1,[1,0]), result %ld, expected %d",vttypes[i].vt,(a?a->cbElements:0),vttypes[i].elemsize		);        if (a!=NULL) {			ok(a->fFeatures == (vttypes[i].expflags | vttypes[i].addflags),               "SAC of %d returned feature flags %x, expected %x",               vttypes[i].vt, a->fFeatures,               vttypes[i].expflags|vttypes[i].addflags);    		ok(SafeArrayGetElemsize(a) == vttypes[i].elemsize,               "SAGE for vt %d returned elemsize %d instead of expected %d",               vttypes[i].vt, SafeArrayGetElemsize(a),vttypes[i].elemsize);        }		if (!a) continue;        if (pSafeArrayGetVartype) {            hres = pSafeArrayGetVartype(a, &vt);            ok(hres == S_OK, "SAGVT of arra y with vt %d failed with %lx", vttypes[i].vt, hres);            if (vttypes[i].vt == VT_DISPATCH) {        		/* Special case. Checked against Windows. */		        ok(vt == VT_UNKNOWN, "SAGVT of a        rray with VT_DISPATCH returned not VT_UNKNOWN, but %d", vt);            } else {		        ok(vt == vttypes[i].vt, "SAGVT of array with vt %d returned %d", vttypes[i].vt, vt);            }        }		hres = SafeArrayCopy(a, &c);		ok(hres == S_OK, "failed to copy safearray of vt %d with hres %lx", vttypes[i].vt, hres);		ok(vttypes[i].elemsize == c->cbElements,"copy of SAC(%d,1,[1,0]), result %ld, expected %d",vttypes[i].vt,(c?c->cbElements:0),vttypes[i].elemsize		);		ok(c->fFeatures == (vttypes[i].expflags | vttypes[i].addflags),"SAC of %d returned feature flags %x, expected %x", vttypes[i].vt, c->fFeatures, vttypes[i].expflags|vttypes[i].addflags);		ok(SafeArrayGetElemsize(c) == vttypes[i].elemsize,"SAGE for vt %d returned elemsize %d instead of expected %d",vttypes[i].vt, SafeArrayGetElemsize(c),vttypes[i].elemsize);        if (pSafeArrayGetVartype) {            hres = pSafeArrayGetVartype(c, &vt);            ok(hres == S_OK, "SAGVT of array with vt %d failed with %lx", vttypes[i].vt, hres);            if (vttypes[i].vt == VT_DISPATCH) {                /* Special case. Checked against Windows. */                ok(vt == VT_UNKNOWN, "SAGVT of array with VT_DISPATCH returned not VT_UNKNOWN, but %d", vt);            } else {                ok(vt == vttypes[i].vt, "SAGVT of array with vt %d returned %d", vttypes[i].vt, vt);            }        }        if (pSafeArrayCopyData) {            hres = pSafeArrayCopyData(a, c);            ok(hres == S_OK, "failed to copy safearray data of vt %d with hres %lx", vttypes[i].vt, hres);            hres = SafeArrayDestroyData(c);            ok(hres == S_OK,"SADD of copy of array with vt %d failed with hres %lx", vttypes[i].vt, hres);        }		hres = SafeArrayDestroy(a);		ok(hres == S_OK,"SAD of array with vt %d failed with hres %lx", vttypes[i].vt, hres);	}	/* Test conversion of type|VT_ARRAY <-> VT_BSTR */	bound.lLbound = 0;	bound.cElements = 10;	a = SafeArrayCreate(VT_UI1, 1, &bound);	ok(a != NULL, "SAC failed.");	ok(S_OK == SafeArrayAccessData(a, &data),"SACD failed");	memcpy(data,"Hello World",10);	ok(S_OK == SafeArrayUnaccessData(a),"SAUD failed");	V_VT(&v) = VT_ARRAY|VT_UI1;	V_ARRAY(&v) = a;	hres = VariantChangeTypeEx(&v, &v, 0, 0, VT_BSTR);	ok(hres==S_OK, "CTE VT_ARRAY|VT_UI1 -> VT_BSTR failed with %lx",hres);	ok(V_VT(&v) == VT_BSTR,"CTE VT_ARRAY|VT_UI1 -> VT_BSTR did not return VT_BSTR, but %d.",V_VT(&v));	ok(V_BSTR(&v)[0] == 0x6548,"First letter are not 'He', but %x", V_BSTR(&v)[0]);	/* check locking functions */	a = SafeArrayCreate(VT_I4, 1, &bound);	ok(a!=NULL,"SAC should not fail");	hres = SafeArrayAccessData(a, &data);	ok(hres == S_OK,"SAAD failed with hres %lx",hres);	hres = SafeArrayDestroy(a);	ok(hres == DISP_E_ARRAYISLOCKED,"locked safe array destroy not failed with DISP_E_ARRAYISLOCKED, but with hres %lx", hres);	hres = SafeArrayDestroyData(a);	ok(hres == DISP_E_ARRAYISLOCKED,"locked safe array destroy data not failed with DISP_E_ARRAYISLOCKED, but with hres %lx", hres);	hres = SafeArrayDestroyDescriptor(a);	ok(hres == DISP_E_ARRAYISLOCKED,"locked safe array destroy descriptor not failed with DISP_E_ARRAYISLOCKED, but with hres %lx", hres);	hres = SafeArrayUnaccessData(a);	ok(hres == S_OK,"SAUD failed after lock/destroy test");	hres = SafeArrayDestroy(a);	ok(hres == S_OK,"SAD failed after lock/destroy test");	/* Test if we need to destroy data before descriptor */	a = SafeArrayCreate(VT_I4, 1, &bound);	ok(a!=NULL,"SAC should not fail");	hres = SafeArrayDestroyDescriptor(a);	ok(hres == S_OK,"SADD with data in array failed with hres %lx",hres);	/* IID functions */	/* init a small stack safearray */    if (pSafeArraySetIID) {        memset(&b, 0, sizeof(b));        b.cDims = 1;        memset(&iid, 0x42, sizeof(IID));        hres = pSafeArraySetIID(&b,&iid);        ok(hres == E_INVALIDARG,"SafeArraySetIID of non IID capable safearray did not return E_INVALIDARG, but %lx",hres);        hres = SafeArrayAllocDescriptor(1,&a);        ok((a->fFeatures & FADF_HAVEIID) == 0,"newly allocated descriptor with SAAD should not have FADF_HAVEIID");        hres = pSafeArraySetIID(a,&iid);        ok(hres == E_INVALIDARG,"SafeArraySetIID of newly allocated descriptor with SAAD should return E_INVALIDARG, but %lx",hres);    }    if (!pSafeArrayAllocDescriptorEx)        return;	for (i=0;i<sizeof(vttypes)/sizeof(vttypes[0]);i++) {		hres = pSafeArrayAllocDescriptorEx(vttypes[i].vt,1,&a);		ok(a->fFeatures == vttypes[i].expflags,"SAADE(%d) resulted with flags %x, expected %x\n", vttypes[i].vt, a->fFeatures, vttypes[i].expflags);		if (a->fFeatures & FADF_HAVEIID) {			hres = pSafeArrayGetIID(a, &iid);			ok(hres == S_OK,"SAGIID failed for vt %d with hres %lx", vttypes[i].vt,hres);			switch (vttypes[i].vt) {			case VT_UNKNOWN:				ok(IsEqualGUID(((GUID*)a)-1,&IID_IUnknown),"guid for VT_UNKNOWN is not IID_IUnknown");				ok(IsEqualGUID(&iid, &IID_IUnknown),"SAGIID returned wrong GUID for IUnknown");				break;			case VT_DISPATCH:				ok(IsEqualGUID(((GUID*)a)-1,&IID_IDispatch),"guid for VT_UNKNOWN is not IID_IDispatch");				ok(IsEqualGUID(&iid, &IID_IDispatch),"SAGIID returned wrong GUID for IDispatch");				break;			default:				ok(FALSE,"unknown vt %d with FADF_HAVEIID",vttypes[i].vt);				break;			}		} else {			hres = pSafeArrayGetIID(a, &iid);			ok(hres == E_INVALIDARG,"SAGIID did not fail for vt %d with hres %lx", vttypes[i].vt,hres);		}		if (a->fFeatures & FADF_RECORD) {			ok(vttypes[i].vt == VT_RECORD,"FADF_RECORD for non record %d",vttypes[i].vt);		}		if (a->fFeatures & FADF_HAVEVARTYPE) {			ok(vttypes[i].vt == ((DWORD*)a)[-1], "FADF_HAVEVARTYPE set, but vt %d mismatch stored %ld",vttypes[i].vt,((DWORD*)a)[-1]);		}		hres = pSafeArrayGetVartype(a, &vt);		ok(hres == S_OK, "SAGVT of array with vt %d failed with %lx", vttypes[i].vt, hres);		if (vttypes[i].vt == VT_DISPATCH) {			/* Special case. Checked against Windows. */			ok(vt == VT_UNKNOWN, "SAGVT of array with VT_DISPATCH returned not VT_UNKNOWN, but %d", vt);		} else {			ok(vt == vttypes[i].vt, "SAGVT of array with vt %d returned %d", vttypes[i].vt, vt);		}		if (a->fFeatures & FADF_HAVEIID) {			hres = pSafeArraySetIID(a, &IID_IStorage); /* random IID */			ok(hres == S_OK,"SASIID failed with FADF_HAVEIID set for vt %d with %lx", vttypes[i].vt, hres);			hres = pSafeArrayGetIID(a, &iid);			ok(hres == S_OK,"SAGIID failed with FADF_HAVEIID set for vt %d with %lx", vttypes[i].vt, hres);			ok(IsEqualGUID(&iid, &IID_IStorage),"returned iid is not IID_IStorage");		} else {			hres = pSafeArraySetIID(a, &IID_IStorage); /* random IID */			ok(hres == E_INVALIDARG,"SASIID did not failed with !FADF_HAVEIID set for vt %d with %lx", vttypes[i].vt, hres);		}		hres = SafeArrayDestroyDescriptor(a);		ok(hres == S_OK,"SADD failed with hres %lx",hres);	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?