From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/scrrun/dictionary.c | 4 ++++ dlls/scrrun/tests/dictionary.c | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+)
diff --git a/dlls/scrrun/dictionary.c b/dlls/scrrun/dictionary.c index f4f1fa701f6..f2f39c82f6f 100644 --- a/dlls/scrrun/dictionary.c +++ b/dlls/scrrun/dictionary.c @@ -188,6 +188,10 @@ static BOOL is_matching_key(const struct dictionary *dict, const struct keyitem_ { return hash == pair->hash && numeric_key_eq(key, &pair->key); } + else if (V_VT(&pair->key) == VT_EMPTY || V_VT(&pair->key) == VT_NULL) + { + return V_VT(&pair->key) == V_VT(key); + } else { WARN("Unexpected key type %#x.\n", V_VT(key)); diff --git a/dlls/scrrun/tests/dictionary.c b/dlls/scrrun/tests/dictionary.c index 4c103ff25bf..ccc4d181793 100644 --- a/dlls/scrrun/tests/dictionary.c +++ b/dlls/scrrun/tests/dictionary.c @@ -1009,6 +1009,45 @@ static void test_Add(void)
VariantClear(&item);
+ /* Empty and null keys. */ + hr = IDictionary_RemoveAll(dict); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&key1) = VT_EMPTY; + V_I4(&key1) = 1; + + V_VT(&item) = VT_BSTR; + V_BSTR(&item) = SysAllocString(L"empty"); + + hr = IDictionary_Add(dict, &key1, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&key2) = VT_EMPTY; + V_I4(&key2) = 2; + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == CTL_E_KEY_ALREADY_EXISTS, "Unexpected hr %#lx.\n", hr); + + V_VT(&key2) = VT_NULL; + V_I4(&key2) = 2; + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_RemoveAll(dict); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == CTL_E_KEY_ALREADY_EXISTS, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key1, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantClear(&item); + IDictionary_Release(dict); }