From ee917ebd77777a41a3143537ef31e16443db1e45 Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Fri, 3 Mar 2017 16:20:03 +0000 Subject: [PATCH] [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 --- .../dll/win32/shell32/CDefaultContextMenu.cpp | 2 +- reactos/dll/win32/shell32/COpenWithMenu.cpp | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp index c8acddfa635..849c837f965 100644 --- a/reactos/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/reactos/dll/win32/shell32/CDefaultContextMenu.cpp @@ -1019,7 +1019,7 @@ HRESULT CDefaultContextMenu::DoDynamicShellExtensions( 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); PDynamicShellEntry pEntry = GetDynamicEntry(idCmd); diff --git a/reactos/dll/win32/shell32/COpenWithMenu.cpp b/reactos/dll/win32/shell32/COpenWithMenu.cpp index 8812b73b683..3cf5da3b7d0 100644 --- a/reactos/dll/win32/shell32/COpenWithMenu.cpp +++ b/reactos/dll/win32/shell32/COpenWithMenu.cpp @@ -684,10 +684,9 @@ BOOL COpenWithList::AddAppToMRUList(SApp *pApp, LPCWSTR pwszFilename) BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename) { HKEY hKey, hSrcKey, hDestKey; - DWORD dwDisposition; WCHAR wszBuf[256]; - TRACE("SetDefaultHandler %ls %ls", pApp->wszFilename, pwszFilename); + TRACE("SetDefaultHandler %ls %ls\n", pApp->wszFilename, pwszFilename); /* Extract file extension */ LPCWSTR pwszExt = PathFindExtensionW(pwszFilename); @@ -695,15 +694,18 @@ BOOL COpenWithList::SetDefaultHandler(SApp *pApp, LPCWSTR pwszFilename) return FALSE; /* 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"); 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); 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; } } - else + else if (lResult != ERROR_SUCCESS) { - /* Entry already exists fetch prog key id */ - DWORD dwSize = sizeof(wszBuf); - if (RegGetValueW(hKey, NULL, L"", RRF_RT_REG_SZ, NULL, wszBuf, &dwSize) != ERROR_SUCCESS) - { - ERR("RegGetValueW failed: %lu\n", GetLastError()); - RegCloseKey(hKey); - return FALSE; - } + RegCloseKey(hKey); + ERR("RegGetValueExW failed: 0x%08x\n", lResult); + return FALSE; } /* Close file extension key */ -- 2.17.1