Bernhard Kölbl : oleaut32: Allow the registration of 64bit typelibs from a 32bit context.
Alexandre Julliard
julliard at winehq.org
Tue Apr 12 13:38:03 CDT 2022
Module: wine
Branch: oldstable
Commit: 4bde9d09a3fdbf36cfa1a951a5824993cc362316
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4bde9d09a3fdbf36cfa1a951a5824993cc362316
Author: Bernhard Kölbl <besentv at gmail.com>
Date: Wed Oct 20 16:21:38 2021 +0200
oleaut32: Allow the registration of 64bit typelibs from a 32bit context.
Windows allows the registration of 64bit typelibs from 32bit programs
even on a pure Win32 install.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51864
Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit c159f5438aab5eeb795955d9270892e5c2d38cc3)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/oleaut32/tests/typelib.c | 180 ++++++++++++++++++++++++++++++++++++++++++
dlls/oleaut32/typelib.c | 4 -
2 files changed, 180 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 825851c948e..78290c94dfe 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -6848,6 +6848,185 @@ static void test_register_typelib(BOOL system_registration)
DeleteFileW(filename);
}
+static void test_register_typelib_64(void)
+{
+ ICreateTypeInfo *createti, *createti_co;
+ ELEMDESC elemdesc[5], elemdesc2[5];
+ FUNCDESC funcdesc, funcdesc2;
+ ITypeInfo *unknown, *tinfo;
+ ITypeLib *stdole, *typelib;
+ ICreateTypeLib2 *createtl;
+ WCHAR filename[MAX_PATH];
+ HREFTYPE hreftype;
+ HRESULT hr;
+
+ static const WCHAR wszStdOle2[] = { 's','t','d','o','l','e','2','.','t','l','b',0 };
+
+ static OLECHAR typelibW[] = { 'W','i','n','e','T','e','s','t','T','y','p','e','L','i','b',0};
+ static OLECHAR helpfileW[] = { 'C',':','\\','b','o','g','u','s','.','h','l','p',0 };
+ static OLECHAR dllfileW[] = { 'C',':','\\','b','o','g','u','s','.','d','l','l',0 };
+ static OLECHAR interface1W[] = { 'I','T','e','s','t','W','i','n','e','6', '4', 0};
+ static OLECHAR coclassW[] = {'W','i','n','e','T','e','s','t','C','o','c','l','a','s','s',0 };
+ static OLECHAR func1W[] = { 'f','u','n','c','1',0 };
+ static OLECHAR func2W[] = { 'f','u','n','c','2',0 };
+ static OLECHAR param1W[] = { 'p','a','r','a','m','1',0 };
+ static OLECHAR param2W[] = { 'p','a','r','a','m','2',0 };
+ static OLECHAR *names1[] = { func1W, param1W, param2W };
+ static OLECHAR *names2[] = { func2W, param1W };
+ static const GUID tlcustguid = { 0x512d2fec,0xcaf6,0x4c33,{0xbc,0x38,0x84,0x2f,0x2e,0x37,0x0d,0x7b} };
+ static const GUID coclassguid = { 0x317cd4dd,0x0ce0,0x4525,{0x8d,0x33,0x68,0x14,0x4c,0x53,0x60,0xe9} };
+ static const GUID interfaceguid = { 0x35cc5cea,0x11cc,0x4bca,{0x89,0x8c,0xf8,0x92,0x8e,0xb8,0xda,0x24} };
+
+ static const SYSKIND sys = SYS_WIN64;
+
+ hr = LoadTypeLib(wszStdOle2, &stdole);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &unknown);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ GetTempFileNameW(L".", L"tlb", 0, filename);
+
+ hr = CreateTypeLib2(sys, filename, &createtl);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_SetName(createtl, typelibW);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_SetHelpFileName(createtl, helpfileW);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_SetHelpStringDll(createtl, dllfileW);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_SetGuid(createtl, &tlcustguid);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_SetVersion(createtl, 1, 0);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_CreateTypeInfo(createtl, coclassW, TKIND_COCLASS, &createti_co);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_LayOut(createti);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetGuid(createti, &interfaceguid);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetVersion(createti, 1, 0);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ elemdesc[0].tdesc.vt = VT_UINT;
+ U(elemdesc[0]).idldesc.dwReserved = 0;
+ U(elemdesc[0]).idldesc.wIDLFlags = IDLFLAG_FIN;
+
+ elemdesc[1].tdesc.vt = VT_DECIMAL;
+ U(elemdesc[1]).idldesc.dwReserved = 0;
+ U(elemdesc[1]).idldesc.wIDLFlags = IDLFLAG_FIN;
+
+ memset(&funcdesc, 0, sizeof(FUNCDESC));
+ funcdesc.funckind = FUNC_PUREVIRTUAL;
+ funcdesc.invkind = INVOKE_FUNC;
+ funcdesc.callconv = CC_STDCALL;
+ funcdesc.cParams = 2;
+ funcdesc.memid = 0x1;
+ funcdesc.elemdescFunc.tdesc.vt = VT_HRESULT;
+ funcdesc.lprgelemdescParam = elemdesc;
+
+ hr = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ elemdesc2[0].tdesc.vt = VT_UINT;
+ U(elemdesc2[0]).idldesc.dwReserved = 0;
+ U(elemdesc2[0]).idldesc.wIDLFlags = IDLFLAG_FIN | IDLFLAG_FOUT;
+
+ memset(&funcdesc2, 0, sizeof(FUNCDESC));
+ funcdesc2.funckind = FUNC_PUREVIRTUAL;
+ funcdesc2.invkind = INVOKE_FUNC;
+ funcdesc.callconv = CC_STDCALL;
+ funcdesc2.cParams = 1;
+ funcdesc2.memid = 0x2;
+ funcdesc2.elemdescFunc.tdesc.vt = VT_HRESULT;
+ funcdesc2.lprgelemdescParam = elemdesc2;
+
+ hr = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc2);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetFuncHelpContext(createti, 1, 0xabcdefab);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 3);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, names2, 2);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetTypeFlags(createti, TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FNONEXTENSIBLE | TYPEFLAG_FDUAL);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&tinfo);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ITypeInfo_GetRefTypeOfImplType(tinfo, 0, &hreftype);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetGuid(createti_co, &coclassguid);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_AddRefTypeInfo(createti_co, tinfo, &hreftype);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_AddImplType(createti_co, 0, hreftype);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_SetImplTypeFlags(createti_co, 0, IMPLTYPEFLAG_FDEFAULT);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ hr = ICreateTypeInfo_Release(createti_co);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ ICreateTypeInfo_Release(createti);
+
+ hr = ICreateTypeLib2_SaveAllChanges(createtl);
+ ok(hr == S_OK, "got %08x\n", hr);
+
+ ICreateTypeLib2_Release(createtl);
+
+ trace("TypeLib to load: %ls\n", filename);
+ hr = LoadTypeLibEx(filename, REGKIND_NONE, &typelib);
+ ok(hr == S_OK, "got: %08x\n", hr);
+
+ if(typelib)
+ {
+ hr = RegisterTypeLib(typelib, filename, NULL);
+ if (hr == TYPE_E_REGISTRYACCESS)
+ {
+ win_skip("Insufficient privileges to register typelib in the registry\n");
+ ITypeLib_Release(typelib);
+ DeleteFileW(filename);
+ return;
+ }
+ ok(hr == S_OK, "got: %08x\n", hr);
+
+ ITypeLib_Release(typelib);
+ }
+
+ DeleteFileW(filename);
+}
+
static void test_LoadTypeLib(void)
{
ITypeLib *tl;
@@ -8351,6 +8530,7 @@ START_TEST(typelib)
test_register_typelib(TRUE);
test_register_typelib(FALSE);
+ test_register_typelib_64();
test_create_typelibs();
test_LoadTypeLib();
test_TypeInfo2_GetContainingTypeLib();
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 4669b03d5fc..b6550b69fa3 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -629,10 +629,6 @@ HRESULT WINAPI RegisterTypeLib(ITypeLib *ptlib, const WCHAR *szFullPath, const W
if (FAILED(ITypeLib_GetLibAttr(ptlib, &attr)))
return E_FAIL;
-#ifndef _WIN64
- if (attr->syskind == SYS_WIN64) return TYPE_E_BADMODULEKIND;
-#endif
-
get_typelib_key( &attr->guid, attr->wMajorVerNum, attr->wMinorVerNum, keyName );
res = S_OK;
More information about the wine-cvs
mailing list