Akihiro Sagawa : oleaut32: Delete opposite side keys on UnRegisterTypeLib.
Alexandre Julliard
julliard at winehq.org
Wed Jun 11 13:36:24 CDT 2014
Module: wine
Branch: master
Commit: 86b7fc3829b3891c359090f0d12b447f9cd0a4ea
URL: http://source.winehq.org/git/wine.git/?a=commit;h=86b7fc3829b3891c359090f0d12b447f9cd0a4ea
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Sun Jun 1 20:30:05 2014 +0900
oleaut32: Delete opposite side keys on UnRegisterTypeLib.
---
dlls/oleaut32/tests/typelib.c | 3 ---
dlls/oleaut32/typelib.c | 39 ++++++++++++++++++++++++++-------------
2 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index dcf56d1..312195b 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -4347,10 +4347,7 @@ static void test_register_typelib(BOOL system_registration)
if (is_win64 || is_wow64)
{
ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
- todo_wine {
ok(ret == ERROR_FILE_NOT_FOUND, "Interface registry remains in %s (%d)\n", key_name, i);
- if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
- }
}
}
ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index d4fd22e..48b171b 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -838,6 +838,24 @@ HRESULT WINAPI RegisterTypeLib(
return res;
}
+static void TLB_unregister_interface(GUID *guid, REGSAM flag)
+{
+ WCHAR subKeyName[50];
+ HKEY subKey;
+
+ /* the path to the type */
+ get_interface_key( guid, subKeyName );
+
+ /* Delete its bits */
+ if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE | flag, &subKey) != ERROR_SUCCESS)
+ return;
+
+ RegDeleteKeyW(subKey, ProxyStubClsidW);
+ RegDeleteKeyW(subKey, ProxyStubClsid32W);
+ RegDeleteKeyW(subKey, TypeLibW);
+ RegCloseKey(subKey);
+ RegDeleteKeyExW(HKEY_CLASSES_ROOT, subKeyName, flag, 0);
+}
/******************************************************************************
* UnRegisterTypeLib [OLEAUT32.186]
@@ -863,7 +881,6 @@ HRESULT WINAPI UnRegisterTypeLib(
DWORD i = 0;
BOOL deleteOtherStuff;
HKEY key = NULL;
- HKEY subKey = NULL;
TYPEATTR* typeAttr = NULL;
TYPEKIND kind;
ITypeInfo* typeInfo = NULL;
@@ -922,19 +939,16 @@ HRESULT WINAPI UnRegisterTypeLib(
if ((kind == TKIND_INTERFACE && (typeAttr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
kind == TKIND_DISPATCH)
{
- /* the path to the type */
- get_interface_key( &typeAttr->guid, subKeyName );
+ BOOL is_wow64;
+ REGSAM opposite = (sizeof(void*) == 8 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
- /* Delete its bits */
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS)
- goto enddeleteloop;
+ TLB_unregister_interface(&typeAttr->guid, 0);
- RegDeleteKeyW(subKey, ProxyStubClsidW);
- RegDeleteKeyW(subKey, ProxyStubClsid32W);
- RegDeleteKeyW(subKey, TypeLibW);
- RegCloseKey(subKey);
- subKey = NULL;
- RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName);
+ /* unregister TLBs into the opposite registry view, too */
+ if(opposite == KEY_WOW64_32KEY ||
+ (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64)) {
+ TLB_unregister_interface(&typeAttr->guid, opposite);
+ }
}
enddeleteloop:
@@ -980,7 +994,6 @@ enddeleteloop:
end:
SysFreeString(tlibPath);
if (typeLib) ITypeLib_Release(typeLib);
- if (subKey) RegCloseKey(subKey);
if (key) RegCloseKey(key);
return result;
}
More information about the wine-cvs
mailing list