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