changeset 2475:7d1044b27eb5 vim73

Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it dynamically from the .dll. Should work everywhere.
author Bram Moolenaar <bram@vim.org>
date Mon, 02 Aug 2010 23:06:46 +0200
parents a29301e7c05f
children 6be86488996b
files runtime/doc/todo.txt src/dosinst.h src/uninstal.c
diffstat 3 files changed, 41 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -33,6 +33,10 @@ be worked on, but only if you sponsor Vi
 Using uninitialized memory when crypting an empty file. (Dominique Pelle, 2010
 Aug 2)
 
+Go back to MSVC 2008, so that Windows 2000 is supported?
+
+For 'undoreload': put the cursor on the first line that is different.
+
 Before release 7.3:
 - Rename vim73 branch to default (hints: Xavier de Gaye, 2010 May 23)
 
--- a/src/dosinst.h
+++ b/src/dosinst.h
@@ -89,7 +89,6 @@ char *searchpath(char *name);
  */
 # ifndef KEY_WOW64_64KEY
 #  define KEY_WOW64_64KEY 0x0100
-#  define RegDeleteKeyEx(a, b, c, d) RegDeleteKey(a, b)
 # endif
 
 #define VIM_STARTMENU "Programs\\Vim " VIM_VERSION_SHORT
--- a/src/uninstal.c
+++ b/src/uninstal.c
@@ -33,6 +33,30 @@ confirm(void)
 }
 
 #ifdef WIN3264
+
+    static int
+reg_delete_key(HKEY hRootKey, const char *key)
+{
+    static int did_load = FALSE;
+    static HANDLE advapi_lib = NULL;
+    static LONG (WINAPI *delete_key_ex)(HKEY, LPCTSTR, REGSAM, DWORD) = NULL;
+
+    if (!did_load)
+    {
+	/* The RegDeleteKeyEx() function is only available on new systems.  It
+	 * is required for 64-bit registry access.  For other systems fall
+	 * back to RegDeleteKey(). */
+	did_load = TRUE;
+	advapi_lib = LoadLibrary("ADVAPI32.DLL");
+	if (advapi_lib != NULL)
+	    delete_key_ex = (LONG (WINAPI *)(HKEY, LPCTSTR, REGSAM, DWORD))GetProcAddress(advapi_lib, "RegDeleteKeyExA");
+    }
+    if (delete_key_ex != NULL) {
+	return (*delete_key_ex)(hRootKey, key, KEY_WOW64_64KEY, 0);
+    }
+    return RegDeleteKey(hRootKey, key);
+}
+
 /*
  * Check if the popup menu entry exists and what gvim it refers to.
  * Returns non-zero when it's found.
@@ -89,14 +113,11 @@ remove_popup(void)
     int		fail = 0;
     HKEY	kh;
 
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}\\InProcServer32",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}\\InProcServer32") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\gvim",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\gvim") != ERROR_SUCCESS)
 	++fail;
     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", 0,
 		      KEY_WOW64_64KEY | KEY_ALL_ACCESS, &kh) != ERROR_SUCCESS)
@@ -107,11 +128,9 @@ remove_popup(void)
 	    ++fail;
 	RegCloseKey(kh);
     }
-    if (RegDeleteKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Vim") != ERROR_SUCCESS)
 	++fail;
 
     if (fail == 6)
@@ -127,26 +146,19 @@ remove_openwith(void)
 {
     int		fail = 0;
 
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit\\command",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit\\command") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "Applications\\gvim.exe",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "Applications\\gvim.exe") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, ".htm\\OpenWithList\\gvim.exe",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, ".htm\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, ".vim\\OpenWithList\\gvim.exe",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, ".vim\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
 	++fail;
-    if (RegDeleteKeyEx(HKEY_CLASSES_ROOT, "*\\OpenWithList\\gvim.exe",
-		KEY_WOW64_64KEY, 0) != ERROR_SUCCESS)
+    if (reg_delete_key(HKEY_CLASSES_ROOT, "*\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
 	++fail;
 
     if (fail == 7)
@@ -302,8 +314,7 @@ win95(void)
 delete_uninstall_key(void)
 {
 #ifdef WIN3264
-    RegDeleteKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Vim " VIM_VERSION_SHORT,
-	    KEY_WOW64_64KEY, 0);
+    reg_delete_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Vim " VIM_VERSION_SHORT);
 #else
     FILE	*fd;
     char	buf[BUFSIZE];