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 + -
显示快捷键?