X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad9835c97c10c0d7de345e3a7a7c0fc2776eb2cb..43b282bd095529e69f0bf7e7bd44888e4867257e:/src/msw/mimetype.cpp diff --git a/src/msw/mimetype.cpp b/src/msw/mimetype.cpp index 9dedef77d5..a7d29114c9 100644 --- a/src/msw/mimetype.cpp +++ b/src/msw/mimetype.cpp @@ -18,19 +18,22 @@ #if wxUSE_MIMETYPE +#include "wx/msw/mimetype.h" + #ifndef WX_PRECOMP #include "wx/dynarray.h" #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/crt.h" #if wxUSE_GUI #include "wx/icon.h" #include "wx/msgdlg.h" #endif #endif //WX_PRECOMP -#include "wx/log.h" #include "wx/file.h" #include "wx/iconloc.h" -#include "wx/intl.h" #include "wx/confbase.h" #ifdef __WXMSW__ @@ -38,13 +41,11 @@ #include "wx/msw/private.h" #endif // OS -#include "wx/msw/mimetype.h" - // other standard headers #include // in case we're compiling in non-GUI mode -class WXDLLEXPORT wxIcon; +class WXDLLIMPEXP_FWD_CORE wxIcon; // These classes use Windows registry to retrieve the required information. // @@ -199,16 +200,47 @@ bool wxFileTypeImpl::EnsureExtKeyExists() // get the command to use // ---------------------------------------------------------------------------- -wxString wxFileTypeImpl::GetCommand(const wxChar *verb) const +static wxString wxFileTypeImplGetCurVer(const wxString& progId) +{ + wxRegKey key(wxRegKey::HKCR, progId + wxT("\\CurVer")); + if (key.Exists()) + { + wxString value; + if (key.QueryValue(wxEmptyString, value)) + return value; + } + return progId; +} + +wxString wxFileTypeImpl::GetCommand(const wxString& verb) const { // suppress possible error messages wxLogNull nolog; wxString strKey; - if ( wxRegKey(wxRegKey::HKCR, m_ext + _T("\\shell")).Exists() ) + { + wxRegKey explorerKey(wxRegKey::HKCU, wxT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\") + m_ext); + if (explorerKey.Exists()) + { + if (explorerKey.Open(wxRegKey::Read)) + { + if (explorerKey.QueryValue(wxT("Progid"), strKey)) + { + strKey = wxFileTypeImplGetCurVer(strKey); + } + } + } + } + + if (!strKey && wxRegKey(wxRegKey::HKCR, m_ext + _T("\\shell")).Exists()) strKey = m_ext; - if ( wxRegKey(wxRegKey::HKCR, m_strFileType + _T("\\shell")).Exists() ) - strKey = m_strFileType; + + if ( !strKey && !m_strFileType.empty()) + { + wxString fileType = wxFileTypeImplGetCurVer(m_strFileType); + if (wxRegKey(wxRegKey::HKCR, fileType + _T("\\shell")).Exists()) + strKey = fileType; + } if ( !strKey ) { @@ -701,7 +733,7 @@ bool wxFileTypeImpl::SetMimeType(const wxString& mimeTypeOrig) { // make up a default value for it wxString cmd; - wxSplitPath(GetCommand(_T("open")), NULL, &cmd, NULL); + wxFileName::SplitPath(GetCommand(_T("open")), NULL, &cmd, NULL); mimeType << _T("application/x-") << cmd; } else