From eebbeef9446edb45a7b1390ad2cb5d5dcb5dd787 Mon Sep 17 00:00:00 2001 From: Ove Kaaven Date: Fri, 21 Sep 2001 21:00:37 +0000 Subject: [PATCH] Register typelib marshaling for OLE Automation-compatible interfaces. --- dlls/oleaut32/oleaut32.spec | 4 +-- dlls/oleaut32/typelib.c | 86 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/dlls/oleaut32/oleaut32.spec b/dlls/oleaut32/oleaut32.spec index deeb2232fff..9734216a8cb 100644 --- a/dlls/oleaut32/oleaut32.spec +++ b/dlls/oleaut32/oleaut32.spec @@ -144,14 +144,14 @@ debug_channels (ole typelib) 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 diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index c8dbb2b7838..56ad7258776 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -345,6 +345,9 @@ HRESULT WINAPI RegisterTypeLib( 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 @@ HRESULT WINAPI RegisterTypeLib( else res = E_FAIL; + /* register OLE Automation-compatible interfaces for this typelib */ + types = ITypeLib_GetTypeInfoCount(ptlib); + for (tidx=0; tidxguid), + 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; } -- 2.11.4.GIT