1
0
forked from aniani/vim

Windows uninstaller: Instead of calling RegDeleteKeyEx() directly load it

dynamically from the .dll.  Should work everywhere.
This commit is contained in:
Bram Moolenaar
2010-08-02 23:06:46 +02:00
parent 61a91766f7
commit bf65051b7b
3 changed files with 41 additions and 27 deletions

View File

@@ -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];