Mercurial > vim
annotate src/uninstall.c @ 32645:779ca4c65eeb v9.0.1654
patch 9.0.1654: MS-Windows: test for default 'viewdir' fails
Commit: https://github.com/vim/vim/commit/813b7a85f2489e9f698239a9fee17c64da68f435
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jun 23 22:56:47 2023 +0100
patch 9.0.1654: MS-Windows: test for default 'viewdir' fails
Problem: MS-Windows: test for default 'viewdir' fails.
Solution: Escape the pattern.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 24 Jun 2023 00:00:06 +0200 |
parents | 1009c33499e7 |
children | 1629cc65d78d |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
8212
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
18174
1ec6539cef68
patch 8.1.2082: some files have a weird name to fit in 8.3 characters
Bram Moolenaar <Bram@vim.org>
parents:
15941
diff
changeset
|
11 * uninstall.c: Minimalistic uninstall program for Vim on MS-Windows |
7 | 12 * Removes: |
13 * - the "Edit with Vim" popup menu entry | |
14 * - the Vim "Open With..." popup menu entry | |
15 * - any Vim Batch files in the path | |
16 * - icons for Vim on the Desktop | |
17 * - the Vim entry in the Start Menu | |
18 */ | |
19 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
20 // Include common code for dosinst.c and uninstall.c. |
7 | 21 #include "dosinst.h" |
22 | |
23 /* | |
24 * Return TRUE if the user types a 'y' or 'Y', FALSE otherwise. | |
25 */ | |
26 static int | |
27 confirm(void) | |
28 { | |
29 char answer[10]; | |
30 | |
31 fflush(stdout); | |
32 return (scanf(" %c", answer) == 1 && toupper(answer[0]) == 'Y'); | |
33 } | |
34 | |
2475
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
35 static int |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
36 reg_delete_key(HKEY hRootKey, const char *key, DWORD flag) |
2475
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
37 { |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
38 static int did_load = FALSE; |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
39 static HANDLE advapi_lib = NULL; |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
40 static LONG (WINAPI *delete_key_ex)(HKEY, LPCTSTR, REGSAM, DWORD) = NULL; |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
41 |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
42 if (!did_load) |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
43 { |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
44 // The RegDeleteKeyEx() function is only available on new systems. It |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
45 // is required for 64-bit registry access. For other systems fall |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
46 // back to RegDeleteKey(). |
2475
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
47 did_load = TRUE; |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
48 advapi_lib = LoadLibrary("ADVAPI32.DLL"); |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
49 if (advapi_lib != NULL) |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
50 delete_key_ex = (LONG (WINAPI *)(HKEY, LPCTSTR, REGSAM, DWORD))GetProcAddress(advapi_lib, "RegDeleteKeyExA"); |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
51 } |
31804
50555279168b
patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents:
19431
diff
changeset
|
52 if (delete_key_ex != NULL) |
50555279168b
patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents:
19431
diff
changeset
|
53 { |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
54 return (*delete_key_ex)(hRootKey, key, flag, 0); |
2475
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
55 } |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
56 return RegDeleteKey(hRootKey, key); |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
57 } |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
58 |
7 | 59 /* |
60 * Check if the popup menu entry exists and what gvim it refers to. | |
61 * Returns non-zero when it's found. | |
62 */ | |
63 static int | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
64 popup_gvim_path(char *buf, DWORD bufsize) |
7 | 65 { |
66 HKEY key_handle; | |
67 DWORD value_type; | |
68 int r; | |
69 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
70 // Open the key where the path to gvim.exe is stored. |
2449
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
71 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0, |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
72 KEY_WOW64_64KEY | KEY_READ, &key_handle) != ERROR_SUCCESS) |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
73 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0, |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
74 KEY_WOW64_32KEY | KEY_READ, &key_handle) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
75 return 0; |
7 | 76 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
77 // get the DisplayName out of it to show the user |
7 | 78 r = RegQueryValueEx(key_handle, "path", 0, |
79 &value_type, (LPBYTE)buf, &bufsize); | |
80 RegCloseKey(key_handle); | |
81 | |
82 return (r == ERROR_SUCCESS); | |
83 } | |
84 | |
85 /* | |
86 * Check if the "Open With..." menu entry exists and what gvim it refers to. | |
87 * Returns non-zero when it's found. | |
88 */ | |
89 static int | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
90 openwith_gvim_path(char *buf, DWORD bufsize) |
7 | 91 { |
92 HKEY key_handle; | |
93 DWORD value_type; | |
94 int r; | |
95 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
96 // Open the key where the path to gvim.exe is stored. |
7 | 97 if (RegOpenKeyEx(HKEY_CLASSES_ROOT, |
2449
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
98 "Applications\\gvim.exe\\shell\\edit\\command", 0, |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
99 KEY_WOW64_64KEY | KEY_READ, &key_handle) != ERROR_SUCCESS) |
7 | 100 return 0; |
101 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
102 // get the DisplayName out of it to show the user |
7 | 103 r = RegQueryValueEx(key_handle, "", 0, &value_type, (LPBYTE)buf, &bufsize); |
104 RegCloseKey(key_handle); | |
105 | |
106 return (r == ERROR_SUCCESS); | |
107 } | |
108 | |
109 static void | |
110 remove_popup(void) | |
111 { | |
112 int fail = 0; | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
113 int i; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
114 int loop = is_64bit_os() ? 2 : 1; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
115 int maxfail = loop * 6; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
116 DWORD flag; |
7 | 117 HKEY kh; |
118 | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
119 for (i = 0; i < loop; i++) |
7 | 120 { |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
121 if (i == 0) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
122 flag = KEY_WOW64_32KEY; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
123 else |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
124 flag = KEY_WOW64_64KEY; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
125 |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
126 if (reg_delete_key(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}\\InProcServer32", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
127 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
128 if (reg_delete_key(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
129 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
130 if (reg_delete_key(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\gvim", flag) != ERROR_SUCCESS) |
7 | 131 ++fail; |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
132 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", 0, |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
133 flag | KEY_ALL_ACCESS, &kh) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
134 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
135 else |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
136 { |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
137 if (RegDeleteValue(kh, "{51EEE242-AD87-11d3-9C1E-0090278BBD99}") != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
138 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
139 RegCloseKey(kh); |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
140 } |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
141 if (reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
142 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
143 if (reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Vim", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
144 ++fail; |
7 | 145 } |
146 | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
147 if (fail == maxfail) |
7 | 148 printf("No Vim popup registry entries could be removed\n"); |
149 else if (fail > 0) | |
150 printf("Some Vim popup registry entries could not be removed\n"); | |
151 else | |
152 printf("The Vim popup registry entries have been removed\n"); | |
153 } | |
154 | |
155 static void | |
156 remove_openwith(void) | |
157 { | |
158 int fail = 0; | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
159 int i; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
160 int loop = is_64bit_os() ? 2 : 1; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
161 int maxfail = loop * 7; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
162 DWORD flag; |
7 | 163 |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
164 for (i = 0; i < loop; i++) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
165 { |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
166 if (i == 0) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
167 flag = KEY_WOW64_32KEY; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
168 else |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
169 flag = KEY_WOW64_64KEY; |
7 | 170 |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
171 if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit\\command", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
172 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
173 if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
174 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
175 if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
176 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
177 if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
178 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
179 if (reg_delete_key(HKEY_CLASSES_ROOT, ".htm\\OpenWithList\\gvim.exe", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
180 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
181 if (reg_delete_key(HKEY_CLASSES_ROOT, ".vim\\OpenWithList\\gvim.exe", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
182 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
183 if (reg_delete_key(HKEY_CLASSES_ROOT, "*\\OpenWithList\\gvim.exe", flag) != ERROR_SUCCESS) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
184 ++fail; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
185 } |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
186 |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
187 if (fail == maxfail) |
7 | 188 printf("No Vim open-with registry entries could be removed\n"); |
189 else if (fail > 0) | |
190 printf("Some Vim open-with registry entries could not be removed\n"); | |
191 else | |
192 printf("The Vim open-with registry entries have been removed\n"); | |
193 } | |
194 | |
195 /* | |
196 * Check if a batch file is really for the current version. Don't delete a | |
197 * batch file that was written for another (possibly newer) version. | |
198 */ | |
199 static int | |
200 batfile_thisversion(char *path) | |
201 { | |
202 FILE *fd; | |
203 char line[BUFSIZE]; | |
19431
9800e126eaa2
patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents:
19356
diff
changeset
|
204 int key_len = strlen(VIMBAT_UNINSTKEY); |
7 | 205 int found = FALSE; |
206 | |
207 fd = fopen(path, "r"); | |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
208 if (fd == NULL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
209 return FALSE; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
210 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
211 while (fgets(line, sizeof(line), fd) != NULL) |
7 | 212 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
213 if (strncmp(line, VIMBAT_UNINSTKEY, key_len) == 0) |
7 | 214 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
215 found = TRUE; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
216 break; |
7 | 217 } |
218 } | |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
219 fclose(fd); |
7 | 220 return found; |
221 } | |
222 | |
223 static int | |
224 remove_batfiles(int doit) | |
225 { | |
226 char *batfile_path; | |
227 int i; | |
228 int found = 0; | |
229 | |
19356
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
230 // avoid looking in the "installdir" by chdir to system root |
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
231 mch_chdir(sysdrive); |
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
232 mch_chdir("\\"); |
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
233 |
7 | 234 for (i = 1; i < TARGET_COUNT; ++i) |
235 { | |
236 batfile_path = searchpath_save(targets[i].batname); | |
237 if (batfile_path != NULL && batfile_thisversion(batfile_path)) | |
238 { | |
239 ++found; | |
240 if (doit) | |
241 { | |
242 printf("removing %s\n", batfile_path); | |
243 remove(batfile_path); | |
244 } | |
245 else | |
246 printf(" - the batch file %s\n", batfile_path); | |
247 free(batfile_path); | |
248 } | |
249 } | |
19356
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
250 |
f559be3c53d7
patch 8.2.0236: MS-Windows unintall doesn't delete vimtutur.bat
Bram Moolenaar <Bram@vim.org>
parents:
18816
diff
changeset
|
251 mch_chdir(installdir); |
7 | 252 return found; |
253 } | |
254 | |
255 static void | |
256 remove_if_exists(char *path, char *filename) | |
257 { | |
258 char buf[BUFSIZE]; | |
259 FILE *fd; | |
260 | |
261 sprintf(buf, "%s\\%s", path, filename); | |
262 | |
263 fd = fopen(buf, "r"); | |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
264 if (fd == NULL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
265 return; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
266 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
267 fclose(fd); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
268 printf("removing %s\n", buf); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
269 remove(buf); |
7 | 270 } |
271 | |
272 static void | |
273 remove_icons(void) | |
274 { | |
275 char path[BUFSIZE]; | |
276 int i; | |
277 | |
278 if (get_shell_folder_path(path, "desktop")) | |
279 for (i = 0; i < ICON_COUNT; ++i) | |
280 remove_if_exists(path, icon_link_names[i]); | |
281 } | |
282 | |
283 static void | |
284 remove_start_menu(void) | |
285 { | |
286 char path[BUFSIZE]; | |
287 int i; | |
288 struct stat st; | |
289 | |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
290 if (get_shell_folder_path(path, VIM_STARTMENU) == FAIL) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
291 return; |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
292 |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
293 for (i = 1; i < TARGET_COUNT; ++i) |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
294 remove_if_exists(path, targets[i].lnkname); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
295 remove_if_exists(path, "uninstall.lnk"); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
296 remove_if_exists(path, "Help.lnk"); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
297 // Win95 uses .pif, WinNT uses .lnk |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
298 remove_if_exists(path, "Vim tutor.pif"); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
299 remove_if_exists(path, "Vim tutor.lnk"); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
300 remove_if_exists(path, "Vim online.url"); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
301 if (stat(path, &st) == 0) |
7 | 302 { |
31827
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
303 printf("removing %s\n", path); |
1009c33499e7
patch 9.0.1246: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31804
diff
changeset
|
304 rmdir(path); |
7 | 305 } |
306 } | |
307 | |
308 static void | |
309 delete_uninstall_key(void) | |
310 { | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
311 reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Vim " VIM_VERSION_SHORT, KEY_WOW64_64KEY); |
7 | 312 } |
313 | |
314 int | |
315 main(int argc, char *argv[]) | |
316 { | |
317 int found = 0; | |
318 FILE *fd; | |
319 int i; | |
320 struct stat st; | |
321 char icon[BUFSIZE]; | |
15892
e43b5e6d9190
patch 8.1.0952: compilation warnings when building the MS-Windows installer
Bram Moolenaar <Bram@vim.org>
parents:
12626
diff
changeset
|
322 char path[MAX_PATH]; |
e43b5e6d9190
patch 8.1.0952: compilation warnings when building the MS-Windows installer
Bram Moolenaar <Bram@vim.org>
parents:
12626
diff
changeset
|
323 char popup_path[MAX_PATH]; |
7 | 324 |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
325 // The nsis uninstaller calls us with a "-nsis" argument. |
7 | 326 if (argc == 2 && stricmp(argv[1], "-nsis") == 0) |
327 interactive = FALSE; | |
328 else | |
329 interactive = TRUE; | |
330 | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
331 // Initialize this program. |
7 | 332 do_inits(argv); |
333 | |
334 printf("This program will remove the following items:\n"); | |
335 | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
336 if (popup_gvim_path(popup_path, sizeof(popup_path))) |
7 | 337 { |
338 printf(" - the \"Edit with Vim\" entry in the popup menu\n"); | |
339 printf(" which uses \"%s\"\n", popup_path); | |
2217
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
340 if (interactive) |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
341 printf("\nRemove it (y/n)? "); |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
342 if (!interactive || confirm()) |
7 | 343 { |
344 remove_popup(); | |
18816
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
345 // Assume the "Open With" entry can be removed as well, don't |
15539899a112
patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
346 // bother the user with asking him again. |
7 | 347 remove_openwith(); |
348 } | |
349 } | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
350 else if (openwith_gvim_path(popup_path, sizeof(popup_path))) |
7 | 351 { |
352 printf(" - the Vim \"Open With...\" entry in the popup menu\n"); | |
353 printf(" which uses \"%s\"\n", popup_path); | |
354 printf("\nRemove it (y/n)? "); | |
355 if (confirm()) | |
356 remove_openwith(); | |
357 } | |
358 | |
359 if (get_shell_folder_path(path, "desktop")) | |
360 { | |
361 printf("\n"); | |
362 for (i = 0; i < ICON_COUNT; ++i) | |
363 { | |
364 sprintf(icon, "%s\\%s", path, icon_link_names[i]); | |
365 if (stat(icon, &st) == 0) | |
366 { | |
367 printf(" - the \"%s\" icon on the desktop\n", icon_names[i]); | |
368 ++found; | |
369 } | |
370 } | |
371 if (found > 0) | |
372 { | |
373 if (interactive) | |
374 printf("\nRemove %s (y/n)? ", found > 1 ? "them" : "it"); | |
375 if (!interactive || confirm()) | |
376 remove_icons(); | |
377 } | |
378 } | |
379 | |
380 if (get_shell_folder_path(path, VIM_STARTMENU) | |
381 && stat(path, &st) == 0) | |
382 { | |
383 printf("\n - the \"%s\" entry in the Start Menu\n", VIM_STARTMENU); | |
384 if (interactive) | |
385 printf("\nRemove it (y/n)? "); | |
386 if (!interactive || confirm()) | |
387 remove_start_menu(); | |
388 } | |
389 | |
390 printf("\n"); | |
391 found = remove_batfiles(0); | |
392 if (found > 0) | |
393 { | |
394 if (interactive) | |
395 printf("\nRemove %s (y/n)? ", found > 1 ? "them" : "it"); | |
396 if (!interactive || confirm()) | |
397 remove_batfiles(1); | |
398 } | |
399 | |
400 fd = fopen("gvim.exe", "r"); | |
401 if (fd != NULL) | |
402 { | |
403 fclose(fd); | |
404 printf("gvim.exe detected. Attempting to unregister gvim with OLE\n"); | |
405 system("gvim.exe -silent -unregister"); | |
406 } | |
407 | |
408 delete_uninstall_key(); | |
409 | |
410 if (interactive) | |
411 { | |
412 printf("\nYou may now want to delete the Vim executables and runtime files.\n"); | |
413 printf("(They are still where you unpacked them.)\n"); | |
414 } | |
415 | |
2217
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
416 if (interactive) |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
417 { |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
418 rewind(stdin); |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
419 printf("\nPress Enter to exit..."); |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
420 (void)getchar(); |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
421 } |
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
422 else |
2287
573da4dac306
Make the dos installer work with more compilers.
Bram Moolenaar <bram@vim.org>
parents:
2217
diff
changeset
|
423 sleep(3); |
7 | 424 |
425 return 0; | |
426 } |