[SHELL32]

- Always set the default value in SetDefaultHandler, otherwise it's impossible to create a default association if the key for some reason already exists. This is consistent with what Windows does.

svn path=/trunk/; revision=74039
This commit is contained in:
Kamil Hornicek 2017-03-03 16:20:03 +00:00
parent c1bfc56213
commit ee917ebd77
2 changed files with 12 additions and 15 deletions

View file

@ -1019,7 +1019,7 @@ HRESULT
CDefaultContextMenu::DoDynamicShellExtensions( CDefaultContextMenu::DoDynamicShellExtensions(
LPCMINVOKECOMMANDINFO lpcmi) LPCMINVOKECOMMANDINFO lpcmi)
{ {
TRACE("verb %p first %x last %x", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast); TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
UINT idCmd = LOWORD(lpcmi->lpVerb); UINT idCmd = LOWORD(lpcmi->lpVerb);
PDynamicShellEntry pEntry = GetDynamicEntry(idCmd); PDynamicShellEntry pEntry = GetDynamicEntry(idCmd);

View file

@ -684,10 +684,9 @@ BOOL COpenWithList::AddAppToMRUList(SApp *pApp, LPCWSTR pwszFilename)
BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename) BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename)
{ {
HKEY hKey, hSrcKey, hDestKey; HKEY hKey, hSrcKey, hDestKey;
DWORD dwDisposition;
WCHAR wszBuf[256]; WCHAR wszBuf[256];
TRACE("SetDefaultHandler %ls %ls", pApp->wszFilename, pwszFilename); TRACE("SetDefaultHandler %ls %ls\n", pApp->wszFilename, pwszFilename);
/* Extract file extension */ /* Extract file extension */
LPCWSTR pwszExt = PathFindExtensionW(pwszFilename); LPCWSTR pwszExt = PathFindExtensionW(pwszFilename);
@ -695,15 +694,18 @@ BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename)
return FALSE; return FALSE;
/* Create file extension key */ /* Create file extension key */
if (RegCreateKeyExW(HKEY_CLASSES_ROOT, pwszExt, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS) if (RegCreateKeyExW(HKEY_CLASSES_ROOT, pwszExt, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
{ {
ERR("Cannot open ext key"); ERR("Cannot open ext key");
return FALSE; return FALSE;
} }
if (dwDisposition == REG_CREATED_NEW_KEY) DWORD dwSize = sizeof(wszBuf);
LONG lResult = RegGetValueW(hKey, NULL, L"", RRF_RT_REG_SZ, NULL, wszBuf, &dwSize);
if (lResult == ERROR_FILE_NOT_FOUND)
{ {
/* A new entry was created create the prog key id */ /* A new entry was created or the default key is not set: set the prog key id */
StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s_auto_file", pwszExt + 1); StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s_auto_file", pwszExt + 1);
if (RegSetValueExW(hKey, L"", 0, REG_SZ, (const BYTE*)wszBuf, (wcslen(wszBuf) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS) if (RegSetValueExW(hKey, L"", 0, REG_SZ, (const BYTE*)wszBuf, (wcslen(wszBuf) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
{ {
@ -712,16 +714,11 @@ BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename)
return FALSE; return FALSE;
} }
} }
else else if (lResult != ERROR_SUCCESS)
{ {
/* Entry already exists fetch prog key id */ RegCloseKey(hKey);
DWORD dwSize = sizeof(wszBuf); ERR("RegGetValueExW failed: 0x%08x\n", lResult);
if (RegGetValueW(hKey, NULL, L"", RRF_RT_REG_SZ, NULL, wszBuf, &dwSize) != ERROR_SUCCESS) return FALSE;
{
ERR("RegGetValueW failed: %lu\n", GetLastError());
RegCloseKey(hKey);
return FALSE;
}
} }
/* Close file extension key */ /* Close file extension key */