oleaut32: Make QueryPathOfRegTypeLib test pass under Wine.

This commit is contained in:
Dmitry Timoshkov 2006-10-23 20:28:37 +09:00 committed by Alexandre Julliard
parent a1914dbbb8
commit 20c40e0659
2 changed files with 53 additions and 7 deletions

View file

@ -541,13 +541,9 @@ static void test_QueryPathOfRegTypeLib(void)
{ 1, 0, TYPE_E_LIBNOTREGISTERED, { 0 } },
{ 3, 0, S_OK, {'f','a','k','e','_','3','_','0','.','d','l','l',0 } },
{ 3, 1, S_OK, {'f','a','k','e','_','3','_','1','.','d','l','l',0 } },
#if 0 /* todo: enable once properly implemented */
{ 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
#endif
{ 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
#if 0 /* todo: enable once properly implemented */
{ 3, 40, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
#endif
{ 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }
};
static const WCHAR base[] = {'f','a','k','e',0};

View file

@ -149,6 +149,55 @@ static void FromLEDWords(void *p_Val, int p_iSize)
#define FromLEDWords(X,Y) /*nothing*/
#endif
/*
* Find a typelib key which matches a requested maj.min version.
*/
static BOOL find_typelib_key( REFGUID guid, WORD *wMaj, WORD *wMin )
{
static const WCHAR typelibW[] = {'T','y','p','e','l','i','b','\\',0};
WCHAR buffer[60];
char key_name[16];
DWORD len, i;
INT best_min = -1;
HKEY hkey;
memcpy( buffer, typelibW, sizeof(typelibW) );
StringFromGUID2( guid, buffer + strlenW(buffer), 40 );
if (RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey ) != ERROR_SUCCESS)
return FALSE;
len = sizeof(key_name);
i = 0;
while (RegEnumKeyExA(hkey, i++, key_name, &len, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
INT v_maj, v_min;
if (sscanf(key_name, "%u.%u", &v_maj, &v_min) == 2)
{
TRACE("found %s: %u.%u\n", debugstr_w(buffer), v_maj, v_min);
if (*wMaj == v_maj)
{
if (*wMin == v_min)
{
best_min = v_min;
break; /* exact match */
}
if (v_min > best_min) best_min = v_min;
}
}
len = sizeof(key_name);
}
RegCloseKey( hkey );
if (best_min >= 0)
{
*wMin = best_min;
return TRUE;
}
return FALSE;
}
/* get the path of a typelib key, in the form "Typelib\\<guid>\\<maj>.<min>" */
/* buffer must be at least 60 characters long */
static WCHAR *get_typelib_key( REFGUID guid, WORD wMaj, WORD wMin, WCHAR *buffer )
@ -230,6 +279,7 @@ HRESULT WINAPI QueryPathOfRegTypeLib(
TRACE_(typelib)("(%s, %x.%x, 0x%x, %p)\n", debugstr_guid(guid), wMaj, wMin, lcid, path);
if (!find_typelib_key( guid, &wMaj, &wMin )) return TYPE_E_LIBNOTREGISTERED;
get_typelib_key( guid, wMaj, wMin, buffer );
res = RegOpenKeyExW( HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hkey );
@ -708,7 +758,7 @@ HRESULT WINAPI UnRegisterTypeLib(
}
/* Try and open the key to the type library. */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, keyName, 0, KEY_READ | KEY_WRITE, &key) != S_OK) {
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, keyName, 0, KEY_READ | KEY_WRITE, &key) != ERROR_SUCCESS) {
result = E_INVALIDARG;
goto end;
}
@ -742,7 +792,7 @@ HRESULT WINAPI UnRegisterTypeLib(
get_interface_key( &typeAttr->guid, subKeyName );
/* Delete its bits */
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != S_OK) {
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) {
goto enddeleteloop;
}
RegDeleteKeyW(subKey, ProxyStubClsidW);
@ -770,7 +820,7 @@ enddeleteloop:
tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
deleteOtherStuff = TRUE;
i = 0;
while(RegEnumKeyExW(key, i++, subKeyName, &tmpLength, NULL, NULL, NULL, NULL) == S_OK) {
while(RegEnumKeyExW(key, i++, subKeyName, &tmpLength, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
tmpLength = sizeof(subKeyName)/sizeof(WCHAR);
/* if its not FLAGS or HELPDIR, then we must keep the rest of the key */