oledb32: Support VT_NULL on all conversions.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alistair Leslie-Hughes 2015-10-28 14:54:07 +11:00 committed by Alexandre Julliard
parent 39d2ce5956
commit 0edd515b95
2 changed files with 211 additions and 51 deletions

View File

@ -183,6 +183,15 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return S_OK;
}
if(src_type == DBTYPE_VARIANT && V_VT((VARIANT*)src) == VT_NULL)
{
if(dst_type == DBTYPE_VARIANT)
*dst_len = sizeof(VARIANT);
*dst_status = DBSTATUS_S_ISNULL;
return S_OK;
}
if(IDataConvert_CanConvert(iface, src_type, dst_type) != S_OK)
{
return DB_E_UNSUPPORTEDCONVERSION;
@ -631,18 +640,9 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
}
break;
case DBTYPE_VARIANT:
if(V_VT((VARIANT*)src) == VT_NULL)
{
*dst_status = DBSTATUS_S_ISNULL;
*dst_len = get_length(DBTYPE_BSTR);
return S_OK;
}
else
{
VariantInit(&tmp);
if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
*d = V_BSTR(&tmp);
}
VariantInit(&tmp);
if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
*d = V_BSTR(&tmp);
break;
default: FIXME("Unimplemented conversion %04x -> BSTR\n", src_type); return E_NOTIMPL;
}
@ -1000,44 +1000,35 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
return S_OK;
case DBTYPE_VARIANT:
{
if(V_VT((VARIANT*)src) == VT_NULL)
switch(V_VT((VARIANT*)src))
{
*dst_status = DBSTATUS_S_ISNULL;
*dst_len = 0;
case VT_UI1 | VT_ARRAY:
{
LONG l;
BYTE *data = NULL;
hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l);
if(FAILED(hr))
return hr;
hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data);
if(FAILED(hr))
{
ERR("SafeArrayAccessData Failed = 0x%08x\n", hr);
return hr;
}
*dst_len = l+1;
*dst_status = DBSTATUS_S_OK;
memcpy(d, data, *dst_len);
SafeArrayUnaccessData(V_ARRAY((VARIANT*)src));
return S_OK;
}
else
{
switch(V_VT((VARIANT*)src))
{
case VT_UI1 | VT_ARRAY:
{
LONG l;
BYTE *data = NULL;
hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l);
if(FAILED(hr))
return hr;
hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data);
if(FAILED(hr))
{
ERR("SafeArrayAccessData Failed = 0x%08x\n", hr);
return hr;
}
*dst_len = l+1;
*dst_status = DBSTATUS_S_OK;
memcpy(d, data, *dst_len);
SafeArrayUnaccessData(V_ARRAY((VARIANT*)src));
return S_OK;
}
break;
default:
FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src));
return E_NOTIMPL;
}
break;
default:
FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src));
return E_NOTIMPL;
}
}
break;

View File

@ -455,6 +455,13 @@ todo_wine
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst == 0x4321, "got %08x\n", dst);
V_VT((VARIANT*)src) = VT_NULL;
dst_len = 0x1234;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0x1234, "got %ld\n", dst_len);
dst_len = dst = 0x1234;
memset(src, 0, sizeof(DECIMAL));
((DECIMAL*)src)->u1.Lo64 = 0x4321;
@ -764,6 +771,13 @@ static void test_converttoi4(void)
ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
ok(i4 == 0x1234, "got %08x\n", i4);
V_VT((VARIANT*)src) = VT_NULL;
dst_len = 0x1234;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0x1234, "got %ld\n", dst_len);
i4 = 0x12345678;
memset(src, 0, sizeof(DECIMAL));
((DECIMAL*)src)->u1.Lo64 = 0x1234;
@ -924,6 +938,13 @@ static void test_converttoi8(void)
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst.QuadPart == 10, "got %d\n", (int)dst.QuadPart);
SysFreeString(b);
V_VT((VARIANT*)src) = VT_NULL;
dst_len = 0x1234;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0x1234, "got %ld\n", dst_len);
}
static void test_converttobstr(void)
@ -989,10 +1010,11 @@ static void test_converttobstr(void)
V_VT(&v) = VT_NULL;
dst = (void*)0x1234;
dst_len = 33;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == sizeof(BSTR), "got %ld\n", dst_len);
ok(dst_len == 33, "got %ld\n", dst_len);
ok(dst == (void*)0x1234, "got %p\n", dst);
}
@ -1013,6 +1035,8 @@ static void test_converttowstr(void)
BSTR b;
VARIANT v;
VariantInit(&v);
memset(dst, 0xcc, sizeof(dst));
dst_len = 0x1234;
hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
@ -1476,11 +1500,12 @@ static void test_converttowstr(void)
ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
VariantClear(&v);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0, "got %ld\n", dst_len);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttostr(void)
@ -1497,6 +1522,7 @@ static void test_converttostr(void)
static const char hexunpacked_a[] = "57696E6500";
static const char hexpacked_a[] = "Wine";
BSTR b;
VARIANT v;
memset(dst, 0xcc, sizeof(dst));
dst_len = 0x1234;
@ -1974,6 +2000,13 @@ static void test_converttostr(void)
ok(dst_len == 0, "got %ld\n", dst_len);
ok(dst[0] == 0, "not null terminated\n");
ok(dst[1] == (char)0xcc, "clobbered buffer\n");
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_STR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttobyrefwstr(void)
@ -1986,6 +2019,9 @@ static void test_converttobyrefwstr(void)
static const WCHAR ten[] = {'1','0',0};
static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
BSTR b;
VARIANT v;
VariantInit(&v);
hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
@ -2058,6 +2094,13 @@ static void test_converttobyrefwstr(void)
ok(dst_len == 4, "got %ld\n", dst_len);
ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
CoTaskMemFree(dst);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttoguid(void)
@ -2067,6 +2110,9 @@ static void test_converttoguid(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
dst = IID_IDCInfo;
dst_len = 0x1234;
@ -2092,6 +2138,13 @@ static void test_converttoguid(void)
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttofiletime(void)
@ -2101,6 +2154,9 @@ static void test_converttofiletime(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
memset(&dst, 0xcc, sizeof(dst));
((FILETIME *)src)->dwLowDateTime = 0x12345678;
@ -2117,6 +2173,13 @@ static void test_converttofiletime(void)
ok(dst.dwLowDateTime == 0x12345678, "got %08x\n", dst.dwLowDateTime);
ok(dst.dwHighDateTime == 0x9abcdef0, "got %08x\n", dst.dwHighDateTime);
}
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_FILETIME, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttoui1(void)
@ -2126,6 +2189,9 @@ static void test_converttoui1(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
dst = 0x12;
dst_len = 0x1234;
@ -2160,6 +2226,13 @@ static void test_converttoui1(void)
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst == 0xfe, "got %08x\n", dst);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI1, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttoui4(void)
@ -2223,6 +2296,13 @@ todo_wine
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst == 0x4321, "got %08x\n", dst);
dst_len = 44;
V_VT((VARIANT*)src) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttor4(void)
@ -2232,6 +2312,9 @@ static void test_converttor4(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
dst = 1.0;
dst_len = 0x1234;
@ -2266,6 +2349,13 @@ static void test_converttor4(void)
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst == 10.0, "got %f\n", dst);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttor8(void)
@ -2319,6 +2409,13 @@ static void test_converttor8(void)
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst == 0x4321, "got %f\n", dst);
dst_len = 44;
V_VT(&var) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttocy(void)
@ -2328,6 +2425,9 @@ static void test_converttocy(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
dst.int64 = 0xcc;
dst_len = 0x1234;
@ -2362,6 +2462,13 @@ static void test_converttocy(void)
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
ok(dst.int64 == 1234, "got %d\n", dst.s.Lo);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_CY, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttoui8(void)
@ -2371,6 +2478,9 @@ static void test_converttoui8(void)
BYTE src[20];
DBSTATUS dst_status;
DBLENGTH dst_len;
VARIANT v;
VariantInit(&v);
dst.QuadPart = 0xcc;
dst_len = 0x1234;
@ -2416,6 +2526,13 @@ todo_wine
ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_getconversionsize(void)
@ -2567,11 +2684,11 @@ static void test_converttobytes(void)
ok(!memcmp(byte_src, dst, 2 ), "bytes differ\n");
V_VT(&v) = VT_NULL;
dst_len = 0;
dst_len = 77;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, sizeof(v), &dst_len, &v, &dst, 2, 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0, "got %ld\n", dst_len);
ok(dst_len == 77, "got %ld\n", dst_len);
dst_len = 0;
rgsabound[0].lLbound = 0;
@ -2586,6 +2703,13 @@ static void test_converttobytes(void)
ok(!memcmp(byte_dst, dst, dst_len), "bytes differ\n");
VariantClear(&v);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttobytesbyref(void)
@ -2595,6 +2719,9 @@ static void test_converttobytesbyref(void)
BYTE byte_src[] = {0, 1, 2, 4, 5};
BYTE *dst;
DBSTATUS dst_status;
VARIANT v;
VariantInit(&v);
dst_len = 0;
hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_BYTES | DBTYPE_BYREF, sizeof(byte_src), &dst_len, byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
@ -2603,6 +2730,13 @@ static void test_converttobytesbyref(void)
ok(dst_len == sizeof(byte_src), "got %ld\n", dst_len);
ok(!memcmp(byte_src, dst, dst_len ), "bytes differ\n");
CoTaskMemFree(dst);
dst_len = 44;
V_VT(&v) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES | DBTYPE_BYREF, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
static void test_converttodbdate(void)
@ -2641,6 +2775,13 @@ static void test_converttodbdate(void)
ok(dst_len == sizeof(DBDATE), "got %ld\n", dst_len);
ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
SysFreeString(bstr);
V_VT(&var) = VT_NULL;
dst_len = 88;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 88, "got %ld\n", dst_len);
}
@ -2662,6 +2803,9 @@ static void test_converttovar(void)
LARGE_INTEGER i8;
VARIANT_BOOL boolean = VARIANT_TRUE;
FLOAT fvalue = 543.21f;
VARIANT var;
VariantInit(&var);
V_VT(&dst) = VT_EMPTY;
dst_len = 0;
@ -2837,11 +2981,19 @@ static void test_converttovar(void)
/* src_status = DBSTATUS_S_ISNULL */
i4 = 123;
dst_len = 99;
hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_VARIANT, sizeof(i4), &dst_len, &i4, &dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0, "got %ld\n", dst_len);
dst_len = 44;
V_VT(&var) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_VARIANT, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == sizeof(VARIANT), "got %ld\n", dst_len);
}
static void test_converttotimestamp(void)
@ -2873,6 +3025,13 @@ static void test_converttotimestamp(void)
ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
ok(!memcmp(&ts, &dst, sizeof(ts)), "Wrong timestamp\n");
SysFreeString(bstr);
V_VT(&var) = VT_NULL;
dst_len = 77;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBTIMESTAMP, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 77, "got %ld\n", dst_len);
}
static void test_converttoiunknown(void)
@ -2882,12 +3041,22 @@ static void test_converttoiunknown(void)
DBLENGTH dst_len;
IUnknown *dst = NULL;
static WCHAR strW[] = {'t','e','s','t',0};
VARIANT var;
VariantInit(&var);
dst_len = 0x1234;
hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_IUNKNOWN, sizeof(strW), &dst_len, strW, dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 0, "got %ld\n", dst_len);
dst_len = 44;
V_VT(&var) = VT_NULL;
hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_IUNKNOWN, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
ok(hr == S_OK, "got %08x\n", hr);
ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
ok(dst_len == 44, "got %ld\n", dst_len);
}
START_TEST(convert)