shell32: Fix handle leak on consecutive Init() calls.
This commit is contained in:
parent
891cf2ac54
commit
f0d17b5c17
|
@ -184,6 +184,10 @@ static HRESULT WINAPI IQueryAssociations_fnInit(
|
||||||
FIXME("hwnd != NULL not supported\n");
|
FIXME("hwnd != NULL not supported\n");
|
||||||
if (cfFlags != 0)
|
if (cfFlags != 0)
|
||||||
FIXME("unsupported flags: %x\n", cfFlags);
|
FIXME("unsupported flags: %x\n", cfFlags);
|
||||||
|
|
||||||
|
RegCloseKey(This->hkeySource);
|
||||||
|
RegCloseKey(This->hkeyProgID);
|
||||||
|
This->hkeySource = This->hkeyProgID = NULL;
|
||||||
if (pszAssoc != NULL)
|
if (pszAssoc != NULL)
|
||||||
{
|
{
|
||||||
ret = RegOpenKeyExW(HKEY_CLASSES_ROOT,
|
ret = RegOpenKeyExW(HKEY_CLASSES_ROOT,
|
||||||
|
@ -191,8 +195,8 @@ static HRESULT WINAPI IQueryAssociations_fnInit(
|
||||||
0,
|
0,
|
||||||
KEY_READ,
|
KEY_READ,
|
||||||
&This->hkeySource);
|
&This->hkeySource);
|
||||||
if (ret != ERROR_SUCCESS)
|
if (ret)
|
||||||
return E_FAIL;
|
return S_OK;
|
||||||
/* if this is not a prog id */
|
/* if this is not a prog id */
|
||||||
if ((*pszAssoc == '.') || (*pszAssoc == '{'))
|
if ((*pszAssoc == '.') || (*pszAssoc == '{'))
|
||||||
{
|
{
|
||||||
|
@ -468,6 +472,9 @@ static HRESULT WINAPI IQueryAssociations_fnGetString(
|
||||||
if (!pcchOut)
|
if (!pcchOut)
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
|
|
||||||
|
if (!This->hkeySource && !This->hkeyProgID)
|
||||||
|
return HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION);
|
||||||
|
|
||||||
switch (str)
|
switch (str)
|
||||||
{
|
{
|
||||||
case ASSOCSTR_COMMAND:
|
case ASSOCSTR_COMMAND:
|
||||||
|
|
|
@ -103,6 +103,8 @@ struct assoc_getstring_test
|
||||||
};
|
};
|
||||||
|
|
||||||
static const WCHAR httpW[] = {'h','t','t','p',0};
|
static const WCHAR httpW[] = {'h','t','t','p',0};
|
||||||
|
static const WCHAR httpsW[] = {'h','t','t','p','s',0};
|
||||||
|
static const WCHAR badW[] = {'b','a','d','b','a','d',0};
|
||||||
|
|
||||||
static struct assoc_getstring_test getstring_tests[] =
|
static struct assoc_getstring_test getstring_tests[] =
|
||||||
{
|
{
|
||||||
|
@ -163,6 +165,31 @@ static void test_IQueryAssociations_GetString(void)
|
||||||
IQueryAssociations_Release(assoc);
|
IQueryAssociations_Release(assoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_IQueryAssociations_Init(void)
|
||||||
|
{
|
||||||
|
IQueryAssociations *assoc;
|
||||||
|
HRESULT hr;
|
||||||
|
DWORD len;
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_QueryAssociations, NULL, CLSCTX_INPROC_SERVER, &IID_IQueryAssociations, (void*)&assoc);
|
||||||
|
ok(hr == S_OK, "failed to create object, 0x%x\n", hr);
|
||||||
|
|
||||||
|
hr = IQueryAssociations_Init(assoc, 0, NULL, NULL, NULL);
|
||||||
|
ok(hr == E_INVALIDARG, "Init failed, 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IQueryAssociations_Init(assoc, 0, httpW, NULL, NULL);
|
||||||
|
ok(hr == S_OK, "Init failed, 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IQueryAssociations_Init(assoc, 0, badW, NULL, NULL);
|
||||||
|
ok(hr == S_OK || broken(hr == S_FALSE) /* pre-vista */, "Init failed, 0x%08x\n", hr);
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
hr = IQueryAssociations_GetString(assoc, 0, ASSOCSTR_EXECUTABLE, NULL, NULL, &len);
|
||||||
|
ok(hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) || broken(hr == E_FAIL) /* pre-vista */, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
IQueryAssociations_Release(assoc);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(assoc)
|
START_TEST(assoc)
|
||||||
{
|
{
|
||||||
IQueryAssociations *qa;
|
IQueryAssociations *qa;
|
||||||
|
@ -176,6 +203,7 @@ START_TEST(assoc)
|
||||||
{
|
{
|
||||||
test_IQueryAssociations_QueryInterface();
|
test_IQueryAssociations_QueryInterface();
|
||||||
test_IQueryAssociations_GetString();
|
test_IQueryAssociations_GetString();
|
||||||
|
test_IQueryAssociations_Init();
|
||||||
|
|
||||||
IQueryAssociations_Release(qa);
|
IQueryAssociations_Release(qa);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue