Akihiro Sagawa : oleaut32/tests: Test UnRegisterTypeLib surely deletes registry keys.
Alexandre Julliard
julliard at winehq.org
Wed Jun 11 13:36:24 CDT 2014
Module: wine
Branch: master
Commit: 3f65a86959c1471fe52da2b659474ad848c59cf3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3f65a86959c1471fe52da2b659474ad848c59cf3
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Sun Jun 1 20:30:03 2014 +0900
oleaut32/tests: Test UnRegisterTypeLib surely deletes registry keys.
---
dlls/oleaut32/tests/typelib.c | 50 +++++++++++++++++++++++++++++++++++++----
1 file changed, 46 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 7abd606..dcf56d1 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -74,6 +74,7 @@ static BOOL (WINAPI *pActivateActCtx)(HANDLE,ULONG_PTR*);
static HANDLE (WINAPI *pCreateActCtxW)(PCACTCTXW);
static BOOL (WINAPI *pDeactivateActCtx)(DWORD,ULONG_PTR);
static VOID (WINAPI *pReleaseActCtx)(HANDLE);
+static BOOL (WINAPI *pIsWow64Process)(HANDLE,LPBOOL);
static const WCHAR wszStdOle2[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
static WCHAR wszGUID[] = {'G','U','I','D',0};
@@ -172,6 +173,7 @@ static void init_function_pointers(void)
pCreateActCtxW = (void *)GetProcAddress(hk32, "CreateActCtxW");
pDeactivateActCtx = (void *)GetProcAddress(hk32, "DeactivateActCtx");
pReleaseActCtx = (void *)GetProcAddress(hk32, "ReleaseActCtx");
+ pIsWow64Process = (void *)GetProcAddress(hk32, "IsWow64Process");
}
static void ref_count_test(LPCWSTR type_lib)
@@ -4195,6 +4197,8 @@ static void test_register_typelib(BOOL system_registration)
LONG ret, expect_ret;
UINT count, i;
HKEY hkey;
+ REGSAM opposite = (sizeof(void*) == 8 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
+ BOOL is_wow64 = FALSE;
struct
{
TYPEKIND kind;
@@ -4224,6 +4228,9 @@ static void test_register_typelib(BOOL system_registration)
return;
}
+ if (pIsWow64Process)
+ pIsWow64Process(GetCurrentProcess(), &is_wow64);
+
filenameA = create_test_typelib(3);
MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH);
@@ -4250,7 +4257,6 @@ static void test_register_typelib(BOOL system_registration)
{
ITypeInfo *typeinfo;
TYPEATTR *attr;
- REGSAM opposite = (sizeof(void*) == 8 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
hr = ITypeLib_GetTypeInfo(typelib, i, &typeinfo);
ok(hr == S_OK, "got %08x\n", hr);
@@ -4301,9 +4307,12 @@ static void test_register_typelib(BOOL system_registration)
if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
/* 32-bit typelibs should be registered into both registry bit modes */
- ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
- ok(ret == expect_ret, "%d: got %d\n", i, ret);
- if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
+ if (is_win64 || is_wow64)
+ {
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
+ ok(ret == expect_ret, "%d: got %d\n", i, ret);
+ if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
+ }
ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
ITypeInfo_Release(typeinfo);
@@ -4315,6 +4324,39 @@ static void test_register_typelib(BOOL system_registration)
hr = pUnRegisterTypeLibForUser(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, is_win64 ? SYS_WIN64 : SYS_WIN32);
ok(hr == S_OK, "got %08x\n", hr);
+ for(i = 0; i < count; i++)
+ {
+ ITypeInfo *typeinfo;
+ TYPEATTR *attr;
+
+ hr = ITypeLib_GetTypeInfo(typelib, i, &typeinfo);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ if((attr->typekind == TKIND_INTERFACE && (attr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
+ attr->typekind == TKIND_DISPATCH)
+ {
+ StringFromGUID2(&attr->guid, uuidW, sizeof(uuidW) / sizeof(uuidW[0]));
+ WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
+ sprintf(key_name, "Interface\\%s", uuid);
+
+ ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ, &hkey);
+ ok(ret == ERROR_FILE_NOT_FOUND, "Interface registry remains in %s (%d)\n", key_name, i);
+ 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);
+ ITypeInfo_Release(typeinfo);
+ }
+
ITypeLib_Release(typelib);
DeleteFileA( filenameA );
}
More information about the wine-cvs
mailing list