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