Skip to content

Commit e4461d7

Browse files
authored
Merge pull request #53 from ljzloser/master
增加四个文件关联图标,iss脚本中新增文件关联界面,添加安装时动态写入和删除注册表,卸载删除全部注册表
2 parents 0712824 + 57c50f7 commit e4461d7

5 files changed

Lines changed: 161 additions & 4 deletions

File tree

Metaminesweeper.iss

Lines changed: 161 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
; 根目录
1919
#define RootPath "Metaminesweeper-v3.1.11"
2020
; 图标
21-
#define IconPath "Metaminesweeper-v3.1.11\media\cat.ico"
21+
#define IconPath "media\cat.ico"
2222
[Setup]
2323
;注意:AppId 的值唯一标识此应用程序。不要在其他应用程序的安装程序中使用相同的 AppId 值。
2424
;(要生成新的 GUID,请单击 Tools |在 IDE 中生成 GUID
@@ -47,8 +47,8 @@ OutputBaseFilename=Metaminesweeper-{#MyAppVersion}
4747
Compression=lzma
4848
SolidCompression=yes
4949
WizardStyle=modern
50-
SetupIconFile={#IconPath}
51-
UninstallDisplayIcon={#IconPath}
50+
SetupIconFile={#RootPath}\{#IconPath}
51+
UninstallDisplayIcon={app}\{#IconPath}
5252

5353
[Languages]
5454
Name: "english"; MessagesFile: "compiler:Default.isl"
@@ -64,9 +64,166 @@ Source: {#RootPath}\*; DestDir: "{app}"; Flags: ignoreversion recursesubdirs cre
6464
;注意:不要在任何共享系统文件上使用 “Flags: ignoreversion”
6565

6666
[Icons]
67-
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#AppPath}\{#MyAppExeName}"
67+
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#AppPath}\{#MyAppExeName}";
6868
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#AppPath}\{#MyAppExeName}"; Tasks: desktopicon;
6969

7070
[Run]
7171
Filename: "{app}\{#AppPath}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent runascurrentuser
72+
[Code]
73+
var
74+
Page: TWizardPage;
75+
AVFCheckbox, EVFCheckbox, RMVCheckbox, MVFCheckbox: TNewCheckbox;
76+
procedure FileAssociationPage;
77+
begin
78+
Page := CreateCustomPage(wpSelectDir, '文件打开方式', '勾选对应的文件类型,以添加对应文件类型使用{#MyAppName}的打开方式,然后点击“下一步”按钮。');
7279
80+
AVFCheckbox := TNewCheckbox.Create(Page);
81+
AVFCheckbox.Top := 0;
82+
AVFCheckbox.Left := 0;
83+
AVFCheckbox.Width := Page.SurfaceWidth;
84+
AVFCheckbox.Caption := '.avf';
85+
AVFCheckbox.Checked := False;
86+
AVFCheckbox.Parent := Page.Surface;
87+
88+
EVFCheckbox := TNewCheckbox.Create(Page);
89+
EVFCheckbox.Top := 20;
90+
EVFCheckbox.Left := 0;
91+
EVFCheckbox.Width := Page.SurfaceWidth;
92+
EVFCheckbox.Caption := '.evf';
93+
EVFCheckbox.Checked := False;
94+
EVFCheckbox.Parent := Page.Surface;
95+
96+
RMVCheckbox := TNewCheckbox.Create(Page);
97+
RMVCheckbox.Top := 40;
98+
RMVCheckbox.Left := 0;
99+
RMVCheckbox.Width := Page.SurfaceWidth;
100+
RMVCheckbox.Caption := '.rmv';
101+
RMVCheckbox.Checked := False;
102+
RMVCheckbox.Parent := Page.Surface;
103+
104+
MVFCheckbox := TNewCheckbox.Create(Page);
105+
MVFCheckbox.Top := 60;
106+
MVFCheckbox.Left := 0;
107+
MVFCheckbox.Width := Page.SurfaceWidth;
108+
MVFCheckbox.Caption := '.mvf';
109+
MVFCheckbox.Checked := False;
110+
MVFCheckbox.Parent := Page.Surface;
111+
end;
112+
113+
procedure CurStepChanged(CurStep: TSetupStep);
114+
begin
115+
if CurStep = ssPostInstall then
116+
begin
117+
if not (AVFCheckbox.Checked or EVFCheckbox.Checked or RMVCheckbox.Checked or MVFCheckbox.Checked) then
118+
begin
119+
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}');
120+
end;
121+
122+
if AVFCheckbox.Checked then
123+
begin
124+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', '','{#MyAppName}');
125+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', 'FriendlyAppName', '{#MyAppName}');
126+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.avf\OpenWithProgids', '', '{#MyAppName}.avf');
127+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.avf', '','{#MyAppName}.avf');
128+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\DefaultIcon', '', ExpandConstant('{app}\media\AVF.ico,0'));
129+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\shell\open\command', '', ExpandConstant('"' + ExpandConstant('{app}\{#AppPath}\{#MyAppExeName}') + '" "%1"'));
130+
end
131+
else
132+
begin
133+
RegDeleteValue(HKEY_CLASSES_ROOT, '.avf\OpenWithProgids', '');
134+
RegDeleteValue(HKEY_CLASSES_ROOT, '.avf', '');
135+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\shell\open\command');
136+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\DefaultIcon');
137+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf');
138+
end;
139+
140+
if EVFCheckbox.Checked then
141+
begin
142+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', '','{#MyAppName}');
143+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', 'FriendlyAppName', '{#MyAppName}');
144+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.evf\OpenWithProgids', '', '{#MyAppName}.evf');
145+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.evf', '','{#MyAppName}.evf');
146+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\DefaultIcon', '', ExpandConstant('{app}\media\EVF.ico,0'));
147+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\shell\open\command', '', ExpandConstant('"' + ExpandConstant('{app}\{#AppPath}\{#MyAppExeName}') + '" "%1"'));
148+
end
149+
else
150+
begin
151+
RegDeleteValue(HKEY_CLASSES_ROOT, '.evf\OpenWithProgids', '');
152+
RegDeleteValue(HKEY_CLASSES_ROOT, '.evf', '');
153+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\shell\open\command');
154+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\DefaultIcon');
155+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf');
156+
end;
157+
158+
if RMVCheckbox.Checked then
159+
begin
160+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', '','{#MyAppName}');
161+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', 'FriendlyAppName', '{#MyAppName}');
162+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.rmv\OpenWithProgids', '', '{#MyAppName}.rmv');
163+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.rmv', '','{#MyAppName}.rmv');
164+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\DefaultIcon', '', ExpandConstant('{app}\media\RMV.ico,0'));
165+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\shell\open\command', '', ExpandConstant('"' + ExpandConstant('{app}\{#AppPath}\{#MyAppExeName}') + '" "%1"'));
166+
end
167+
else
168+
begin
169+
RegDeleteValue(HKEY_CLASSES_ROOT, '.rmv\OpenWithProgids', '');
170+
RegDeleteValue(HKEY_CLASSES_ROOT, '.rmv', '');
171+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\shell\open\command');
172+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\DefaultIcon');
173+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv');
174+
end;
175+
176+
if MVFCheckbox.Checked then
177+
begin
178+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', '','{#MyAppName}');
179+
RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}', 'FriendlyAppName', '{#MyAppName}');
180+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.mvf\OpenWithProgids', '', '{#MyAppName}.rmv');
181+
RegWriteStringValue(HKEY_CLASSES_ROOT, '.mvf', '','{#MyAppName}.mvf');
182+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\DefaultIcon', '', ExpandConstant('{app}\media\MVF.ico,0'));
183+
RegWriteStringValue(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\shell\open\command', '', ExpandConstant('"' + ExpandConstant('{app}\{#AppPath}\{#MyAppExeName}') + '" "%1"'));
184+
end
185+
else
186+
begin
187+
RegDeleteValue(HKEY_CLASSES_ROOT, '.mvf\OpenWithProgids', '');
188+
RegDeleteValue(HKEY_CLASSES_ROOT, '.mvf', '');
189+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\shell\open\command');
190+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\DefaultIcon');
191+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf');
192+
end;
193+
end;
194+
end;
195+
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
196+
begin
197+
if CurUninstallStep = usPostUninstall then
198+
begin
199+
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\Applications\{#MyAppExeName}');
200+
201+
RegDeleteValue(HKEY_CLASSES_ROOT, '.avf\OpenWithProgids', '');
202+
RegDeleteValue(HKEY_CLASSES_ROOT, '.avf', '');
203+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\shell\open\command');
204+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf\DefaultIcon');
205+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.avf');
206+
207+
RegDeleteValue(HKEY_CLASSES_ROOT, '.evf\OpenWithProgids', '');
208+
RegDeleteValue(HKEY_CLASSES_ROOT, '.evf', '');
209+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\shell\open\command');
210+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf\DefaultIcon');
211+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.evf');
212+
213+
RegDeleteValue(HKEY_CLASSES_ROOT, '.rmv\OpenWithProgids', '');
214+
RegDeleteValue(HKEY_CLASSES_ROOT, '.rmv', '');
215+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\shell\open\command');
216+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv\DefaultIcon');
217+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.rmv');
218+
219+
RegDeleteValue(HKEY_CLASSES_ROOT, '.mvf\OpenWithProgids', '');
220+
RegDeleteValue(HKEY_CLASSES_ROOT, '.mvf', '');
221+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\shell\open\command');
222+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf\DefaultIcon');
223+
RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '{#MyAppName}.mvf');
224+
end;
225+
end;
226+
procedure InitializeWizard;
227+
begin
228+
FileAssociationPage;
229+
end;

media/AVF.ico

4.19 KB
Binary file not shown.

media/EVF.ico

4.19 KB
Binary file not shown.

media/MVF.ico

4.19 KB
Binary file not shown.

media/RMV.ico

4.19 KB
Binary file not shown.

0 commit comments

Comments
 (0)