typelib registration patch

Ove Kaaven ovehk at ping.uio.no
Thu Sep 20 15:02:14 CDT 2001


I thought I sent this off already, but maybe it got lost, I'll try agian.

---------- Forwarded message ----------
Date: Sun, 16 Sep 2001 18:42:23 +0200 (CEST)
From: Ove Kaaven <ovehk at ping.uio.no>
To: wine-patches at winehq.com
Subject: typelib registration

Log:
Ove Kaaven <ovek at transgaming.com>
Register typelib marshaling for OLE Automation-compatible interfaces.

Index: dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.31
diff -u -r1.31 oleaut32.spec
--- dlls/oleaut32/oleaut32.spec	2001/08/18 16:06:30	1.31
+++ dlls/oleaut32/oleaut32.spec	2001/09/16 15:26:03
@@ -144,14 +144,14 @@
 160 stdcall CreateTypeLib(long wstr ptr) CreateTypeLib
 161 stdcall LoadTypeLib (wstr ptr) LoadTypeLib
 162 stdcall LoadRegTypeLib (ptr long long long ptr) LoadRegTypeLib
-163 stdcall RegisterTypeLib(ptr str str) RegisterTypeLib
+163 stdcall RegisterTypeLib(ptr wstr wstr) RegisterTypeLib
 164 stdcall QueryPathOfRegTypeLib(ptr long long long ptr) QueryPathOfRegTypeLib
 165 stdcall LHashValOfNameSys(long long wstr) LHashValOfNameSys
 166 stdcall LHashValOfNameSysA(long long str) LHashValOfNameSysA
 170 stdcall OaBuildVersion() OaBuildVersion
 171 stub ClearCustData
 180 stub CreateTypeLib2
-183 stdcall LoadTypeLibEx (ptr long ptr) LoadTypeLibEx
+183 stdcall LoadTypeLibEx (wstr long ptr) LoadTypeLibEx
 184 stdcall SystemTimeToVariantTime(ptr ptr) SystemTimeToVariantTime
 185 stdcall VariantTimeToSystemTime(double ptr) VariantTimeToSystemTime
 186 stdcall UnRegisterTypeLib (ptr long long long long) UnRegisterTypeLib
Index: dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.45
diff -u -r1.45 typelib.c
--- dlls/oleaut32/typelib.c	2001/09/10 23:13:28	1.45
+++ dlls/oleaut32/typelib.c	2001/09/16 15:26:06
@@ -345,6 +345,9 @@
     LPSTR guidA;
     CHAR keyName[120];
     HKEY key, subKey;
+    UINT types, tidx;
+    TYPEKIND kind;
+    static const char *PSOA = "{00020424-0000-0000-C000-000000000046}";
 
     if (ptlib == NULL || szFullPath == NULL)
         return E_INVALIDARG;
@@ -403,7 +406,90 @@
     else
         res = E_FAIL;
 
+    /* register OLE Automation-compatible interfaces for this typelib */
+    types = ITypeLib_GetTypeInfoCount(ptlib);
+    for (tidx=0; tidx<types; tidx++) {
+	if (SUCCEEDED(ITypeLib_GetTypeInfoType(ptlib, tidx, &kind))) {
+	    LPOLESTR name = NULL;
+	    ITypeInfo *tinfo = NULL;
+	    BOOL stop = FALSE;
+	    ITypeLib_GetDocumentation(ptlib, tidx, &name, NULL, NULL, NULL);
+	    switch (kind) {
+	    case TKIND_INTERFACE:
+		TRACE_(typelib)("%d: interface %s\n", tidx, debugstr_w(name));
+		ITypeLib_GetTypeInfo(ptlib, tidx, &tinfo);
+		break;
+	    case TKIND_DISPATCH:
+		TRACE_(typelib)("%d: dispinterface %s\n", tidx, debugstr_w(name));
+		/* ITypeLib_GetTypeInfo(ptlib, tidx, &tinfo); */
+		break;
+	    case TKIND_COCLASS:
+		TRACE_(typelib)("%d: coclass %s\n", tidx, debugstr_w(name));
+		/* coclasses should probably not be registered? */
+		break;
+	    default:
+		TRACE_(typelib)("%d: %s\n", tidx, debugstr_w(name));
+		break;
+	    }
+	    if (tinfo) {
+		TYPEATTR *tattr = NULL;
+		ITypeInfo_GetTypeAttr(tinfo, &tattr);
+		if (tattr) {
+		    TRACE_(typelib)("guid=%s, flags=%04x\n",
+				    debugstr_guid(&tattr->guid),
+				    tattr->wTypeFlags);
+		    if (tattr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION) {
+			/* register interface<->typelib coupling */
+			StringFromGUID2(&tattr->guid, guid, 80);
+			guidA = HEAP_strdupWtoA(GetProcessHeap(), 0, guid);
+			snprintf(keyName, sizeof(keyName), "Interface\\%s", guidA);
+			HeapFree(GetProcessHeap(), 0, guidA);
+
+			if (RegCreateKeyExA(HKEY_CLASSES_ROOT, keyName, 0, NULL, 0,
+					    KEY_WRITE, NULL, &key, NULL) == ERROR_SUCCESS) {
+			    if (name)
+				RegSetValueExW(key, NULL, 0, REG_SZ,
+					       (BYTE *)name, lstrlenW(name) * sizeof(OLECHAR));
+
+			    if (RegCreateKeyExA(key, "ProxyStubClsid", 0, NULL, 0,
+				KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS) {
+				RegSetValueExA(subKey, NULL, 0, REG_SZ,
+					       PSOA, strlen(PSOA));
+				RegCloseKey(subKey);
+			    }
+			    if (RegCreateKeyExA(key, "ProxyStubClsid32", 0, NULL, 0,
+				KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS) {
+				RegSetValueExA(subKey, NULL, 0, REG_SZ,
+					       PSOA, strlen(PSOA));
+				RegCloseKey(subKey);
+			    }
+
+			    if (RegCreateKeyExA(key, "TypeLib", 0, NULL, 0,
+				KEY_WRITE, NULL, &subKey, NULL) == ERROR_SUCCESS) {
+				CHAR ver[32];
+				StringFromGUID2(&attr->guid, guid, 80);
+				snprintf(ver, sizeof(ver), "%x.%x",
+					 attr->wMajorVerNum, attr->wMinorVerNum);
+				RegSetValueExW(subKey, NULL, 0, REG_SZ,
+					       (BYTE *)guid, lstrlenW(guid) * sizeof(OLECHAR));
+				RegSetValueExA(subKey, "Version", 0, REG_SZ,
+					       ver, lstrlenA(ver));
+				RegCloseKey(subKey);
+			    }
+			    RegCloseKey(key);
+			}
+		    }
+		    ITypeInfo_ReleaseTypeAttr(tinfo, tattr);
+		}
+		ITypeInfo_Release(tinfo);
+	    }
+	    SysFreeString(name);
+	    if (stop) break;
+	}
+    }
+
     ITypeLib_ReleaseTLibAttr(ptlib, attr);
+
     return res;
 }
 






More information about the wine-patches mailing list