- removed unnecessary recursion
- upon query failure on main primary lcid and secondary lcid,
  attempts a query on system lcid (0)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 20f7c9d..364655f 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -94,35 +94,75 @@
 	WORD wMaj,	/* [in] major version */
 	WORD wMin,	/* [in] minor version */
 	LCID lcid,	/* [in] locale id */
-	LPBSTR path	/* [out] path of typelib */
-) {
-	char	xguid[80];
-	char	typelibkey[100],pathname[260];
-	DWORD	plen;
+	LPBSTR path )	/* [out] path of typelib */
+{
+    /* don't need to ZeroMemory those arrays since sprintf and RegQueryValue add
+       string termination character on output strings */
 
-       	TRACE("\n");
+    HRESULT hr        = E_FAIL;
 
-	if (HIWORD(guid)) {
-            sprintf( typelibkey, "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win32",
-                     guid->Data1, guid->Data2, guid->Data3,
-                     guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
-                     guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7],
-                     wMaj,wMin,lcid);
-	} else {
-		sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);
-		FIXME("(%s,%d,%d,0x%04lx,%p),stub!\n",xguid,wMaj,wMin,(DWORD)lcid,path);
-		return E_FAIL;
-	}
-	plen = sizeof(pathname);
-	if (RegQueryValueA(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {
-		/* try again without lang specific id */
-		if (SUBLANGID(lcid))
-			return QueryPathOfRegTypeLib(guid,wMaj,wMin,PRIMARYLANGID(lcid),path);
-		FIXME("key %s not found\n",typelibkey);
-		return E_FAIL;
-	}
-	*path = HEAP_strdupAtoW(GetProcessHeap(),0,pathname);
-	return S_OK;
+    DWORD   dwPathLen = _MAX_PATH;
+    LCID    myLCID    = lcid;
+
+    char    szXGUID[80];
+    char    szTypeLibKey[100];
+    char    szPath[dwPathLen];
+
+    if ( !HIWORD(guid) )
+    {
+        sprintf(szXGUID,
+            "<guid 0x%08lx>",
+            (DWORD) guid);
+
+        FIXME("(%s,%d,%d,0x%04lx,%p),stub!\n", szXGUID, wMaj, wMin, (DWORD)lcid, path);
+        return E_FAIL;
+    }
+
+    while (hr != S_OK)
+    {
+        sprintf(szTypeLibKey,
+            "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win32",
+            guid->Data1,    guid->Data2,    guid->Data3,
+            guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], 
+            guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7],
+            wMaj,
+            wMin,
+            myLCID);
+
+        if (RegQueryValueA(HKEY_LOCAL_MACHINE, szTypeLibKey, szPath, &dwPathLen))
+        {
+            if (myLCID == lcid)
+            {
+                /* try with sub-langid */
+                myLCID = SUBLANGID(lcid);
+            }
+            else if (myLCID == SUBLANGID(lcid))
+            {
+                /* try with system langid */
+                myLCID = 0;
+            }
+            else
+            {
+                break;
+            }
+        }
+        else
+        {
+            DWORD len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szPath, dwPathLen, NULL, 0 );
+            BSTR bstrPath = SysAllocStringLen(NULL,len);
+
+            MultiByteToWideChar(CP_ACP,
+                                MB_PRECOMPOSED,
+                                szPath,
+                                dwPathLen,
+                                bstrPath,
+                                len);
+           *path = bstrPath;
+           hr = S_OK;
+        }
+    }
+
+    return hr;
 }
 
 /******************************************************************************