Andrew Nguyen : oleaut32/tests: Test typelib registration in the user registry.

Alexandre Julliard julliard at winehq.org
Fri Jul 30 10:24:17 CDT 2010


Module: wine
Branch: master
Commit: ce8c450d83a0b2e32290effd58ca69cd9f0572be
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ce8c450d83a0b2e32290effd58ca69cd9f0572be

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Fri Jul 30 07:44:19 2010 -0500

oleaut32/tests: Test typelib registration in the user registry.

---

 dlls/oleaut32/tests/typelib.c |   44 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 8a1fccb..9843327 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -55,8 +55,19 @@
 
 #define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08x\n", hr)
 
+static HRESULT WINAPI (*pRegisterTypeLibForUser)(ITypeLib*,OLECHAR*,OLECHAR*);
+static HRESULT WINAPI (*pUnRegisterTypeLibForUser)(REFGUID,WORD,WORD,LCID,SYSKIND);
+
 static const WCHAR wszStdOle2[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
 
+static void init_function_pointers(void)
+{
+    HMODULE hmod = GetModuleHandleA("oleaut32.dll");
+
+    pRegisterTypeLibForUser = (void *)GetProcAddress(hmod, "RegisterTypeLibForUser");
+    pUnRegisterTypeLibForUser = (void *)GetProcAddress(hmod, "UnRegisterTypeLibForUser");
+}
+
 static void ref_count_test(LPCWSTR type_lib)
 {
     ITypeLib *iface;
@@ -2173,7 +2184,7 @@ static void test_create_typelibs(void)
 }
 
 
-static void test_register_typelib(void)
+static void test_register_typelib(BOOL system_registration)
 {
     HRESULT hr;
     WCHAR filename[MAX_PATH];
@@ -2203,13 +2214,32 @@ static void test_register_typelib(void)
         { TKIND_DISPATCH,  TYPEFLAG_FDISPATCHABLE }
     };
 
+    trace("Starting %s typelib registration tests\n",
+          system_registration ? "system" : "user");
+
+    if (!system_registration && (!pRegisterTypeLibForUser || !pUnRegisterTypeLibForUser))
+    {
+        win_skip("User typelib registration functions are not available\n");
+        return;
+    }
+
     filenameA = create_test_typelib(3);
     MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH);
 
     hr = LoadTypeLibEx(filename, REGKIND_NONE, &typelib);
     ok(SUCCEEDED(hr), "got %08x\n", hr);
 
-    hr = RegisterTypeLib(typelib, filename, NULL);
+    if (system_registration)
+        hr = RegisterTypeLib(typelib, filename, NULL);
+    else
+        hr = pRegisterTypeLibForUser(typelib, filename, NULL);
+    if (hr == TYPE_E_REGISTRYACCESS)
+    {
+        win_skip("Insufficient privileges to register typelib in the registry\n");
+        ITypeLib_Release(typelib);
+        DeleteFileA(filenameA);
+        return;
+    }
     ok(SUCCEEDED(hr), "got %08x\n", hr);
 
     count = ITypeLib_GetTypeInfoCount(typelib);
@@ -2272,7 +2302,10 @@ static void test_register_typelib(void)
         ITypeInfo_Release(typeinfo);
     }
 
-    hr = UnRegisterTypeLib(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
+    if (system_registration)
+        hr = UnRegisterTypeLib(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
+    else
+        hr = pUnRegisterTypeLibForUser(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
     ok(SUCCEEDED(hr), "got %08x\n", hr);
 
     ITypeLib_Release(typelib);
@@ -2283,6 +2316,8 @@ START_TEST(typelib)
 {
     const char *filename;
 
+    init_function_pointers();
+
     ref_count_test(wszStdOle2);
     test_TypeComp();
     test_CreateDispTypeInfo();
@@ -2297,7 +2332,8 @@ START_TEST(typelib)
         DeleteFile( filename );
     }
 
-    test_register_typelib();
+    test_register_typelib(TRUE);
+    test_register_typelib(FALSE);
     test_create_typelibs();
 
 }




More information about the wine-cvs mailing list