Mercurial > vim
annotate src/uninstal.c @ 16351:f1ef4271f2ef
Added tag v8.1.1180 for changeset ffa791471a4cbe2a594514a5f94af21c2f723d61
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 17 Apr 2019 17:00:06 +0200 |
parents | b9098585d945 |
children |
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 /* | |
11 * uninstal.c: Minimalistic uninstall program for Vim on MS-Windows | |
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 | |
20 /* Include common code for dosinst.c and uninstal.c. */ | |
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 { |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
44 /* The RegDeleteKeyEx() function is only available on new systems. It |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
45 * is required for 64-bit registry access. For other systems fall |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
46 * back to RegDeleteKey(). */ |
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 } |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
52 if (delete_key_ex != NULL) { |
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
|
53 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
|
54 } |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
55 return RegDeleteKey(hRootKey, key); |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
56 } |
7d1044b27eb5
Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it
Bram Moolenaar <bram@vim.org>
parents:
2466
diff
changeset
|
57 |
7 | 58 /* |
59 * Check if the popup menu entry exists and what gvim it refers to. | |
60 * Returns non-zero when it's found. | |
61 */ | |
62 static int | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
63 popup_gvim_path(char *buf, DWORD bufsize) |
7 | 64 { |
65 HKEY key_handle; | |
66 DWORD value_type; | |
67 int r; | |
68 | |
69 /* 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
|
70 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
|
71 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
|
72 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
|
73 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
|
74 return 0; |
7 | 75 |
76 /* get the DisplayName out of it to show the user */ | |
77 r = RegQueryValueEx(key_handle, "path", 0, | |
78 &value_type, (LPBYTE)buf, &bufsize); | |
79 RegCloseKey(key_handle); | |
80 | |
81 return (r == ERROR_SUCCESS); | |
82 } | |
83 | |
84 /* | |
85 * Check if the "Open With..." menu entry exists and what gvim it refers to. | |
86 * Returns non-zero when it's found. | |
87 */ | |
88 static int | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
89 openwith_gvim_path(char *buf, DWORD bufsize) |
7 | 90 { |
91 HKEY key_handle; | |
92 DWORD value_type; | |
93 int r; | |
94 | |
95 /* Open the key where the path to gvim.exe is stored. */ | |
96 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
|
97 "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
|
98 KEY_WOW64_64KEY | KEY_READ, &key_handle) != ERROR_SUCCESS) |
7 | 99 return 0; |
100 | |
101 /* get the DisplayName out of it to show the user */ | |
102 r = RegQueryValueEx(key_handle, "", 0, &value_type, (LPBYTE)buf, &bufsize); | |
103 RegCloseKey(key_handle); | |
104 | |
105 return (r == ERROR_SUCCESS); | |
106 } | |
107 | |
108 static void | |
109 remove_popup(void) | |
110 { | |
111 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
|
112 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
|
113 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
|
114 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
|
115 DWORD flag; |
7 | 116 HKEY kh; |
117 | |
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
|
118 for (i = 0; i < loop; i++) |
7 | 119 { |
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
|
120 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
|
121 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
|
122 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
|
123 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
|
124 |
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 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
|
126 ++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
|
127 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
|
128 ++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
|
129 if (reg_delete_key(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\gvim", flag) != ERROR_SUCCESS) |
7 | 130 ++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
|
131 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
|
132 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
|
133 ++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
|
134 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
|
135 { |
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 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
|
137 ++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
|
138 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
|
139 } |
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 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
|
141 ++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
|
142 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
|
143 ++fail; |
7 | 144 } |
145 | |
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
|
146 if (fail == maxfail) |
7 | 147 printf("No Vim popup registry entries could be removed\n"); |
148 else if (fail > 0) | |
149 printf("Some Vim popup registry entries could not be removed\n"); | |
150 else | |
151 printf("The Vim popup registry entries have been removed\n"); | |
152 } | |
153 | |
154 static void | |
155 remove_openwith(void) | |
156 { | |
157 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
|
158 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
|
159 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
|
160 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
|
161 DWORD flag; |
7 | 162 |
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
|
163 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
|
164 { |
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 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
|
166 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
|
167 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
|
168 flag = KEY_WOW64_64KEY; |
7 | 169 |
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
|
170 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
|
171 ++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
|
172 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
|
173 ++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
|
174 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
|
175 ++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
|
176 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
|
177 ++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
|
178 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
|
179 ++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
|
180 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
|
181 ++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
|
182 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
|
183 ++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
|
184 } |
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 if (fail == maxfail) |
7 | 187 printf("No Vim open-with registry entries could be removed\n"); |
188 else if (fail > 0) | |
189 printf("Some Vim open-with registry entries could not be removed\n"); | |
190 else | |
191 printf("The Vim open-with registry entries have been removed\n"); | |
192 } | |
193 | |
194 /* | |
195 * Check if a batch file is really for the current version. Don't delete a | |
196 * batch file that was written for another (possibly newer) version. | |
197 */ | |
198 static int | |
199 batfile_thisversion(char *path) | |
200 { | |
201 FILE *fd; | |
202 char line[BUFSIZE]; | |
203 char *p; | |
204 int ver_len = strlen(VIM_VERSION_NODOT); | |
205 int found = FALSE; | |
206 | |
207 fd = fopen(path, "r"); | |
208 if (fd != NULL) | |
209 { | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
210 while (fgets(line, sizeof(line), fd) != NULL) |
7 | 211 { |
212 for (p = line; *p != 0; ++p) | |
213 /* don't accept "vim60an" when looking for "vim60". */ | |
214 if (strnicmp(p, VIM_VERSION_NODOT, ver_len) == 0 | |
215 && !isdigit(p[ver_len]) | |
216 && !isalpha(p[ver_len])) | |
217 { | |
218 found = TRUE; | |
219 break; | |
220 } | |
221 if (found) | |
222 break; | |
223 } | |
224 fclose(fd); | |
225 } | |
226 return found; | |
227 } | |
228 | |
229 static int | |
230 remove_batfiles(int doit) | |
231 { | |
232 char *batfile_path; | |
233 int i; | |
234 int found = 0; | |
235 | |
236 for (i = 1; i < TARGET_COUNT; ++i) | |
237 { | |
238 batfile_path = searchpath_save(targets[i].batname); | |
239 if (batfile_path != NULL && batfile_thisversion(batfile_path)) | |
240 { | |
241 ++found; | |
242 if (doit) | |
243 { | |
244 printf("removing %s\n", batfile_path); | |
245 remove(batfile_path); | |
246 } | |
247 else | |
248 printf(" - the batch file %s\n", batfile_path); | |
249 free(batfile_path); | |
250 } | |
251 } | |
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"); | |
264 if (fd != NULL) | |
265 { | |
266 fclose(fd); | |
267 printf("removing %s\n", buf); | |
268 remove(buf); | |
269 } | |
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 | |
290 if (get_shell_folder_path(path, VIM_STARTMENU)) | |
291 { | |
292 for (i = 1; i < TARGET_COUNT; ++i) | |
293 remove_if_exists(path, targets[i].lnkname); | |
294 remove_if_exists(path, "uninstall.lnk"); | |
295 remove_if_exists(path, "Help.lnk"); | |
296 /* Win95 uses .pif, WinNT uses .lnk */ | |
297 remove_if_exists(path, "Vim tutor.pif"); | |
298 remove_if_exists(path, "Vim tutor.lnk"); | |
299 remove_if_exists(path, "Vim online.url"); | |
300 if (stat(path, &st) == 0) | |
301 { | |
302 printf("removing %s\n", path); | |
303 rmdir(path); | |
304 } | |
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 |
325 /* The nsis uninstaller calls us with a "-nsis" argument. */ | |
326 if (argc == 2 && stricmp(argv[1], "-nsis") == 0) | |
327 interactive = FALSE; | |
328 else | |
329 interactive = TRUE; | |
330 | |
331 /* Initialize this program. */ | |
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(); | |
345 /* Assume the "Open With" entry can be removed as well, don't | |
346 * bother the user with asking him again. */ | |
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 } |