Implementation and test function for ADsBuildVarArrayInt, using ADsBuildVarArrayStr as reference. - /dlls/activeds/activeds_main.c - /dlls/activeds/tests/activeds.c - /include/adshlp.h
-- v14: activeds: Implement ADsBuildVarArrayInt.
From: Daniel Martin dm@xbostechnology.com
--- dlls/activeds/activeds_main.c | 34 +++++++++++++++++++++--- dlls/activeds/tests/activeds.c | 48 ++++++++++++++++++++++++++++++++++ include/adshlp.h | 1 + 3 files changed, 80 insertions(+), 3 deletions(-) mode change 100644 => 100755 dlls/activeds/activeds_main.c
diff --git a/dlls/activeds/activeds_main.c b/dlls/activeds/activeds_main.c old mode 100644 new mode 100755 index 0f13a5629b6..65df0ec4439 --- a/dlls/activeds/activeds_main.c +++ b/dlls/activeds/activeds_main.c @@ -126,10 +126,38 @@ fail: /***************************************************** * ADsBuildVarArrayInt [ACTIVEDS.8] */ -HRESULT WINAPI ADsBuildVarArrayInt(LPDWORD lpdwObjectTypes, DWORD dwObjectTypes, VARIANT* pvar) +HRESULT WINAPI ADsBuildVarArrayInt(LPDWORD values, DWORD count, VARIANT* var) { - FIXME("(%p, %ld, %p)!stub\n",lpdwObjectTypes, dwObjectTypes, pvar); - return E_NOTIMPL; + HRESULT hr; + SAFEARRAY *sa; + LONG idx, end = count; + + TRACE("(%p, %lu, %p)\n", values, count, var); + + if (!var) return E_ADS_BAD_PARAMETER; + + sa = SafeArrayCreateVector(VT_VARIANT, 0, count); + if (!sa) return E_OUTOFMEMORY; + + VariantInit(var); + for (idx = 0; idx < end; idx++) + { + VARIANT item; + + V_VT(&item) = VT_UI4; + V_UI4(&item) = values[idx]; + + hr = SafeArrayPutElement(sa, &idx, &item); + if (hr != S_OK) + { + SafeArrayDestroy(sa); + return hr; + } + } + + V_VT(var) = VT_ARRAY | VT_VARIANT; + V_ARRAY(var) = sa; + return S_OK; }
/***************************************************** diff --git a/dlls/activeds/tests/activeds.c b/dlls/activeds/tests/activeds.c index bc6a6bfc568..4950b82fd86 100644 --- a/dlls/activeds/tests/activeds.c +++ b/dlls/activeds/tests/activeds.c @@ -84,6 +84,53 @@ static void test_ADsBuildVarArrayStr(void) VariantClear(&var); }
+static void test_ADsBuildVarArrayInt(void) +{ + const DWORD props[] = { 1, 2, 3, 4 }; + HRESULT hr; + VARIANT var, item; + LONG start, end, idx; + + hr = ADsBuildVarArrayInt(NULL, 0, NULL); + ok(hr == E_ADS_BAD_PARAMETER || hr == E_FAIL /* XP */, "got %#lx\n", hr); + + hr = ADsBuildVarArrayInt(NULL, 0, &var); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var)); + start = 0xdeadbeef; + hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start); + ok(hr == S_OK, "got %#lx\n", hr); + ok(start == 0, "got %ld\n", start); + end = 0xdeadbeef; + hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end); + ok(hr == S_OK, "got %#lx\n", hr); + ok(end == -1, "got %ld\n", end); + VariantClear(&var); + + hr = ADsBuildVarArrayInt((LPDWORD)props, ARRAY_SIZE(props), &var); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var)); + start = 0xdeadbeef; + hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start); + ok(hr == S_OK, "got %#lx\n", hr); + ok(start == 0, "got %ld\n", start); + end = 0xdeadbeef; + hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end); + ok(hr == S_OK, "got %#lx\n", hr); + ok(end == 3, "got %ld\n", end); + + for (idx = 0; idx < ARRAY_SIZE(props); idx++) + { + hr = SafeArrayGetElement(V_ARRAY(&var), &idx, &item); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&item) == VT_UI4, "got %d\n", V_VT(&item)); + ok(V_UI4(&item) == props[idx], "got %lu\n", V_UI4(&item)); + VariantClear(&item); + } + + VariantClear(&var); +} + static void test_Pathname(void) { static const WCHAR * const elem[3] = { L"a=b",L"c=d",L"e=f" }; @@ -167,6 +214,7 @@ START_TEST(activeds)
test_Pathname(); test_ADsBuildVarArrayStr(); + test_ADsBuildVarArrayInt();
CoUninitialize(); } diff --git a/include/adshlp.h b/include/adshlp.h index 7366c077788..4e85c0efb5c 100644 --- a/include/adshlp.h +++ b/include/adshlp.h @@ -31,6 +31,7 @@ WCHAR* WINAPI AllocADsStr(WCHAR*) __WINE_DEALLOC(FreeADsStr) __WINE_MALLOC;
HRESULT WINAPI ADsBuildEnumerator(IADsContainer*,IEnumVARIANT**); HRESULT WINAPI ADsBuildVarArrayStr(LPWSTR*,DWORD,VARIANT*); +HRESULT WINAPI ADsBuildVarArrayInt(LPDWORD,DWORD,VARIANT*); HRESULT WINAPI ADsEnumerateNext(IEnumVARIANT*,ULONG,VARIANT*,ULONG*); HRESULT WINAPI ADsGetObject(LPCWSTR,REFIID,VOID**); HRESULT WINAPI ADsOpenObject(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,REFIID,VOID**);