xref: /MusicPlayer2/MusicPlayer2/RegFileRelate.cpp (revision 8b89eaf68434c7ae25336bfee755aec74cd51a4f)
1 #include "stdafx.h"
2 #include "RegFileRelate.h"
3 
4 
CRegFileRelate()5 CRegFileRelate::CRegFileRelate()
6 {
7     TCHAR buff[MAX_PATH];
8     GetModuleFileName(NULL, buff, MAX_PATH);
9     m_model_path = buff;
10 }
11 
12 
~CRegFileRelate()13 CRegFileRelate::~CRegFileRelate()
14 {
15 }
16 
SetModelPath(LPCTSTR model_path)17 void CRegFileRelate::SetModelPath(LPCTSTR model_path)
18 {
19     m_model_path = model_path;
20 }
21 
SetAppName(LPCTSTR app_name)22 void CRegFileRelate::SetAppName(LPCTSTR app_name)
23 {
24     m_app_name = app_name;
25 }
26 
AddFileTypeRelate(LPCTSTR file_ext,LPCTSTR ico_path,bool default_icon,LPCTSTR description)27 bool CRegFileRelate::AddFileTypeRelate(LPCTSTR file_ext, LPCTSTR ico_path, bool default_icon, LPCTSTR description)
28 {
29     CString str_ext{ file_ext };
30     if (str_ext.IsEmpty())
31         return false;
32 
33     if (str_ext[0] != _T('.'))
34         str_ext = _T('.') + str_ext;
35 
36     CRegKey key;
37     //打开Software\Classes\.扩展名 的项,并将其默认键值改为 “app_name.扩展名”
38     if (!OpenItem(key, CString("Software\\Classes\\") + str_ext))
39         return false;
40 
41     //为cue格式添加PerceivedType属性,以便在资源管理中直接预览cue文件内容
42     if (CString(str_ext) == _T(".cue"))
43         key.SetStringValue(_T("PerceivedType"), _T("text"));
44 
45     if (default_icon)
46         str_ext.Empty();
47 
48     if (key.SetStringValue(NULL, m_app_name + str_ext) != ERROR_SUCCESS)
49         return false;
50 
51     //设置该类型的描述
52     if (description != NULL && *description != _T('\0'))
53     {
54         if (OpenItem(key, CString("Software\\Classes\\") + m_app_name + str_ext))
55         {
56             key.SetStringValue(NULL, description);
57         }
58     }
59 
60     //添加shell\Open\Command的项
61     if (!OpenItem(key, CString("Software\\Classes\\") + m_app_name + str_ext + _T("\\shell\\Open\\Command")))
62         return false;
63 
64     CString str_value = m_model_path;
65     if(str_value.Find(_T(' ')) >= 0)
66     {
67         str_value = _T('\"') + str_value;
68         str_value += _T('\"');
69     }
70     str_value += _T(" \"%1\"");
71     if (key.SetStringValue(NULL, str_value) != ERROR_SUCCESS)
72         return false;
73 
74     //添加默认图标
75     if (ico_path != nullptr)
76     {
77         if (OpenItem(key, CString("Software\\Classes\\") + m_app_name + str_ext + _T("\\DefaultIcon")))
78         {
79             key.SetStringValue(NULL, ico_path);
80         }
81     }
82 
83     return true;
84 }
85 
AddFileTypeRelate(LPCTSTR file_ext,int ico_index,bool default_icon,LPCTSTR description)86 bool CRegFileRelate::AddFileTypeRelate(LPCTSTR file_ext, int ico_index, bool default_icon, LPCTSTR description)
87 {
88     CString icon_path;
89     icon_path.Format(_T("%s,%d"), m_model_path.GetString(), ico_index);
90     return AddFileTypeRelate(file_ext, icon_path, default_icon, description);
91 }
92 
IsFileTypeRelated(LPCTSTR file_ext)93 bool CRegFileRelate::IsFileTypeRelated(LPCTSTR file_ext)
94 {
95     CString str_ext{ file_ext };
96     if (str_ext.IsEmpty())
97         return false;
98 
99     if (str_ext[0] != _T('.'))
100         str_ext = _T('.') + str_ext;
101 
102     CRegKey key;
103     if (key.Open(HKEY_CURRENT_USER, CString("Software\\Classes\\") + str_ext) != ERROR_SUCCESS)
104         return false;
105 
106     TCHAR buff[256]{};
107     ULONG size{ 256 };
108     if (key.QueryStringValue(NULL, buff, &size) != ERROR_SUCCESS)
109         return false;
110 
111     return CString(buff) == m_app_name + str_ext || CString(buff) == m_app_name;
112 }
113 
DeleteFileTypeRelate(LPCTSTR file_ext)114 bool CRegFileRelate::DeleteFileTypeRelate(LPCTSTR file_ext)
115 {
116     CString str_ext{ file_ext };
117     if (str_ext.IsEmpty())
118         return false;
119 
120     if (str_ext[0] != _T('.'))
121         str_ext = _T('.') + str_ext;
122 
123     CRegKey key;
124     //打开Software\Classes\.扩展名 的项,并将其默认键值删除
125     if (!OpenItem(key, CString("Software\\Classes\\") + str_ext))
126         return false;
127 
128     TCHAR buff[256]{};
129     ULONG size{ 256 };
130     bool deleted{ false };
131     if (key.QueryStringValue(NULL, buff, &size) == ERROR_SUCCESS)
132     {
133         if (CString(buff) == m_app_name + str_ext || CString(buff) == m_app_name)
134         {
135             deleted = (key.DeleteValue(NULL) == ERROR_SUCCESS);
136         }
137     }
138 
139     if (!OpenItem(key, CString("Software\\Classes\\")))
140         return false;
141     key.RecurseDeleteKey(m_app_name + str_ext);
142 
143     return deleted;
144 }
145 
GetAllRelatedExtensions(std::vector<wstring> & extensions)146 bool CRegFileRelate::GetAllRelatedExtensions(std::vector<wstring>& extensions)
147 {
148     CRegKey key;
149     if (key.Open(HKEY_CURRENT_USER, _T("Software\\Classes\\")) != ERROR_SUCCESS)
150         return false;
151 
152     DWORD dwIndex{};
153     DWORD dwSize = MAX_PATH;
154     TCHAR szExtension[MAX_PATH];
155     //遍历"Software\\Classes\\"下的所有项
156     while (ERROR_NO_MORE_ITEMS != key.EnumKey(dwIndex, szExtension, &dwSize))
157     {
158         dwIndex++;
159         dwSize = MAX_PATH;
160 
161         //判断该扩展名是否已被程序关联
162         if(IsFileTypeRelated(szExtension))
163             extensions.push_back(szExtension);
164     }
165     return true;
166 }
167 
OpenItem(CRegKey & key,LPCTSTR item_str)168 bool CRegFileRelate::OpenItem(CRegKey& key, LPCTSTR item_str)
169 {
170     if (key.Open(HKEY_CURRENT_USER, item_str) != ERROR_SUCCESS)
171     {
172         //如果项不存在,则创建
173         if (key.Create(HKEY_CURRENT_USER, item_str) != ERROR_SUCCESS)
174             return false;
175         //再次打开
176         if (key.Open(HKEY_CURRENT_USER, item_str) != ERROR_SUCCESS)
177             return false;
178     }
179 
180     return true;
181 }
182