Implementation and test function for ADsBuildVarArrayInt, using ADsBuildVarArrayStr as reference. - /dlls/activeds/activeds_main.c - /dlls/activeds/tests/activeds.c - /include/adshlp.h
-- v13: 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..bb5bc102354 --- 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) = (ULONG) 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..e8b8d0152ee 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) +{ + 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(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**);
On Wed Apr 9 01:52:07 2025 +0000, Daniel Martin wrote:
changed this line in [version 12 of the diff](/wine/wine/-/merge_requests/7752/diffs?diff_id=169505&start_sha=13ac90861b5dac77a3491a74dca6d2025bac03c8#9ab5e7c3b154111cb0dd263a12b91d9e30577552_129_129)
Thanks, I have changed the parameter names. This will keep consistency with **ADsBuildVarArrayStr**.