diff --git a/dll/win32/shell32/CQueryAssociations.cpp b/dll/win32/shell32/CQueryAssociations.cpp index 093a536b4a1..cea6f65f76b 100644 --- a/dll/win32/shell32/CQueryAssociations.cpp +++ b/dll/win32/shell32/CQueryAssociations.cpp @@ -96,6 +96,11 @@ HRESULT STDMETHODCALLTYPE CQueryAssociations::Init( { WCHAR *progId; HRESULT hr; + LPCWSTR pchDotExt; + + pchDotExt = PathFindExtensionW(pszAssoc); + if (pchDotExt && *pchDotExt) + pszAssoc = pchDotExt; LONG ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, pszAssoc, @@ -216,10 +221,9 @@ HRESULT STDMETHODCALLTYPE CQueryAssociations::GetString( case ASSOCSTR_EXECUTABLE: { hr = this->GetExecutable(pszExtra, path, MAX_PATH, &len); - if (FAILED(hr)) - { + if (FAILED_UNEXPECTEDLY(hr)) return hr; - } + len++; return this->ReturnString(flags, pszOut, pcchOut, path, len); } @@ -228,10 +232,9 @@ HRESULT STDMETHODCALLTYPE CQueryAssociations::GetString( WCHAR *pszFileType; hr = this->GetValue(this->hkeySource, NULL, (void**)&pszFileType, NULL); - if (FAILED(hr)) - { + if (FAILED_UNEXPECTEDLY(hr)) return hr; - } + DWORD size = 0; DWORD ret = RegGetValueW(HKEY_CLASSES_ROOT, pszFileType, NULL, RRF_RT_REG_SZ, NULL, NULL, &size); if (ret == ERROR_SUCCESS) @@ -271,10 +274,9 @@ HRESULT STDMETHODCALLTYPE CQueryAssociations::GetString( WCHAR fileDescW[41]; hr = this->GetExecutable(pszExtra, path, MAX_PATH, &len); - if (FAILED(hr)) - { + if (FAILED_UNEXPECTEDLY(hr)) return hr; - } + retval = GetFileVersionInfoSizeW(path, &size); if (!retval) { @@ -470,16 +472,15 @@ HRESULT STDMETHODCALLTYPE CQueryAssociations::GetData(ASSOCF cfFlags, ASSOCDATA { if(!this->hkeyProgID) { + ERR("!hkeyProgID\n"); return HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION); } void *data; DWORD size; HRESULT hres = this->GetValue(this->hkeyProgID, L"EditFlags", &data, &size); - if(FAILED(hres)) - { + if (FAILED_UNEXPECTEDLY(hres)) return hres; - } if (!pcbOut) { @@ -536,20 +537,24 @@ HRESULT CQueryAssociations::GetValue(HKEY hkey, const WCHAR *name, void **data, ret = RegQueryValueExW(hkey, name, 0, NULL, NULL, &size); if (ret != ERROR_SUCCESS) { + ERR("%ld\n", ret); return HRESULT_FROM_WIN32(ret); } if (!size) { + ERR("!size\n"); return E_FAIL; } *data = HeapAlloc(GetProcessHeap(), 0, size); if (!*data) { + ERR("E_OUTOFMEMORY\n"); return E_OUTOFMEMORY; } ret = RegQueryValueExW(hkey, name, 0, NULL, (LPBYTE)*data, &size); if (ret != ERROR_SUCCESS) { + ERR("%ld\n", ret); HeapFree(GetProcessHeap(), 0, *data); return HRESULT_FROM_WIN32(ret); } @@ -597,6 +602,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) if (ret) { + ERR("%ld\n", ret); return HRESULT_FROM_WIN32(ret); } @@ -612,6 +618,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) ret = RegQueryInfoKeyW(hkeyShell, NULL, NULL, NULL, NULL, &max_subkey_len, NULL, NULL, NULL, NULL, NULL, NULL); if (ret) { + ERR("%ld\n", ret); RegCloseKey(hkeyShell); return HRESULT_FROM_WIN32(ret); } @@ -620,6 +627,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) extra_from_reg = static_cast(HeapAlloc(GetProcessHeap(), 0, max_subkey_len * sizeof(WCHAR))); if (!extra_from_reg) { + ERR("E_OUTOFMEMORY\n"); RegCloseKey(hkeyShell); return E_OUTOFMEMORY; } @@ -627,6 +635,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) ret = RegEnumKeyExW(hkeyShell, 0, extra_from_reg, &max_subkey_len, NULL, NULL, NULL, NULL); if (ret) { + ERR("%ld\n", ret); HeapFree(GetProcessHeap(), 0, extra_from_reg); RegCloseKey(hkeyShell); return HRESULT_FROM_WIN32(ret); @@ -641,6 +650,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) RegCloseKey(hkeyShell); if (ret) { + ERR("%ld\n", ret); return HRESULT_FROM_WIN32(ret); } /* open command subkey */ @@ -648,6 +658,7 @@ HRESULT CQueryAssociations::GetCommand(const WCHAR *extra, WCHAR **command) RegCloseKey(hkeyVerb); if (ret) { + ERR("%ld\n", ret); return HRESULT_FROM_WIN32(ret); } hr = this->GetValue(hkeyCommand, NULL, (void**)command, NULL); @@ -662,10 +673,8 @@ HRESULT CQueryAssociations::GetExecutable(LPCWSTR pszExtra, LPWSTR path, DWORD p WCHAR *pszEnd; HRESULT hr = this->GetCommand(pszExtra, &pszCommand); - if (FAILED(hr)) - { + if (FAILED_UNEXPECTEDLY(hr)) return hr; - } DWORD expLen = ExpandEnvironmentStringsW(pszCommand, NULL, 0); if (expLen > 0) @@ -710,6 +719,7 @@ HRESULT CQueryAssociations::GetExecutable(LPCWSTR pszExtra, LPWSTR path, DWORD p HeapFree(GetProcessHeap(), 0, pszCommand); if (!*len) { + ERR("!*len\n"); return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); } return S_OK;