ReactOS 0.4.17-dev-357-ga8f14ff
typelib.c File Reference
#include <wine/test.h>
#include <stdarg.h>
#include <stdio.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
#include "objbase.h"
#include "oleauto.h"
#include "ocidl.h"
#include "shlwapi.h"
#include "tmarshal.h"
#include "olectl.h"
#include "test_reg.h"
#include "test_tlb.h"
#include "test_simple.h"
Include dependency graph for typelib.c:

Go to the source code of this file.

Classes

struct  _variant_info
 
struct  _custdata_info
 
struct  _element_info
 
struct  _function_info
 
struct  _var_info
 
struct  _type_info
 
struct  _TDATest
 

Macros

#define COBJMACROS
 
#define CONST_VTABLE
 
#define expect_eq(expr, value, type, format)   { type _ret = (expr); ok((value) == _ret, #expr " expected " format " got " format "\n", value, _ret); }
 
#define expect_int(expr, value)   expect_eq(expr, (int)(value), int, "%d")
 
#define expect_hex(expr, value)   expect_eq(expr, (int)(value), int, "0x%x")
 
#define expect_null(expr)   expect_eq(expr, NULL, const void *, "%p")
 
#define expect_guid(expected, guid)   { ok(IsEqualGUID(expected, guid), "got wrong guid %s\n", wine_dbgstr_guid(guid)); }
 
#define expect_wstr_acpval(expr, value)
 
#define ole_expect(expr, expect)
 
#define ole_check(expr)   ole_expect(expr, S_OK);
 
#define ok_ole_success(hr, func)   ok(hr == S_OK, #func " failed with error %#08lx\n", hr)
 
#define ARCH   "none"
 
#define EXPECT_REF(obj, ref)   _expect_ref((IUnknown*)obj, ref, __LINE__)
 
#define check_variant_info(value, expected)
 
#define check_type(elem, info)
 
#define AUX_HREF   1
 
#define AUX_TDESC   2
 
#define AUX_ADESC   3
 

Typedefs

typedef struct _variant_info variant_info
 
typedef struct _custdata_info custdata_info
 
typedef struct _element_info element_info
 
typedef struct _function_info function_info
 
typedef struct _var_info var_info
 
typedef struct _type_info type_info
 

Functions

static void _expect_ref (IUnknown *obj, ULONG ref, int line)
 
static HRESULT (WINAPI *pRegisterTypeLibForUser)(ITypeLib *
 
static BOOL (WINAPI *pIsWow64Process)(HANDLE
 
static LONG (WINAPI *pRegDeleteKeyExW)(HKEY
 
static BOOL compare_wstr (const WCHAR *wstr, const WCHAR *ref)
 
static HRESULT WINAPI collection_QueryInterface (ICollection *iface, REFIID riid, void **ret)
 
static ULONG WINAPI collection_AddRef (ICollection *iface)
 
static ULONG WINAPI collection_Release (ICollection *iface)
 
static HRESULT WINAPI collection_GetTypeInfoCount (ICollection *iface, UINT *cnt)
 
static HRESULT WINAPI collection_GetTypeInfo (ICollection *iface, UINT index, LCID lcid, ITypeInfo **ti)
 
static HRESULT WINAPI collection_GetIDsOfNames (ICollection *iface, REFIID riid, LPOLESTR *names, UINT cnt, LCID lcid, DISPID *dispid)
 
static HRESULT WINAPI collection_Invoke (ICollection *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr)
 
static HRESULT WINAPI collection_Item (ICollection *iface, int i, int *p)
 
static HRESULT WINAPI invoketest_QueryInterface (IInvokeTest *iface, REFIID riid, void **ret)
 
static ULONG WINAPI invoketest_AddRef (IInvokeTest *iface)
 
static ULONG WINAPI invoketest_Release (IInvokeTest *iface)
 
static HRESULT WINAPI invoketest_GetTypeInfoCount (IInvokeTest *iface, UINT *cnt)
 
static HRESULT WINAPI invoketest_GetTypeInfo (IInvokeTest *iface, UINT index, LCID lcid, ITypeInfo **ti)
 
static HRESULT WINAPI invoketest_GetIDsOfNames (IInvokeTest *iface, REFIID riid, LPOLESTR *names, UINT cnt, LCID lcid, DISPID *dispid)
 
static HRESULT WINAPI invoketest_Invoke (IInvokeTest *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr)
 
static LONG WINAPI invoketest_get_test (IInvokeTest *iface, LONG i)
 
static LONG WINAPI invoketest_putref_testprop (IInvokeTest *iface, LONG *i)
 
static LONG WINAPI invoketest_putref_testprop2 (IInvokeTest *iface, IUnknown *i)
 
static HRESULT WINAPI invoketest_testfunc (IInvokeTest *iface, int i, int *p)
 
static HRESULT WINAPI invoketest_testget (IInvokeTest *iface, ICollection **p)
 
static LONG WINAPI invoketest_get_testget2 (IInvokeTest *iface, int *value)
 
static int WINAPI invoketest_get_testget3 (IInvokeTest *iface)
 
static int WINAPI invoketest_get_testget4 (IInvokeTest *iface, int value)
 
static int WINAPI invoketest_get_testget5 (IInvokeTest *iface, int *value1, int value2)
 
static int WINAPI invoketest_get_testget6 (IInvokeTest *iface, int value1, int value2)
 
static void WINAPI invoketest_get_testget7 (IInvokeTest *iface, int value1, int value2)
 
static void WINAPI invoketest_get_testget8 (IInvokeTest *iface, int *value)
 
static void WINAPI invoketest_get_testput8 (IInvokeTest *iface, int value)
 
static void init_function_pointers (void)
 
static void ref_count_test (LPCWSTR type_lib)
 
static void test_TypeComp (void)
 
static void test_CreateDispTypeInfo (void)
 
static void write_typelib (int res_no, const WCHAR *filename)
 
static void test_invoke_func (ITypeInfo *typeinfo)
 
static WCHARcreate_test_typelib (int res_no)
 
static void test_TypeInfo (void)
 
static int WINAPI int_func (int a0, int a1, int a2, int a3, int a4)
 
static double WINAPI double_func (double a0, float a1, double a2, int a3)
 
static LONGLONG WINAPI longlong_func (LONGLONG a0, CY a1)
 
static VARIANT WINAPI variant_func (int a0, BOOL a1, DECIMAL a2, VARIANT a3)
 
static int CDECL void_func (int a0, int a1)
 
static int WINAPI stdcall_func (int a)
 
static int WINAPI inst_func (void *inst, int a)
 
static HRESULT WINAPI ret_false_func (void)
 
static VARIANT WINAPI variant_func2 (VARIANT v1, VARIANT v2)
 
static void WINAPI inst_func2 (void *inst, VARIANT *ret, VARIANT v1, VARIANT v2)
 
static void test_DispCallFunc (void)
 
static LSTATUS myRegDeleteTreeW (HKEY hKey, LPCWSTR lpszSubKey, REGSAM view)
 
static BOOL do_typelib_reg_key (GUID *uid, WORD maj, WORD min, DWORD arch, LPCWSTR base, BOOL remove)
 
static void test_QueryPathOfRegTypeLib (DWORD arch)
 
static void test_inheritance (void)
 
static void test_CreateTypeLib (SYSKIND sys)
 
static void parse_guid (LPCSTR strGuid, GUID *guid)
 
static void test_dump_typelib (const WCHAR *name)
 
static void test_create_typelib_lcid (LCID lcid)
 
static void test_create_typelibs (void)
 
static void test_register_typelib (BOOL system_registration)
 
static void test_register_typelib_64 (void)
 
static void test_LoadTypeLib (void)
 
static void test_SetVarHelpContext (void)
 
static void test_SetFuncAndParamNames (void)
 
static void test_SetDocString (void)
 
static void test_FindName (void)
 
static void test_TypeInfo2_GetContainingTypeLib (void)
 
static void create_manifest_file (const char *filename, const char *manifest)
 
static HANDLE create_actctx (const char *file)
 
static void test_LoadRegTypeLib (void)
 
static void testTDA (ITypeLib *tl, struct _TDATest *TDATest, ULONG ptr_size, HREFTYPE hreftype, ULONG href_cbSizeInstance, WORD href_cbAlignment, BOOL create)
 
static void test_SetTypeDescAlias (SYSKIND kind)
 
static void test_GetLibAttr (void)
 
static HRESULT WINAPI uk_QueryInterface (IUnknown *obj, REFIID iid, void **out)
 
static ULONG WINAPI uk_AddRef (IUnknown *obj)
 
static ULONG WINAPI uk_Release (IUnknown *obj)
 
static void test_stub (void)
 
static void test_dep (SYSKIND sys)
 
static void test_DeleteImplType (void)
 
static void test_DeleteFuncDesc (void)
 
 START_TEST (typelib)
 

Variables

static OLECHAR OLECHAR *static WORD
 
static OLECHAR OLECHAR *static LCID
 
static OLECHAR OLECHAR *static SYSKIND
 
static LPBOOL
 
static LPCWSTR
 
static REGSAM
 
static DWORD
 
static const WCHAR wszStdOle2 [] = {'s','t','d','o','l','e','2','.','t','l','b',0}
 
static WCHAR wszGUID [] = {'G','U','I','D',0}
 
static WCHAR wszguid [] = {'g','u','i','d',0}
 
static const BOOL is_win64 = sizeof(void *) > sizeof(int)
 
static BOOL is_wow64
 
static const BOOL abi_supports_stdcall = FALSE
 
static const ICollectionVtbl collectionvtbl
 
static ICollection collection = { &collectionvtbl }
 
static const IInvokeTestVtbl invoketestvtbl
 
static IInvokeTest invoketest = { &invoketestvtbl }
 
static const WCHAR testW [] = { 'T','e','s','t',0 }
 
static voidvtable [] = { NULL, NULL, NULL, inst_func }
 
static voidvtable2 [] = { NULL, NULL, NULL, inst_func2 }
 
static const SYSKIND info_syskind = SYS_WIN32
 
static const type_info info []
 
static const char manifest_dep []
 
static const char manifest_main []
 
static struct _TDATest TDATests []
 
IUnknownVtbl vt
 
IUnknown uk = {&vt}
 

Macro Definition Documentation

◆ ARCH

#define ARCH   "none"

Definition at line 74 of file typelib.c.

◆ AUX_ADESC

#define AUX_ADESC   3

Definition at line 8058 of file typelib.c.

◆ AUX_HREF

#define AUX_HREF   1

Definition at line 8056 of file typelib.c.

◆ AUX_TDESC

#define AUX_TDESC   2

Definition at line 8057 of file typelib.c.

◆ check_type

#define check_type (   elem,
  info 
)
Value:
{ \
expect_int((elem)->tdesc.vt, (info)->vt); \
expect_hex((elem)->paramdesc.wParamFlags, (info)->wParamFlags); \
}
static size_t elem
Definition: string.c:71

Definition at line 6556 of file typelib.c.

◆ check_variant_info

#define check_variant_info (   value,
  expected 
)
Value:
{ \
expect_int(V_VT(value), (expected)->vt); \
switch(V_VT(value)) { \
case VT_I1: expect_int(V_I1(value), (expected)->value_int); break; \
case VT_I2: expect_int(V_I2(value), (expected)->value_int); break; \
case VT_I4: expect_int(V_I4(value), (expected)->value_int); break; \
case VT_I8: expect_int(V_I8(value), (expected)->value_int); break; \
case VT_BOOL: expect_int(V_BOOL(value), (expected)->value_int); break; \
case VT_INT: expect_int(V_INT(value), (expected)->value_int); break; \
case VT_UI1: expect_int(V_UI1(value), (expected)->value_uint); break; \
case VT_UI2: expect_int(V_UI2(value), (expected)->value_uint); break; \
case VT_UI4: expect_int(V_UI4(value), (expected)->value_uint); break; \
case VT_UI8: expect_int(V_UI8(value), (expected)->value_uint); break; \
case VT_UINT: expect_int(V_UINT(value), (expected)->value_uint); break; \
default: skip("check_variant_info: comparing value not implemented for VARTYPE %d\n",V_VT(value)); \
} }
#define skip(...)
Definition: atltest.h:64
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_UI2
Definition: compat.h:2312
@ VT_I8
Definition: compat.h:2314
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_UI1
Definition: compat.h:2311
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
BOOL expected
Definition: store.c:2000
static UNICODE_STRING value_str
Definition: reg.c:1395
#define expect_wstr_acpval(expr, value)
Definition: typelib.c:49
#define expect_int(expr, value)
Definition: typelib.c:44
#define V_UI1(A)
Definition: oleauto.h:266
#define V_I8(A)
Definition: oleauto.h:249
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_INT(A)
Definition: oleauto.h:251
#define V_UI2(A)
Definition: oleauto.h:268
#define V_I1(A)
Definition: oleauto.h:243
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_UINT(A)
Definition: oleauto.h:264
#define V_UI4(A)
Definition: oleauto.h:270
#define V_UI8(A)
Definition: oleauto.h:272
#define V_I2(A)
Definition: oleauto.h:245
Definition: pdh_main.c:96

Definition at line 6538 of file typelib.c.

◆ COBJMACROS

#define COBJMACROS

Definition at line 22 of file typelib.c.

◆ CONST_VTABLE

#define CONST_VTABLE

Definition at line 23 of file typelib.c.

◆ expect_eq

#define expect_eq (   expr,
  value,
  type,
  format 
)    { type _ret = (expr); ok((value) == _ret, #expr " expected " format " got " format "\n", value, _ret); }

Definition at line 43 of file typelib.c.

◆ expect_guid

#define expect_guid (   expected,
  guid 
)    { ok(IsEqualGUID(expected, guid), "got wrong guid %s\n", wine_dbgstr_guid(guid)); }

Definition at line 47 of file typelib.c.

◆ expect_hex

#define expect_hex (   expr,
  value 
)    expect_eq(expr, (int)(value), int, "0x%x")

Definition at line 45 of file typelib.c.

◆ expect_int

#define expect_int (   expr,
  value 
)    expect_eq(expr, (int)(value), int, "%d")

Definition at line 44 of file typelib.c.

◆ expect_null

#define expect_null (   expr)    expect_eq(expr, NULL, const void *, "%p")

Definition at line 46 of file typelib.c.

◆ EXPECT_REF

#define EXPECT_REF (   obj,
  ref 
)    _expect_ref((IUnknown*)obj, ref, __LINE__)

Definition at line 77 of file typelib.c.

◆ expect_wstr_acpval

#define expect_wstr_acpval (   expr,
  value 
)
Value:
{ \
CHAR buf[260]; \
expect_eq(!WideCharToMultiByte(CP_ACP, 0, (expr), -1, buf, 260, NULL, NULL), 0, int, "%d"); \
ok(value && strcmp(value, buf) == 0, #expr " expected \"%s\" got \"%s\"\n", value, buf); \
}
#define NULL
Definition: types.h:112
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
char CHAR
Definition: pedump.c:57
Definition: query.h:86

Definition at line 49 of file typelib.c.

◆ ok_ole_success

#define ok_ole_success (   hr,
  func 
)    ok(hr == S_OK, #func " failed with error %#08lx\n", hr)

Definition at line 63 of file typelib.c.

◆ ole_check

#define ole_check (   expr)    ole_expect(expr, S_OK);

Definition at line 61 of file typelib.c.

◆ ole_expect

#define ole_expect (   expr,
  expect 
)
Value:
{ \
HRESULT r = expr; \
ok(r == (expect), #expr " returned %lx, expected %s (%lx)\n", r, #expect, expect); \
}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Definition at line 56 of file typelib.c.

Typedef Documentation

◆ custdata_info

◆ element_info

◆ function_info

◆ type_info

◆ var_info

◆ variant_info

Function Documentation

◆ _expect_ref()

static void _expect_ref ( IUnknown obj,
ULONG  ref,
int  line 
)
static

Definition at line 78 of file typelib.c.

79{
80 ULONG rc;
81 IUnknown_AddRef(obj);
82 rc = IUnknown_Release(obj);
83 ok_(__FILE__,line)(rc == ref, "expected refcount %ld, got %ld\n", ref, rc);
84}
#define ok_(x1, x2)
Definition: atltest.h:61
Definition: parser.c:49
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ BOOL()

static BOOL ( WINAPI pIsWow64Process)
static

◆ collection_AddRef()

static ULONG WINAPI collection_AddRef ( ICollection *  iface)
static

Definition at line 131 of file typelib.c.

132{
133 return 2;
134}

◆ collection_GetIDsOfNames()

static HRESULT WINAPI collection_GetIDsOfNames ( ICollection *  iface,
REFIID  riid,
LPOLESTR *  names,
UINT  cnt,
LCID  lcid,
DISPID dispid 
)
static

Definition at line 154 of file typelib.c.

156{
157 ok(0, "unexpected call\n");
158 return E_NOTIMPL;
159}
#define ok(value,...)
Definition: atltest.h:57
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ collection_GetTypeInfo()

static HRESULT WINAPI collection_GetTypeInfo ( ICollection *  iface,
UINT  index,
LCID  lcid,
ITypeInfo **  ti 
)
static

Definition at line 148 of file typelib.c.

149{
150 ok(0, "unexpected call\n");
151 return E_NOTIMPL;
152}

◆ collection_GetTypeInfoCount()

static HRESULT WINAPI collection_GetTypeInfoCount ( ICollection *  iface,
UINT cnt 
)
static

Definition at line 141 of file typelib.c.

142{
143 ok(0, "unexpected call\n");
144 *cnt = 0;
145 return E_NOTIMPL;
146}
_In_ size_t cnt
Definition: wcstombs.cpp:43

◆ collection_Invoke()

static HRESULT WINAPI collection_Invoke ( ICollection *  iface,
DISPID  dispid,
REFIID  riid,
LCID  lcid,
WORD  flags,
DISPPARAMS *  dispparams,
VARIANT res,
EXCEPINFO *  ei,
UINT argerr 
)
static

Definition at line 161 of file typelib.c.

163{
164 if(dispid != DISPID_VALUE) {
165 ok(0, "unexpected call\n");
166 return E_NOTIMPL;
167 }
168
169 ok(flags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "flags = %x\n", flags);
170 ok(dispparams != NULL, "dispparams == NULL\n");
171 ok(!dispparams->rgdispidNamedArgs, "dispparams->rgdispidNamedArgs != NULL\n");
172 ok(dispparams->cArgs == 1, "dispparams->cArgs = %d\n", dispparams->cArgs);
173 ok(!dispparams->cNamedArgs, "dispparams->cNamedArgs = %d\n", dispparams->cNamedArgs);
174 ok(V_VT(dispparams->rgvarg) == VT_I4, "V_VT(dispparams->rgvarg) = %d\n", V_VT(dispparams->rgvarg));
175 ok(V_I4(dispparams->rgvarg) == 7, "V_I4(dispparams->rgvarg) = %ld\n", V_I4(dispparams->rgvarg));
176 ok(res != NULL, "res == NULL\n");
177 ok(V_VT(res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(res));
178
179 V_VT(res) = VT_I4;
180 V_I4(res) = 15;
181 return S_OK;
182}
@ VT_EMPTY
Definition: compat.h:2295
GLuint res
Definition: glext.h:9613
GLbitfield flags
Definition: glext.h:7161
#define S_OK
Definition: intsafe.h:52
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007

◆ collection_Item()

static HRESULT WINAPI collection_Item ( ICollection *  iface,
int  i,
int p 
)
static

Definition at line 184 of file typelib.c.

185{
186 ok(0, "unexpected call\n");
187 return E_NOTIMPL;
188}

◆ collection_QueryInterface()

static HRESULT WINAPI collection_QueryInterface ( ICollection *  iface,
REFIID  riid,
void **  ret 
)
static

Definition at line 118 of file typelib.c.

119{
122 IsEqualIID(riid, &IID_ICollection))
123 {
124 *ret = iface;
125 return S_OK;
126 }
127
128 return E_NOINTERFACE;
129}
const GUID IID_IUnknown
return ret
Definition: mutex.c:146
REFIID riid
Definition: atlbase.h:39
const GUID IID_IDispatch
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ collection_Release()

static ULONG WINAPI collection_Release ( ICollection *  iface)
static

Definition at line 136 of file typelib.c.

137{
138 return 1;
139}

◆ compare_wstr()

static BOOL compare_wstr ( const WCHAR wstr,
const WCHAR ref 
)
static

Definition at line 105 of file typelib.c.

106{
107 char nameA[16];
108 WCHAR nameW[16];
109
110 if (!wcscmp(wstr, ref)) return TRUE; /* for UTF code pages */
111
112 WideCharToMultiByte(CP_ACP, 0, ref, -1, nameA, sizeof(nameA), NULL, NULL);
114
115 return !wcscmp(wstr, nameW);
116}
static const WCHAR nameW[]
Definition: main.c:49
#define ARRAY_SIZE(A)
Definition: main.h:20
#define TRUE
Definition: types.h:120
#define MultiByteToWideChar
Definition: compat.h:110
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
short WCHAR
Definition: pedump.c:58

Referenced by test_CreateTypeLib().

◆ create_actctx()

static HANDLE create_actctx ( const char file)
static

Definition at line 7852 of file typelib.c.

7853{
7855 ACTCTXW actctx;
7856 HANDLE handle;
7857
7859 memset(&actctx, 0, sizeof(ACTCTXW));
7860 actctx.cbSize = sizeof(ACTCTXW);
7861 actctx.lpSource = path;
7862
7864 ok(handle != INVALID_HANDLE_VALUE, "handle == INVALID_HANDLE_VALUE, error %lu\n", GetLastError());
7865
7866 ok(actctx.cbSize == sizeof(actctx), "actctx.cbSize=%ld\n", actctx.cbSize);
7867 ok(actctx.dwFlags == 0, "actctx.dwFlags=%ld\n", actctx.dwFlags);
7868 ok(actctx.lpSource == path, "actctx.lpSource=%p\n", actctx.lpSource);
7869 ok(actctx.wProcessorArchitecture == 0, "actctx.wProcessorArchitecture=%d\n", actctx.wProcessorArchitecture);
7870 ok(actctx.wLangId == 0, "actctx.wLangId=%d\n", actctx.wLangId);
7871 ok(actctx.lpAssemblyDirectory == NULL, "actctx.lpAssemblyDirectory=%p\n", actctx.lpAssemblyDirectory);
7872 ok(actctx.lpResourceName == NULL, "actctx.lpResourceName=%p\n", actctx.lpResourceName);
7873 ok(actctx.lpApplicationName == NULL, "actctx.lpApplicationName=%p\n",
7874 actctx.lpApplicationName);
7875 ok(actctx.hModule == NULL, "actctx.hModule=%p\n", actctx.hModule);
7876
7877 return handle;
7878}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
HANDLE WINAPI CreateActCtxW(PCACTCTXW pActCtx)
Definition: actctx.c:102
#define actctx
Definition: kernel32.h:8
#define memset(x, y, z)
Definition: compat.h:39
Definition: fci.c:127
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by test_LoadRegTypeLib().

◆ create_manifest_file()

static void create_manifest_file ( const char filename,
const char manifest 
)
static

Definition at line 7840 of file typelib.c.

7841{
7842 HANDLE file;
7843 DWORD size;
7844
7847 ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %lu\n", GetLastError());
7850}
#define CloseHandle
Definition: compat.h:739
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
const char * filename
Definition: ioapi.h:137
#define CREATE_ALWAYS
Definition: disk.h:72
#define GENERIC_WRITE
Definition: nt_native.h:90
static const CHAR manifest[]
Definition: v6util.h:41

Referenced by test_LoadRegTypeLib().

◆ create_test_typelib()

static WCHAR * create_test_typelib ( int  res_no)
static

Definition at line 873 of file typelib.c.

874{
875 static WCHAR filename[MAX_PATH];
876
877 GetTempFileNameW(L".", L"tlb", 0, filename);
878 write_typelib(res_no, filename);
879 return filename;
880}
#define L(x)
Definition: resources.c:13
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
static void write_typelib(int res_no, const WCHAR *filename)
Definition: typelib.c:828

Referenced by START_TEST(), test_dep(), test_register_typelib(), and test_TypeInfo().

◆ do_typelib_reg_key()

static BOOL do_typelib_reg_key ( GUID uid,
WORD  maj,
WORD  min,
DWORD  arch,
LPCWSTR  base,
BOOL  remove 
)
static

Definition at line 1722 of file typelib.c.

1723{
1724 static const WCHAR typelibW[] = {'T','y','p','e','l','i','b','\\',0};
1725 static const WCHAR formatW[] = {'\\','%','x','.','%','x','\\','0','\\','w','i','n','%','u',0};
1726 static const WCHAR format2W[] = {'%','s','_','%','u','_','%','u','.','d','l','l',0};
1727 WCHAR buf[128];
1728 HKEY hkey;
1729 BOOL ret = TRUE;
1730 DWORD res;
1731
1732 memcpy(buf, typelibW, sizeof(typelibW));
1733 StringFromGUID2(uid, buf + lstrlenW(buf), 40);
1734
1735 if (remove)
1736 {
1737 ok(myRegDeleteTreeW(HKEY_CLASSES_ROOT, buf, 0) == ERROR_SUCCESS, "SHDeleteKey failed\n");
1738 return TRUE;
1739 }
1740
1741 wsprintfW(buf + lstrlenW(buf), formatW, maj, min, arch);
1742
1743 SetLastError(0xdeadbeef);
1745 KEY_WRITE, NULL, &hkey, NULL);
1747 {
1748 win_skip("W-calls are not implemented\n");
1749 return FALSE;
1750 }
1751
1752 if (res != ERROR_SUCCESS)
1753 {
1754 trace("RegCreateKeyExW failed: %lu\n", res);
1755 return FALSE;
1756 }
1757
1758 wsprintfW(buf, format2W, base, maj, min);
1759 if (RegSetValueExW(hkey, NULL, 0, REG_SZ,
1760 (BYTE *)buf, (lstrlenW(buf) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
1761 {
1762 trace("RegSetValueExW failed\n");
1763 ret = FALSE;
1764 }
1765 RegCloseKey(hkey);
1766 return ret;
1767}
#define trace
Definition: atltest.h:70
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define SetLastError(x)
Definition: compat.h:752
#define lstrlenW
Definition: compat.h:750
unsigned int BOOL
Definition: ntddk_ex.h:94
#define REG_SZ
Definition: layer.c:22
#define win_skip
Definition: minitest.h:67
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static LSTATUS myRegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey, REGSAM view)
Definition: typelib.c:1655
#define min(a, b)
Definition: monoChain.cc:55
int remove
Definition: msacm.c:1366
#define KEY_WRITE
Definition: nt_native.h:1034
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
unsigned char BYTE
Definition: xxhash.c:193

Referenced by test_QueryPathOfRegTypeLib().

◆ double_func()

static double WINAPI double_func ( double  a0,
float  a1,
double  a2,
int  a3 
)
static

Definition at line 1391 of file typelib.c.

1392{
1393 ok( a0 == 1.2, "wrong arg0 %f\n", a0 );
1394 ok( a1 == 3.25, "wrong arg1 %f\n", (double)a1 );
1395 ok( a2 == 1.2e12, "wrong arg2 %f\n", a2);
1396 ok( a3 == -4433.0, "wrong arg3 %f\n", (double)a3 );
1397 return 4321;
1398}
static const struct update_accum a1
Definition: msg.c:534
static const struct update_accum a2
Definition: msg.c:542
static const struct update_accum a3
Definition: msg.c:556

Referenced by test_DispCallFunc().

◆ HRESULT()

static HRESULT ( WINAPI pRegisterTypeLibForUser)
static

◆ init_function_pointers()

static void init_function_pointers ( void  )
static

Definition at line 344 of file typelib.c.

345{
346 HMODULE hmod = GetModuleHandleA("oleaut32.dll");
347 HMODULE hk32 = GetModuleHandleA("kernel32.dll");
348 HMODULE hadv = GetModuleHandleA("advapi32.dll");
349
350 pRegisterTypeLibForUser = (void *)GetProcAddress(hmod, "RegisterTypeLibForUser");
351 pUnRegisterTypeLibForUser = (void *)GetProcAddress(hmod, "UnRegisterTypeLibForUser");
352 pIsWow64Process = (void *)GetProcAddress(hk32, "IsWow64Process");
353 pRegDeleteKeyExW = (void*)GetProcAddress(hadv, "RegDeleteKeyExW");
354}
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
static NTSTATUS *static PWSTR CURDIR *static HMODULE hmod
Definition: security.c:104

Referenced by START_TEST().

◆ inst_func()

static int WINAPI inst_func ( void inst,
int  a 
)
static

Definition at line 1438 of file typelib.c.

1439{
1440 ok( (*(void ***)inst)[3] == inst_func, "wrong ptr %p\n", inst );
1441 ok( a == 3, "wrong arg %x\n", a );
1442 return a * 2;
1443}
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
static int WINAPI inst_func(void *inst, int a)
Definition: typelib.c:1438

Referenced by inst_func().

◆ inst_func2()

static void WINAPI inst_func2 ( void inst,
VARIANT ret,
VARIANT  v1,
VARIANT  v2 
)
static

Definition at line 1483 of file typelib.c.

1484{
1485 ok( (*(void ***)inst)[3] == inst_func2, "wrong ptr %p\n", inst );
1486
1487 ok(V_VT(ret) == VT_I4 || broken(V_VT(ret) == VT_VARIANT) /* win64 */, "unexpected %d\n", V_VT(ret));
1488 ok(V_I4(ret) == 1234, "unexpected %ld\n", V_I4(ret));
1489
1490 ok(V_VT(&v1) == VT_I4, "unexpected %d\n", V_VT(&v1));
1491 ok(V_I4(&v1) == 2, "unexpected %ld\n", V_I4(&v1));
1492 ok(V_VT(&v2) == VT_BSTR, "unexpected %d\n", V_VT(&v2));
1493 ok(lstrcmpW(V_BSTR(&v2), testW) == 0, "unexpected %s\n", wine_dbgstr_w(V_BSTR(&v2)));
1494
1495 V_VT(ret) = VT_UI4;
1496 V_I4(ret) = 4321;
1497}
#define broken(x)
Definition: atltest.h:178
@ VT_VARIANT
Definition: compat.h:2307
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
GLfloat GLfloat v1
Definition: glext.h:6062
GLfloat GLfloat GLfloat v2
Definition: glext.h:6063
#define wine_dbgstr_w
Definition: kernel32.h:34
static const WCHAR testW[]
Definition: typelib.c:1450
static void WINAPI inst_func2(void *inst, VARIANT *ret, VARIANT v1, VARIANT v2)
Definition: typelib.c:1483

Referenced by inst_func2().

◆ int_func()

static int WINAPI int_func ( int  a0,
int  a1,
int  a2,
int  a3,
int  a4 
)
static

Definition at line 1377 of file typelib.c.

1378{
1379 ok( a0 == 1, "wrong arg0 %x\n", a0 );
1380 ok( a1 == -1, "wrong arg1 %x\n", a1 );
1381#ifdef __arm__ /* parameters are extended on arm */
1382 ok( a2 == 1234, "wrong arg2 %x\n", a2 );
1383#else
1384 ok( a2 == (0x55550000 | 1234), "wrong arg2 %x\n", a2 );
1385#endif
1386 ok( a3 == 0xdeadbeef, "wrong arg3 %x\n", a3 );
1387 ok( a4 == 0x555555fd, "wrong arg4 %x\n", a4 );
1388 return 4321;
1389}
static const struct update_accum a4
Definition: msg.c:2188

Referenced by test_DispCallFunc().

◆ invoketest_AddRef()

static ULONG WINAPI invoketest_AddRef ( IInvokeTest *  iface)
static

Definition at line 216 of file typelib.c.

217{
218 return 2;
219}

◆ invoketest_get_test()

static LONG WINAPI invoketest_get_test ( IInvokeTest *  iface,
LONG  i 
)
static

Definition at line 253 of file typelib.c.

254{
255 return i+1;
256}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248

◆ invoketest_get_testget2()

static LONG WINAPI invoketest_get_testget2 ( IInvokeTest *  iface,
int value 
)
static

Definition at line 281 of file typelib.c.

282{
283 *value = 4;
284 return S_OK;
285}

◆ invoketest_get_testget3()

static int WINAPI invoketest_get_testget3 ( IInvokeTest *  iface)
static

Definition at line 287 of file typelib.c.

288{
289 return 4;
290}

◆ invoketest_get_testget4()

static int WINAPI invoketest_get_testget4 ( IInvokeTest *  iface,
int  value 
)
static

Definition at line 292 of file typelib.c.

293{
294 return 4;
295}

◆ invoketest_get_testget5()

static int WINAPI invoketest_get_testget5 ( IInvokeTest *  iface,
int value1,
int  value2 
)
static

Definition at line 297 of file typelib.c.

298{
299 return 4;
300}

◆ invoketest_get_testget6()

static int WINAPI invoketest_get_testget6 ( IInvokeTest *  iface,
int  value1,
int  value2 
)
static

Definition at line 302 of file typelib.c.

303{
304 return 4;
305}

◆ invoketest_get_testget7()

static void WINAPI invoketest_get_testget7 ( IInvokeTest *  iface,
int  value1,
int  value2 
)
static

Definition at line 307 of file typelib.c.

308{
309}

◆ invoketest_get_testget8()

static void WINAPI invoketest_get_testget8 ( IInvokeTest *  iface,
int value 
)
static

Definition at line 311 of file typelib.c.

312{
313}

◆ invoketest_get_testput8()

static void WINAPI invoketest_get_testput8 ( IInvokeTest *  iface,
int  value 
)
static

Definition at line 315 of file typelib.c.

316{
317}

◆ invoketest_GetIDsOfNames()

static HRESULT WINAPI invoketest_GetIDsOfNames ( IInvokeTest *  iface,
REFIID  riid,
LPOLESTR *  names,
UINT  cnt,
LCID  lcid,
DISPID dispid 
)
static

Definition at line 239 of file typelib.c.

241{
242 ok(0, "unexpected call\n");
243 return E_NOTIMPL;
244}

◆ invoketest_GetTypeInfo()

static HRESULT WINAPI invoketest_GetTypeInfo ( IInvokeTest *  iface,
UINT  index,
LCID  lcid,
ITypeInfo **  ti 
)
static

Definition at line 233 of file typelib.c.

234{
235 ok(0, "unexpected call\n");
236 return E_NOTIMPL;
237}

◆ invoketest_GetTypeInfoCount()

static HRESULT WINAPI invoketest_GetTypeInfoCount ( IInvokeTest *  iface,
UINT cnt 
)
static

Definition at line 226 of file typelib.c.

227{
228 ok(0, "unexpected call\n");
229 *cnt = 0;
230 return E_NOTIMPL;
231}

◆ invoketest_Invoke()

static HRESULT WINAPI invoketest_Invoke ( IInvokeTest *  iface,
DISPID  dispid,
REFIID  riid,
LCID  lcid,
WORD  flags,
DISPPARAMS *  dispparams,
VARIANT res,
EXCEPINFO *  ei,
UINT argerr 
)
static

Definition at line 246 of file typelib.c.

248{
249 ok(0, "unexpected call\n");
250 return E_NOTIMPL;
251}

◆ invoketest_putref_testprop()

static LONG WINAPI invoketest_putref_testprop ( IInvokeTest *  iface,
LONG i 
)
static

Definition at line 258 of file typelib.c.

259{
260 return *i+2;
261}

◆ invoketest_putref_testprop2()

static LONG WINAPI invoketest_putref_testprop2 ( IInvokeTest *  iface,
IUnknown i 
)
static

Definition at line 263 of file typelib.c.

264{
265 return 6;
266}

◆ invoketest_QueryInterface()

static HRESULT WINAPI invoketest_QueryInterface ( IInvokeTest *  iface,
REFIID  riid,
void **  ret 
)
static

Definition at line 203 of file typelib.c.

204{
207 IsEqualIID(riid, &IID_IInvokeTest))
208 {
209 *ret = iface;
210 return S_OK;
211 }
212
213 return E_NOINTERFACE;
214}

◆ invoketest_Release()

static ULONG WINAPI invoketest_Release ( IInvokeTest *  iface)
static

Definition at line 221 of file typelib.c.

222{
223 return 1;
224}

◆ invoketest_testfunc()

static HRESULT WINAPI invoketest_testfunc ( IInvokeTest *  iface,
int  i,
int p 
)
static

Definition at line 268 of file typelib.c.

269{
270 *p = i+1;
271 return S_OK;
272}
GLfloat GLfloat p
Definition: glext.h:8902

◆ invoketest_testget()

static HRESULT WINAPI invoketest_testget ( IInvokeTest *  iface,
ICollection **  p 
)
static

Definition at line 274 of file typelib.c.

275{
276 *p = &collection;
277 ICollection_AddRef(&collection);
278 return S_OK;
279}
static ICollection collection
Definition: typelib.c:201

◆ LONG()

static LONG ( WINAPI pRegDeleteKeyExW)
static

◆ longlong_func()

static LONGLONG WINAPI longlong_func ( LONGLONG  a0,
CY  a1 
)
static

Definition at line 1400 of file typelib.c.

1401{
1402 ok( a0 == 0xdead00000000beefll, "wrong arg0 %#I64x\n", a0);
1403 ok( a1.int64 == ((ULONGLONG)10000 * 12345678), "wrong arg1 %#I64x\n", a1.int64 );
1404 return ((ULONGLONG)4321 << 32) | 8765;
1405}
uint64_t ULONGLONG
Definition: typedefs.h:67

Referenced by test_DispCallFunc().

◆ myRegDeleteTreeW()

static LSTATUS myRegDeleteTreeW ( HKEY  hKey,
LPCWSTR  lpszSubKey,
REGSAM  view 
)
static

Definition at line 1655 of file typelib.c.

1656{
1657 LONG ret;
1658 DWORD dwMaxSubkeyLen, dwMaxValueLen;
1659 DWORD dwMaxLen, dwSize;
1660 WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
1661 HKEY hSubKey = hKey;
1663
1664 if(lpszSubKey)
1665 {
1666 ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ | view, &hSubKey);
1667 if (ret) return ret;
1668 }
1669
1670 ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
1671 &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
1672 if (ret) goto cleanup;
1673
1674 dwMaxSubkeyLen++;
1675 dwMaxValueLen++;
1676 dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
1677 if (dwMaxLen > ARRAY_SIZE(szNameBuf))
1678 {
1679 /* Name too big: alloc a buffer for it */
1680 if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
1681 {
1683 goto cleanup;
1684 }
1685 }
1686
1687 /* Recursively delete all the subkeys */
1688 while (TRUE)
1689 {
1690 dwSize = dwMaxLen;
1691 if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
1692 NULL, NULL, NULL)) break;
1693
1694 ret = myRegDeleteTreeW(hSubKey, lpszName, view);
1695 if (ret) goto cleanup;
1696 }
1697
1698 if (lpszSubKey)
1699 if (pRegDeleteKeyExW && view != 0)
1700 ret = pRegDeleteKeyExW(hKey, lpszSubKey, view, 0);
1701 else
1702 ret = RegDeleteKeyW(hKey, lpszSubKey);
1703 else
1704 while (TRUE)
1705 {
1706 dwSize = dwMaxLen;
1707 if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
1708 NULL, NULL, NULL, NULL)) break;
1709
1710 ret = RegDeleteValueW(hKey, lpszName);
1711 if (ret) goto cleanup;
1712 }
1713
1714cleanup:
1715 if (lpszName != szNameBuf)
1716 HeapFree(GetProcessHeap(), 0, lpszName);
1717 if(lpszSubKey)
1718 RegCloseKey(hSubKey);
1719 return ret;
1720}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2830
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static void cleanup(void)
Definition: main.c:1335
FxAutoRegKey hKey
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define KEY_READ
Definition: nt_native.h:1026
long LONG
Definition: pedump.c:60
#define max(a, b)
Definition: svc.c:63
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46

Referenced by do_typelib_reg_key(), myRegDeleteTreeW(), and test_stub().

◆ parse_guid()

static void parse_guid ( LPCSTR  strGuid,
GUID guid 
)
static

Definition at line 6561 of file typelib.c.

6562{
6563 WCHAR guidW[39];
6564 MultiByteToWideChar(CP_ACP, 0, strGuid, -1, guidW, ARRAY_SIZE(guidW));
6565 ole_check(IIDFromString(guidW, guid));
6566}
HRESULT WINAPI IIDFromString(LPCOLESTR str, IID *iid)
Definition: combase.c:1492
GUID guid
Definition: version.c:147
#define ole_check(expr)
Definition: typelib.c:61

Referenced by test_dump_typelib().

◆ ref_count_test()

static void ref_count_test ( LPCWSTR  type_lib)
static

Definition at line 356 of file typelib.c.

357{
358 ITypeLib *iface;
359 ITypeInfo *iti1, *iti2;
360 HRESULT hRes;
361 int ref_count;
362
363 trace("Loading type library\n");
364 hRes = LoadTypeLib(type_lib, &iface);
365 ok(hRes == S_OK, "Could not load type library\n");
366 if(hRes != S_OK)
367 return;
368
369 hRes = ITypeLib_GetTypeInfo(iface, 1, &iti1);
370 ok(hRes == S_OK, "ITypeLib_GetTypeInfo failed on index = 1\n");
371 ref_count = ITypeLib_Release(iface);
372 ok(ref_count > 0, "ITypeLib destroyed while ITypeInfo has back pointer\n");
373 if(!ref_count)
374 return;
375
376 hRes = ITypeLib_GetTypeInfo(iface, 1, &iti2);
377 ok(hRes == S_OK, "ITypeLib_GetTypeInfo failed on index = 1\n");
378 ok(iti1 == iti2, "ITypeLib_GetTypeInfo returned different pointers for same indexes\n");
379
380 ITypeLib_AddRef(iface);
381 ITypeInfo_Release(iti2);
382 ITypeInfo_Release(iti1);
383 ok(ITypeLib_Release(iface) == 0, "ITypeLib should be destroyed here.\n");
384}
HRESULT WINAPI LoadTypeLib(const OLECHAR *szFile, ITypeLib **pptLib)
Definition: typelib.c:458

Referenced by START_TEST().

◆ ret_false_func()

static HRESULT WINAPI ret_false_func ( void  )
static

Definition at line 1445 of file typelib.c.

1446{
1447 return S_FALSE;
1448}
#define S_FALSE
Definition: winerror.h:3451

Referenced by test_DispCallFunc().

◆ START_TEST()

START_TEST ( typelib  )

Definition at line 8801 of file typelib.c.

8802{
8803 const WCHAR *filename;
8804
8807
8809 test_TypeComp();
8811 test_TypeInfo();
8817#ifdef __REACTOS__ /* FIXME: Inspect */
8818 if (is_reactos())
8819 {
8820 trace("test_dep(SYS_WIN64) crashes in ReactOS.\n");
8821 }
8822 else
8823#endif
8827#ifdef __REACTOS__ /* FIXME: Inspect */
8828 if (is_reactos())
8829 {
8830 trace("test_dep(SYS_WIN32) crashes in ReactOS.\n");
8831 }
8832 else
8833#endif
8839 test_FindName();
8840
8841 if ((filename = create_test_typelib(2)))
8842 {
8845 }
8846
8855 test_stub();
8858}
#define GetCurrentProcess()
Definition: compat.h:759
#define IsWow64Process
Definition: compat.h:760
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL is_wow64
Definition: main.c:38
static void test_register_typelib(void)
Definition: action.c:5577
static void test_DeleteImplType(void)
Definition: typelib.c:8627
static void test_LoadTypeLib(void)
Definition: typelib.c:7326
static void test_QueryPathOfRegTypeLib(DWORD arch)
Definition: typelib.c:1769
static const WCHAR wszStdOle2[]
Definition: typelib.c:92
static void init_function_pointers(void)
Definition: typelib.c:344
static void test_DeleteFuncDesc(void)
Definition: typelib.c:8724
static void test_stub(void)
Definition: typelib.c:8338
static void test_CreateTypeLib(SYSKIND sys)
Definition: typelib.c:2133
static void test_dump_typelib(const WCHAR *name)
Definition: typelib.c:6568
static void test_SetDocString(void)
Definition: typelib.c:7572
static void test_dep(SYSKIND sys)
Definition: typelib.c:8513
static const BOOL is_win64
Definition: typelib.c:96
static void test_GetLibAttr(void)
Definition: typelib.c:8291
static void test_LoadRegTypeLib(void)
Definition: typelib.c:7905
static void test_SetFuncAndParamNames(void)
Definition: typelib.c:7433
static void test_DispCallFunc(void)
Definition: typelib.c:1503
static void test_TypeInfo(void)
Definition: typelib.c:882
static void test_TypeComp(void)
Definition: typelib.c:386
static void test_create_typelibs(void)
Definition: typelib.c:6899
static void test_CreateDispTypeInfo(void)
Definition: typelib.c:668
static void test_FindName(void)
Definition: typelib.c:7720
static void test_SetTypeDescAlias(SYSKIND kind)
Definition: typelib.c:8200
static void test_TypeInfo2_GetContainingTypeLib(void)
Definition: typelib.c:7792
static void test_register_typelib_64(void)
Definition: typelib.c:7108
static void ref_count_test(LPCWSTR type_lib)
Definition: typelib.c:356
static void test_inheritance(void)
Definition: typelib.c:1832
static void test_SetVarHelpContext(void)
Definition: typelib.c:7353
static WCHAR * create_test_typelib(int res_no)
Definition: typelib.c:873
@ SYS_WIN32
Definition: widltypes.h:647
@ SYS_WIN64
Definition: widltypes.h:649

◆ stdcall_func()

static int WINAPI stdcall_func ( int  a)
static

Definition at line 1433 of file typelib.c.

1434{
1435 return 0;
1436}

Referenced by test_DispCallFunc().

◆ test_create_typelib_lcid()

static void test_create_typelib_lcid ( LCID  lcid)
static

Definition at line 6828 of file typelib.c.

6829{
6830 char filename[MAX_PATH];
6832 HRESULT hr;
6833 ICreateTypeLib2 *tl;
6834 HANDLE file;
6835 DWORD msft_header[8];
6837 TLIBATTR *attr;
6838 DWORD read;
6839
6840 GetTempFileNameA( ".", "tlb", 0, filename );
6842
6844 ok(hr == S_OK, "got %08lx\n", hr);
6845
6846 hr = ICreateTypeLib2_QueryInterface(tl, &IID_ITypeLib, (void**)&typelib);
6847 ok(hr == S_OK, "got %08lx\n", hr);
6848
6849 hr = ITypeLib_GetLibAttr(typelib, &attr);
6850 ok(hr == S_OK, "got %08lx\n", hr);
6851 ok(attr->wLibFlags == 0, "flags 0x%x\n", attr->wLibFlags);
6852 ITypeLib_ReleaseTLibAttr(typelib, attr);
6853
6854 hr = ICreateTypeLib2_SetLcid(tl, lcid);
6855 ok(hr == S_OK, "got %08lx\n", hr);
6856
6857 hr = ICreateTypeLib2_SetVersion(tl, 3, 4);
6858 ok(hr == S_OK, "got %08lx\n", hr);
6859
6860 hr = ICreateTypeLib2_SaveAllChanges(tl);
6861 ok(hr == S_OK, "got %08lx\n", hr);
6862
6863 hr = ITypeLib_GetLibAttr(typelib, &attr);
6864 ok(hr == S_OK, "got %08lx\n", hr);
6865 ok(attr->wLibFlags == 0, "flags 0x%x\n", attr->wLibFlags);
6866 ITypeLib_ReleaseTLibAttr(typelib, attr);
6867
6868 ITypeLib_Release(typelib);
6869 ICreateTypeLib2_Release(tl);
6870
6872 ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" );
6873
6874 ReadFile( file, msft_header, sizeof(msft_header), &read, NULL );
6875 ok(read == sizeof(msft_header), "read %ld\n", read);
6876 CloseHandle( file );
6877
6878 ok(msft_header[0] == 0x5446534d, "got %08lx\n", msft_header[0]);
6879 ok(msft_header[1] == 0x00010002, "got %08lx\n", msft_header[1]);
6880 ok(msft_header[2] == 0xffffffff, "got %08lx\n", msft_header[2]);
6881 ok(msft_header[3] == (lcid ? lcid : 0x409), "got %08lx (lcid %08lx)\n", msft_header[3], lcid);
6882 ok(msft_header[4] == lcid, "got %08lx (lcid %08lx)\n", msft_header[4], lcid);
6883 ok(msft_header[6] == 0x00040003, "got %08lx\n", msft_header[6]);
6884 ok(msft_header[7] == 0, "got %08lx\n", msft_header[7]);
6885
6886 /* check flags after loading */
6888 ok(hr == S_OK, "got %08lx\n", hr);
6889
6890 hr = ITypeLib_GetLibAttr(typelib, &attr);
6891 ok(hr == S_OK, "got %08lx\n", hr);
6892 ok(attr->wLibFlags == LIBFLAG_FHASDISKIMAGE, "flags 0x%x\n", attr->wLibFlags);
6893 ITypeLib_ReleaseTLibAttr(typelib, attr);
6894 ITypeLib_Release(typelib);
6895
6897}
#define read
Definition: acwin.h:97
HRESULT hr
Definition: delayimp.cpp:582
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define GENERIC_READ
Definition: compat.h:135
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
LCID lcid
Definition: locale.c:5660
HRESULT WINAPI CreateTypeLib2(SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib2 **ppctlib)
Definition: typelib.c:9043
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26
@ LIBFLAG_FHASDISKIMAGE
Definition: actctx.c:76
Definition: cookie.c:202
Definition: name.c:39

Referenced by test_create_typelibs().

◆ test_create_typelibs()

static void test_create_typelibs ( void  )
static

Definition at line 6899 of file typelib.c.

6900{
6904
6908
6911}
static void test_create_typelib_lcid(LCID lcid)
Definition: typelib.c:6828
#define LOCALE_NEUTRAL
#define LOCALE_USER_DEFAULT
#define LOCALE_SYSTEM_DEFAULT

Referenced by START_TEST().

◆ test_CreateDispTypeInfo()

static void test_CreateDispTypeInfo ( void  )
static

Definition at line 668 of file typelib.c.

669{
670 ITypeInfo *pTypeInfo, *pTI2;
671 HRESULT hr;
672 INTERFACEDATA ifdata;
673 METHODDATA methdata[4];
674 PARAMDATA parms1[2];
675 PARAMDATA parms3[1];
676 TYPEATTR *pTypeAttr;
677 HREFTYPE href;
678 FUNCDESC *pFuncDesc;
679 MEMBERID memid;
680
681 static WCHAR func1[] = {'f','u','n','c','1',0};
682 static const WCHAR func2[] = {'f','u','n','c','2',0};
683 static const WCHAR func3[] = {'f','u','n','c','3',0};
684 static const WCHAR parm1[] = {'p','a','r','m','1',0};
685 static const WCHAR parm2[] = {'p','a','r','m','2',0};
686 OLECHAR *name = func1;
687
688 ifdata.pmethdata = methdata;
689 ifdata.cMembers = ARRAY_SIZE(methdata);
690
691 methdata[0].szName = SysAllocString(func1);
692 methdata[0].ppdata = parms1;
693 methdata[0].dispid = 0x123;
694 methdata[0].iMeth = 0;
695 methdata[0].cc = CC_STDCALL;
696 methdata[0].cArgs = 2;
697 methdata[0].wFlags = DISPATCH_METHOD;
698 methdata[0].vtReturn = VT_HRESULT;
699 parms1[0].szName = SysAllocString(parm1);
700 parms1[0].vt = VT_I4;
701 parms1[1].szName = SysAllocString(parm2);
702 parms1[1].vt = VT_BSTR;
703
704 methdata[1].szName = SysAllocString(func2);
705 methdata[1].ppdata = NULL;
706 methdata[1].dispid = 0x124;
707 methdata[1].iMeth = 1;
708 methdata[1].cc = CC_STDCALL;
709 methdata[1].cArgs = 0;
710 methdata[1].wFlags = DISPATCH_PROPERTYGET;
711 methdata[1].vtReturn = VT_I4;
712
713 methdata[2].szName = SysAllocString(func3);
714 methdata[2].ppdata = parms3;
715 methdata[2].dispid = 0x125;
716 methdata[2].iMeth = 3;
717 methdata[2].cc = CC_STDCALL;
718 methdata[2].cArgs = 1;
719 methdata[2].wFlags = DISPATCH_PROPERTYPUT;
720 methdata[2].vtReturn = VT_HRESULT;
721 parms3[0].szName = SysAllocString(parm1);
722 parms3[0].vt = VT_I4;
723
724 methdata[3].szName = SysAllocString(func3);
725 methdata[3].ppdata = NULL;
726 methdata[3].dispid = 0x125;
727 methdata[3].iMeth = 4;
728 methdata[3].cc = CC_STDCALL;
729 methdata[3].cArgs = 0;
730 methdata[3].wFlags = DISPATCH_PROPERTYGET;
731 methdata[3].vtReturn = VT_I4;
732
733 hr = CreateDispTypeInfo(&ifdata, LOCALE_NEUTRAL, &pTypeInfo);
734 ok(hr == S_OK, "hr %08lx\n", hr);
735
736 hr = ITypeInfo_GetTypeAttr(pTypeInfo, &pTypeAttr);
737 ok(hr == S_OK, "hr %08lx\n", hr);
738
739 ok(pTypeAttr->typekind == TKIND_COCLASS, "typekind %0x\n", pTypeAttr->typekind);
740 ok(pTypeAttr->cImplTypes == 1, "cImplTypes %d\n", pTypeAttr->cImplTypes);
741 ok(pTypeAttr->cFuncs == 0, "cFuncs %d\n", pTypeAttr->cFuncs);
742 ok(pTypeAttr->wTypeFlags == 0, "wTypeFlags %04x\n", pTypeAttr->cFuncs);
743 ITypeInfo_ReleaseTypeAttr(pTypeInfo, pTypeAttr);
744
745 hr = ITypeInfo_GetRefTypeOfImplType(pTypeInfo, 0, &href);
746 ok(hr == S_OK, "hr %08lx\n", hr);
747 ok(href == 0, "href = 0x%lx\n", href);
748 hr = ITypeInfo_GetRefTypeInfo(pTypeInfo, href, &pTI2);
749 ok(hr == S_OK, "hr %08lx\n", hr);
750 hr = ITypeInfo_GetTypeAttr(pTI2, &pTypeAttr);
751 ok(hr == S_OK, "hr %08lx\n", hr);
752 ok(pTypeAttr->typekind == TKIND_INTERFACE, "typekind %0x\n", pTypeAttr->typekind);
753 ok(pTypeAttr->cFuncs == 4, "cFuncs %d\n", pTypeAttr->cFuncs);
754 ok(IsEqualGUID(&pTypeAttr->guid, &GUID_NULL), "guid %s\n", debugstr_guid(&pTypeAttr->guid));
755 ok(pTypeAttr->wTypeFlags == 0, "typeflags %08x\n", pTypeAttr->wTypeFlags);
756
757 ITypeInfo_ReleaseTypeAttr(pTI2, pTypeAttr);
758
759 hr = ITypeInfo_GetFuncDesc(pTI2, 0, &pFuncDesc);
760 ok(hr == S_OK, "hr %08lx\n", hr);
761 ok(pFuncDesc->memid == 0x123, "memid %lx\n", pFuncDesc->memid);
762 ok(pFuncDesc->funckind == FUNC_VIRTUAL, "funckind %d\n", pFuncDesc->funckind);
763 ok(pFuncDesc->invkind == methdata[0].wFlags, "invkind %d\n", pFuncDesc->invkind);
764 ok(pFuncDesc->callconv == methdata[0].cc, "callconv %d\n", pFuncDesc->callconv);
765 ok(pFuncDesc->cParams == methdata[0].cArgs, "cParams %d\n", pFuncDesc->cParams);
766 ok(pFuncDesc->oVft == 0, "oVft %d\n", pFuncDesc->oVft);
767 ok(pFuncDesc->wFuncFlags == 0, "oVft %d\n", pFuncDesc->wFuncFlags);
768 ok(pFuncDesc->elemdescFunc.tdesc.vt == VT_HRESULT, "ret vt %x\n", pFuncDesc->elemdescFunc.tdesc.vt);
769 ok(pFuncDesc->lprgelemdescParam[0].tdesc.vt == VT_I4, "parm 0 vt %x\n", pFuncDesc->lprgelemdescParam[0].tdesc.vt);
770 ok(pFuncDesc->lprgelemdescParam[0].paramdesc.wParamFlags == PARAMFLAG_NONE, "parm 0 flags %x\n", pFuncDesc->lprgelemdescParam[0].paramdesc.wParamFlags);
771
772 ok(pFuncDesc->lprgelemdescParam[1].tdesc.vt == VT_BSTR, "parm 1 vt %x\n", pFuncDesc->lprgelemdescParam[1].tdesc.vt);
773 ok(pFuncDesc->lprgelemdescParam[1].paramdesc.wParamFlags == PARAMFLAG_NONE, "parm 1 flags %x\n", pFuncDesc->lprgelemdescParam[1].paramdesc.wParamFlags);
774 ITypeInfo_ReleaseFuncDesc(pTI2, pFuncDesc);
775
776 hr = ITypeInfo_GetFuncDesc(pTI2, 1, &pFuncDesc);
777 ok(hr == S_OK, "hr %08lx\n", hr);
778 ok(pFuncDesc->funckind == FUNC_VIRTUAL, "funckind %d\n", pFuncDesc->funckind);
779 ok(pFuncDesc->invkind == methdata[1].wFlags, "invkind %d\n", pFuncDesc->invkind);
780 ok(pFuncDesc->callconv == methdata[1].cc, "callconv %d\n", pFuncDesc->callconv);
781 ok(pFuncDesc->cParams == methdata[1].cArgs, "cParams %d\n", pFuncDesc->cParams);
782 ok(pFuncDesc->oVft == sizeof(void *), "oVft %d\n", pFuncDesc->oVft);
783 ok(pFuncDesc->wFuncFlags == 0, "oVft %d\n", pFuncDesc->wFuncFlags);
784 ok(pFuncDesc->elemdescFunc.tdesc.vt == VT_I4, "ret vt %x\n", pFuncDesc->elemdescFunc.tdesc.vt);
785 ITypeInfo_ReleaseFuncDesc(pTI2, pFuncDesc);
786
787 hr = ITypeInfo_GetFuncDesc(pTI2, 2, &pFuncDesc);
788 ok(hr == S_OK, "hr %08lx\n", hr);
789 ok(pFuncDesc->funckind == FUNC_VIRTUAL, "funckind %d\n", pFuncDesc->funckind);
790 ok(pFuncDesc->invkind == methdata[2].wFlags, "invkind %d\n", pFuncDesc->invkind);
791 ok(pFuncDesc->callconv == methdata[2].cc, "callconv %d\n", pFuncDesc->callconv);
792 ok(pFuncDesc->cParams == methdata[2].cArgs, "cParams %d\n", pFuncDesc->cParams);
793 ok(pFuncDesc->oVft == 3 * sizeof(void *), "oVft %d\n", pFuncDesc->oVft);
794 ok(pFuncDesc->wFuncFlags == 0, "oVft %d\n", pFuncDesc->wFuncFlags);
795 ok(pFuncDesc->elemdescFunc.tdesc.vt == VT_HRESULT, "ret vt %x\n", pFuncDesc->elemdescFunc.tdesc.vt);
796 ok(pFuncDesc->lprgelemdescParam[0].tdesc.vt == VT_I4, "parm 0 vt %x\n", pFuncDesc->lprgelemdescParam[0].tdesc.vt);
797 ok(pFuncDesc->lprgelemdescParam[0].paramdesc.wParamFlags == PARAMFLAG_NONE, "parm 0 flags %x\n", pFuncDesc->lprgelemdescParam[0].paramdesc.wParamFlags);
798 ITypeInfo_ReleaseFuncDesc(pTI2, pFuncDesc);
799
800 hr = ITypeInfo_GetFuncDesc(pTI2, 3, &pFuncDesc);
801 ok(hr == S_OK, "hr %08lx\n", hr);
802 ok(pFuncDesc->funckind == FUNC_VIRTUAL, "funckind %d\n", pFuncDesc->funckind);
803 ok(pFuncDesc->invkind == methdata[3].wFlags, "invkind %d\n", pFuncDesc->invkind);
804 ok(pFuncDesc->callconv == methdata[3].cc, "callconv %d\n", pFuncDesc->callconv);
805 ok(pFuncDesc->cParams == methdata[3].cArgs, "cParams %d\n", pFuncDesc->cParams);
806 ok(pFuncDesc->oVft == 4 * sizeof(void *), "oVft %d\n", pFuncDesc->oVft);
807 ok(pFuncDesc->wFuncFlags == 0, "oVft %d\n", pFuncDesc->wFuncFlags);
808 ok(pFuncDesc->elemdescFunc.tdesc.vt == VT_I4, "ret vt %x\n", pFuncDesc->elemdescFunc.tdesc.vt);
809 ITypeInfo_ReleaseFuncDesc(pTI2, pFuncDesc);
810
811 /* test GetIDsOfNames on a coclass to see if it searches its interfaces */
812 hr = ITypeInfo_GetIDsOfNames(pTypeInfo, &name, 1, &memid);
813 ok(hr == S_OK, "hr 0x%08lx\n", hr);
814 ok(memid == 0x123, "memid 0x%08lx\n", memid);
815
816 ITypeInfo_Release(pTI2);
817 ITypeInfo_Release(pTypeInfo);
818
819 SysFreeString(parms1[0].szName);
820 SysFreeString(parms1[1].szName);
821 SysFreeString(parms3[0].szName);
822 SysFreeString(methdata[0].szName);
823 SysFreeString(methdata[1].szName);
824 SysFreeString(methdata[2].szName);
825 SysFreeString(methdata[3].szName);
826}
WCHAR OLECHAR
Definition: compat.h:2292
@ VT_HRESULT
Definition: compat.h:2319
HRESULT WINAPI CreateDispTypeInfo(INTERFACEDATA *pidata, LCID lcid, ITypeInfo **pptinfo)
Definition: typelib.c:8792
#define debugstr_guid
Definition: kernel32.h:35
#define GUID_NULL
Definition: ks.h:106
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define DISPATCH_PROPERTYPUT
Definition: oleauto.h:1008
static const WCHAR szName[]
Definition: powrprof.c:45
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
@ CC_STDCALL
Definition: spec2def.c:94
METHODDATA * pmethdata
Definition: oleauto.h:919
DISPID dispid
Definition: oleauto.h:908
UINT iMeth
Definition: oleauto.h:909
VARTYPE vtReturn
Definition: oleauto.h:913
PARAMDATA * ppdata
Definition: oleauto.h:907
UINT cArgs
Definition: oleauto.h:911
WORD wFlags
Definition: oleauto.h:912
CALLCONV cc
Definition: oleauto.h:910
OLECHAR * szName
Definition: oleauto.h:906
OLECHAR * szName
Definition: oleauto.h:899
VARTYPE vt
Definition: oleauto.h:900
@ TKIND_COCLASS
Definition: widltypes.h:239
@ TKIND_INTERFACE
Definition: widltypes.h:237

Referenced by START_TEST().

◆ test_CreateTypeLib()

static void test_CreateTypeLib ( SYSKIND  sys)
static

Definition at line 2133 of file typelib.c.

2133 {
2134 static OLECHAR typelibW[] = {'t','y','p','e','l','i','b',0};
2135 static OLECHAR helpfileW[] = {'C',':','\\','b','o','g','u','s','.','h','l','p',0};
2136 static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
2137 static OLECHAR interface2W[] = {'i','n','t','e','r','f','a','c','e','2',0};
2138 static OLECHAR interface3W[] = {'i','n','t','e','r','f','a','c','e','3',0};
2139 static OLECHAR dualW[] = {'d','u','a','l',0};
2140 static OLECHAR coclassW[] = {'c','o','c','l','a','s','s',0};
2141 static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0};
2142 static OLECHAR func1W[] = {'f','u','n','c','1',0};
2143 static OLECHAR func2W[] = {'f','u','n','c','2',0};
2144 static OLECHAR prop1W[] = {'P','r','o','p','1',0};
2145 static OLECHAR param1W[] = {'p','a','r','a','m','1',0};
2146 static OLECHAR param2W[] = {'p','a','r','a','m','2',0};
2147 static OLECHAR asdfW[] = {'A','s','d','f',0};
2148 static OLECHAR aliasW[] = {'a','l','i','a','s',0};
2149 static OLECHAR invokeW[] = {'I','n','v','o','k','e',0};
2150 static OLECHAR *names1[] = {func1W, param1W, param2W};
2151 static OLECHAR *names2[] = {func2W, param1W, param2W};
2152 static OLECHAR *propname[] = {prop1W, param1W};
2153 static const GUID tlcustguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x69}};
2154 static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}};
2155 static const GUID bogusguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x71}};
2156 static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
2157 static const GUID interface2guid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcd}};
2158
2159 ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti, *ti_2;
2160 char filename[MAX_PATH];
2162 ICreateTypeLib2 *createtl;
2163 ICreateTypeInfo *createti;
2164 ICreateTypeInfo2 *createti2;
2165 ITypeLib *tl, *stdole;
2166 ITypeLib2 *tl2;
2167 ITypeInfo *tinfos[2];
2168 ITypeInfo2 *ti2;
2169 ITypeComp *tcomp, *tcomp2;
2170 MEMBERID memids[2];
2171 FUNCDESC funcdesc, *pfuncdesc;
2172 ELEMDESC elemdesc[5], *edesc;
2173 PARAMDESCEX paramdescex;
2174 TYPEDESC typedesc1, typedesc2;
2175 TYPEATTR *typeattr;
2176 TLIBATTR *libattr;
2177 HREFTYPE hreftype;
2178 BSTR name, docstring, helpfile, names[3];
2179 DWORD helpcontext, ptr_size, alignment;
2180 int impltypeflags;
2181 unsigned int cnames;
2182 USHORT found;
2183 VARIANT cust_data;
2184 HRESULT hres;
2185 TYPEKIND kind;
2186 DESCKIND desckind;
2187 BINDPTR bindptr;
2188 SYSKIND native_sys = is_win64 ? SYS_WIN64 : SYS_WIN32;
2189
2190 switch(sys){
2191 case SYS_WIN32:
2192 winetest_push_context( "win32" );
2193 ptr_size = 4;
2194 alignment = sizeof(void*);
2195 break;
2196 case SYS_WIN64:
2197 winetest_push_context( "win64" );
2198 ptr_size = 8;
2199 alignment = 4;
2200 break;
2201 default:
2202 return;
2203 }
2204
2206 ok(hres == S_OK, "got %08lx\n", hres);
2207
2208 hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IUnknown, &unknown);
2209 ok(hres == S_OK, "got %08lx\n", hres);
2210
2211 hres = ITypeInfo_GetTypeAttr(unknown, &typeattr);
2212 ok(hres == S_OK, "got %08lx\n", hres);
2213 ok(typeattr->cbSizeVft == 3 * sizeof(void*), "Got wrong cbSizeVft: %u\n", typeattr->cbSizeVft);
2214 ITypeInfo_ReleaseTypeAttr(unknown, typeattr);
2215
2216 hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispatch);
2217 ok(hres == S_OK, "got %08lx\n", hres);
2218
2219 GetTempFileNameA(".", "tlb", 0, filename);
2221
2222 hres = CreateTypeLib2(sys, filenameW, &createtl);
2223 ok(hres == S_OK, "got %08lx\n", hres);
2224
2225 hres = ICreateTypeLib2_QueryInterface(createtl, &IID_ITypeLib, (void**)&tl);
2226 ok(hres == S_OK, "got %08lx\n", hres);
2227
2228 hres = ITypeLib_GetTypeInfo(tl, 0, NULL);
2229 ok(hres == E_INVALIDARG, "got 0x%08lx\n", hres);
2230
2231 hres = ITypeLib_GetTypeInfoType(tl, 0, &kind);
2232 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got 0x%08lx\n", hres);
2233
2234 hres = ITypeLib_GetTypeInfoType(tl, 0, NULL);
2235 ok(hres == E_INVALIDARG, "got 0x%08lx\n", hres);
2236
2237 hres = ITypeLib_GetTypeInfoType(tl, 0, NULL);
2238 ok(hres == E_INVALIDARG, "got 0x%08lx\n", hres);
2239
2240 hres = ITypeLib_GetLibAttr(tl, NULL);
2241 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2242
2243 hres = ITypeLib_GetLibAttr(tl, &libattr);
2244 ok(hres == S_OK, "got %08lx\n", hres);
2245
2246 ok(libattr->syskind == sys, "syskind = %d\n", libattr->syskind);
2247 ok(libattr->wMajorVerNum == 0, "wMajorVer = %d\n", libattr->wMajorVerNum);
2248 ok(libattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", libattr->wMinorVerNum);
2249 ok(libattr->wLibFlags == 0, "wLibFlags = %d\n", libattr->wLibFlags);
2250
2251 ITypeLib_ReleaseTLibAttr(tl, libattr);
2252
2253 name = (BSTR)0xdeadbeef;
2254 hres = ITypeLib_GetDocumentation(tl, -1, &name, &docstring, &helpcontext, &helpfile);
2255 ok(hres == S_OK, "got %08lx\n", hres);
2256 ok(name == NULL, "name != NULL\n");
2257 ok(docstring == NULL, "docstring != NULL\n");
2258 ok(helpcontext == 0, "helpcontext != 0\n");
2259 ok(helpfile == NULL, "helpfile != NULL\n");
2260
2261 hres = ITypeLib_GetDocumentation(tl, 0, &name, NULL, NULL, NULL);
2262 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2263
2264 hres = ICreateTypeLib2_SetName(createtl, typelibW);
2265 ok(hres == S_OK, "got %08lx\n", hres);
2266
2267 hres = ICreateTypeLib2_SetHelpFileName(createtl, helpfileW);
2268 ok(hres == S_OK, "got %08lx\n", hres);
2269
2270 hres = ITypeLib_GetDocumentation(tl, -1, NULL, NULL, NULL, NULL);
2271 ok(hres == S_OK, "got %08lx\n", hres);
2272
2273 hres = ITypeLib_GetDocumentation(tl, -1, &name, NULL, NULL, &helpfile);
2274 ok(hres == S_OK, "got %08lx\n", hres);
2275 ok(!memcmp(name, typelibW, sizeof(typelibW)), "name = %s\n", wine_dbgstr_w(name));
2276 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
2277
2280
2281 V_VT(&cust_data) = VT_I4;
2282 V_I4(&cust_data) = 1;
2283 hres = ICreateTypeLib2_SetCustData(createtl, &tlcustguid, &cust_data);
2284 ok(hres == S_OK, "got %08lx\n", hres);
2285
2286 hres = ITypeLib_QueryInterface(tl, &IID_ITypeLib2, (void**)&tl2);
2287 ok(hres == S_OK, "no ITypeLib2 interface (%lx)\n", hres);
2288
2289 V_VT(&cust_data) = VT_EMPTY;
2290 V_I4(&cust_data) = 0;
2291 hres = ITypeLib2_GetCustData(tl2, &tlcustguid, &cust_data);
2292 ok(hres == S_OK, "got %08lx\n", hres);
2293 ok(V_VT(&cust_data) == VT_I4, "V_VT(&cust_data) = %d\n", V_VT(&cust_data));
2294 ok(V_I4(&cust_data) == 1, "V_I4(&cust_data) = %ld\n", V_I4(&cust_data));
2295
2296 ITypeLib2_Release(tl2);
2297
2298 /* invalid parameters */
2299 hres = ICreateTypeLib2_CreateTypeInfo(createtl, NULL, TKIND_INTERFACE, &createti);
2300 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2301
2302 hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, NULL);
2303 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2304
2305 hres = ICreateTypeLib2_CreateTypeInfo(createtl, NULL, TKIND_INTERFACE, NULL);
2306 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2307
2308 hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
2309 ok(hres == S_OK, "got %08lx\n", hres);
2310
2311 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface1);
2312 ok(hres == S_OK, "got %08lx\n", hres);
2313
2314 hres = ITypeLib_GetDocumentation(tl, 0, &name, NULL, NULL, NULL);
2315 ok(hres == S_OK, "got %08lx\n", hres);
2316 ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
2317
2319
2320 ITypeLib_Release(tl);
2321
2322 name = (BSTR)0xdeadbeef;
2323 helpfile = (BSTR)0xdeadbeef;
2324 hres = ITypeInfo_GetDocumentation(interface1, -1, &name, &docstring, &helpcontext, &helpfile);
2325 ok(hres == S_OK, "got %08lx\n", hres);
2326 ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
2327 ok(docstring == NULL, "docstring != NULL\n");
2328 ok(helpcontext == 0, "helpcontext != 0\n");
2329 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
2330
2333
2334 hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
2335 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2336
2337 hres = ITypeInfo_GetRefTypeInfo(interface1, 0, NULL);
2338 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2339
2340
2341 hres = ICreateTypeInfo_LayOut(createti);
2342 ok(hres == S_OK, "got %08lx\n", hres);
2343
2344 hres = ICreateTypeInfo_SetGuid(createti, &interfaceguid);
2345 ok(hres == S_OK, "got %08lx\n", hres);
2346
2347 hres = ICreateTypeInfo_AddRefTypeInfo(createti, NULL, &hreftype);
2348 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2349
2350 hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, NULL);
2351 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2352
2353 hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
2354 ok(hres == S_OK, "got %08lx\n", hres);
2355
2356 hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
2357 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2358
2359 hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
2360 ok(hres == S_OK, "got %08lx\n", hres);
2361
2362 hres = ITypeInfo_GetRefTypeOfImplType(interface1, 0, &hreftype);
2363 ok(hres == S_OK, "got %08lx\n", hres);
2364 ok(hreftype == 3, "hreftype = %ld\n", hreftype);
2365
2366 hres = ITypeInfo_GetRefTypeInfo(interface1, hreftype, &ti);
2367 ok(hres == S_OK, "got %08lx\n", hres);
2368
2369 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
2370 ok(hres == S_OK, "got %08lx\n", hres);
2371 todo_wine_if(sys != native_sys)
2372 ok(typeattr->cbSizeInstance == ptr_size, "retrieved IUnknown gave wrong cbSizeInstance: %lu\n", typeattr->cbSizeInstance);
2373 todo_wine_if(sys != native_sys)
2374 ok(typeattr->cbSizeVft == 3 * ptr_size, "retrieved IUnknown gave wrong cbSizeVft: %u\n", typeattr->cbSizeVft);
2375 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
2376
2377 ITypeInfo_Release(ti);
2378
2379 hres = ITypeInfo_GetRefTypeOfImplType(interface1, -1, &hreftype);
2380 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2381
2382 ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo2, (void**)&ti2);
2383
2384 memset(&funcdesc, 0, sizeof(FUNCDESC));
2385 funcdesc.funckind = FUNC_PUREVIRTUAL;
2386 funcdesc.invkind = INVOKE_PROPERTYGET;
2387 funcdesc.callconv = CC_STDCALL;
2388 funcdesc.elemdescFunc.tdesc.vt = VT_BSTR;
2389 funcdesc.elemdescFunc.idldesc.wIDLFlags = IDLFLAG_NONE;
2390
2391 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, NULL);
2392 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2393
2394 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2395 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2396
2397 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
2398 ok(hres == S_OK, "got %08lx\n", hres);
2399
2400 hres = ITypeInfo2_GetFuncDesc(ti2, 0, NULL);
2401 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2402
2403 hres = ITypeInfo2_GetFuncDesc(ti2, 1, &pfuncdesc);
2404 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2405
2406 hres = ITypeInfo2_GetFuncDesc(ti2, 0, &pfuncdesc);
2407 ok(hres == S_OK, "got %08lx\n", hres);
2408
2409 ok(pfuncdesc->memid == 0, "got %lx\n", pfuncdesc->memid);
2410 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2411 ok(pfuncdesc->lprgelemdescParam == NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2412 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2413 ok(pfuncdesc->invkind == INVOKE_PROPERTYGET, "got 0x%x\n", pfuncdesc->invkind);
2414 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2415 ok(pfuncdesc->cParams == 0, "got %d\n", pfuncdesc->cParams);
2416 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2417 todo_wine_if(sys != native_sys)
2418 ok(pfuncdesc->oVft == 3 * ptr_size, "got %d\n", pfuncdesc->oVft);
2419 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2420 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_BSTR, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2421 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2422
2423 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2424
2425 hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
2426 ok(hres == S_OK, "got %08lx\n", hres);
2427
2428 funcdesc.invkind = INVOKE_PROPERTYPUT;
2429 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2430 ok(hres == TYPE_E_INCONSISTENTPROPFUNCS, "got %08lx\n", hres);
2431
2432 funcdesc.invkind = INVOKE_PROPERTYPUTREF;
2433 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2434 ok(hres == TYPE_E_INCONSISTENTPROPFUNCS, "got %08lx\n", hres);
2435
2436 elemdesc[0].tdesc.vt = VT_BSTR;
2437 elemdesc[0].idldesc.dwReserved = 0;
2438 elemdesc[0].idldesc.wIDLFlags = IDLFLAG_FIN;
2439
2440 funcdesc.lprgelemdescParam = elemdesc;
2441 funcdesc.invkind = INVOKE_PROPERTYPUT;
2442 funcdesc.cParams = 1;
2443 funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
2444
2445 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2446 ok(hres == S_OK, "got %08lx\n", hres);
2447
2448 hres = ICreateTypeInfo_SetFuncHelpContext(createti, 1, 0xabcdefab);
2449 ok(hres == S_OK, "got %08lx\n", hres);
2450
2451 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, propname, 0);
2452 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2453
2454 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, NULL, 1);
2455 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2456
2457 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, propname, 1);
2458 ok(hres == S_OK, "got %08lx\n", hres);
2459
2460 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, propname, 1);
2461 ok(hres == S_OK, "got %08lx\n", hres);
2462
2463 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, propname, 2);
2464 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2465
2466 hres = ITypeInfo2_GetFuncDesc(ti2, 1, &pfuncdesc);
2467 ok(hres == S_OK, "got %08lx\n", hres);
2468
2469 ok(pfuncdesc->memid == 0, "got %lx\n", pfuncdesc->memid);
2470 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2471 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2472 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2473 ok(pfuncdesc->invkind == INVOKE_PROPERTYPUT, "got 0x%x\n", pfuncdesc->invkind);
2474 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2475 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2476 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2477 todo_wine_if(sys != native_sys)
2478 ok(pfuncdesc->oVft == 4 * ptr_size, "got %d\n", pfuncdesc->oVft);
2479 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2480 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2481 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2482
2483 edesc = pfuncdesc->lprgelemdescParam;
2484 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
2485 ok(edesc->idldesc.wIDLFlags == IDLFLAG_FIN, "got: %x\n", edesc->idldesc.wIDLFlags);
2486
2487 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2488
2489
2490 funcdesc.invkind = INVOKE_PROPERTYPUTREF;
2491 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
2492 ok(hres == S_OK, "got %08lx\n", hres);
2493
2494 hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
2495 ok(hres == S_OK, "got %08lx\n", hres);
2496
2497 hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0x201);
2498 ok(hres == S_OK, "got %08lx\n", hres);
2499
2500 funcdesc.memid = 1;
2501 funcdesc.lprgelemdescParam = NULL;
2502 funcdesc.invkind = INVOKE_FUNC;
2503 funcdesc.cParams = 0;
2504 funcdesc.cScodes = 1;
2505 funcdesc.lprgscode = NULL;
2506 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2507 ok(hres == S_OK, "got %08lx\n", hres);
2508
2509 hres = ITypeInfo2_GetFuncDesc(ti2, 1, &pfuncdesc);
2510 ok(hres == S_OK, "got %08lx\n", hres);
2511
2512 ok(pfuncdesc->memid == 1, "got %ld\n", pfuncdesc->memid);
2513 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2514 ok(pfuncdesc->lprgelemdescParam == NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2515 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2516 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2517 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2518 ok(pfuncdesc->cParams == 0, "got %d\n", pfuncdesc->cParams);
2519 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2520 todo_wine_if(sys != native_sys)
2521 ok(pfuncdesc->oVft == 4 * ptr_size, "got %d\n", pfuncdesc->oVft);
2522 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2523 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2524 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2525
2526 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2527
2528 funcdesc.memid = MEMBERID_NIL;
2529 hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
2530 ok(hres == S_OK, "got %08lx\n", hres);
2531
2532 elemdesc[0].tdesc.vt = VT_PTR;
2533 elemdesc[0].tdesc.lptdesc = &typedesc1;
2534 typedesc1.vt = VT_BSTR;
2535 funcdesc.cParams = 1;
2536 funcdesc.lprgelemdescParam = elemdesc;
2537 hres = ICreateTypeInfo_AddFuncDesc(createti, 4, &funcdesc);
2538 ok(hres == S_OK, "got %08lx\n", hres);
2539
2540 hres = ITypeInfo2_GetFuncDesc(ti2, 4, &pfuncdesc);
2541 ok(hres == S_OK, "got %08lx\n", hres);
2542
2543 ok(pfuncdesc->memid == 0x60010004, "got %lx\n", pfuncdesc->memid);
2544 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2545 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2546 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2547 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2548 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2549 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2550 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2551 todo_wine_if(sys != native_sys)
2552 ok(pfuncdesc->oVft == 7 * ptr_size, "got %d\n", pfuncdesc->oVft);
2553 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2554 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2555 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2556
2557 edesc = pfuncdesc->lprgelemdescParam;
2558 ok(edesc->tdesc.vt == VT_PTR, "got: %d\n", edesc->tdesc.vt);
2559 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2560 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2561 ok(edesc->tdesc.lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc);
2562 ok(edesc->tdesc.lptdesc->vt == VT_BSTR, "got: %d\n", edesc->tdesc.lptdesc->vt);
2563
2564 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2565
2566 elemdesc[0].tdesc.lptdesc = &typedesc2;
2567 typedesc2.vt = VT_PTR;
2568 typedesc2.lptdesc = &typedesc1;
2569 hres = ICreateTypeInfo_AddFuncDesc(createti, 4, &funcdesc);
2570 ok(hres == S_OK, "got %08lx\n", hres);
2571
2572 hres = ITypeInfo2_GetFuncDesc(ti2, 4, &pfuncdesc);
2573 ok(hres == S_OK, "got %08lx\n", hres);
2574
2575 ok(pfuncdesc->memid == 0x60010007, "got %lx\n", pfuncdesc->memid);
2576 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2577 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2578 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2579 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2580 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2581 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2582 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2583 todo_wine_if(sys != native_sys)
2584 ok(pfuncdesc->oVft == 7 * ptr_size, "got %d\n", pfuncdesc->oVft);
2585 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2586 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2587 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2588
2589 edesc = pfuncdesc->lprgelemdescParam;
2590 ok(edesc->tdesc.vt == VT_PTR, "got: %d\n", edesc->tdesc.vt);
2591 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2592 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2593 ok(edesc->tdesc.lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc);
2594 ok(edesc->tdesc.lptdesc->vt == VT_PTR, "got: %d\n", edesc->tdesc.lptdesc->vt);
2595 ok(edesc->tdesc.lptdesc->lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc->lptdesc);
2596 ok(edesc->tdesc.lptdesc->lptdesc->vt == VT_BSTR, "got: %d\n", edesc->tdesc.lptdesc->lptdesc->vt);
2597
2598 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2599
2600 elemdesc[0].tdesc.vt = VT_INT;
2601 elemdesc[0].paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
2602 elemdesc[0].paramdesc.pparamdescex = &paramdescex;
2603 V_VT(&paramdescex.varDefaultValue) = VT_INT;
2604 V_INT(&paramdescex.varDefaultValue) = 0x123;
2605 hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
2606 ok(hres == S_OK, "got %08lx\n", hres);
2607
2608 hres = ITypeInfo2_GetFuncDesc(ti2, 3, &pfuncdesc);
2609 ok(hres == S_OK, "got %08lx\n", hres);
2610
2611 ok(pfuncdesc->memid == 0x60010003, "got %lx\n", pfuncdesc->memid);
2612 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2613 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2614 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2615 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2616 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2617 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2618 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2619 todo_wine_if(sys != native_sys)
2620 ok(pfuncdesc->oVft == 6 * ptr_size, "got %d\n", pfuncdesc->oVft);
2621 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2622 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2623 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2624
2625 edesc = pfuncdesc->lprgelemdescParam;
2626 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
2627 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2628 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2629 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
2630 edesc->paramdesc.pparamdescex->cBytes);
2631 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_I4, "got: %d\n",
2632 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2633 ok(V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x123, "got: 0x%lx\n",
2634 V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue));
2635
2636 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2637
2638 elemdesc[0].idldesc.dwReserved = 0;
2639 elemdesc[0].idldesc.wIDLFlags = IDLFLAG_FIN;
2640 elemdesc[1].tdesc.vt = VT_UI2;
2641 elemdesc[1].paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
2642 elemdesc[1].paramdesc.pparamdescex = &paramdescex;
2643 V_VT(&paramdescex.varDefaultValue) = VT_UI2;
2644 V_UI2(&paramdescex.varDefaultValue) = 0xffff;
2645 funcdesc.cParams = 2;
2646 hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
2647 ok(hres == S_OK, "got %08lx\n", hres);
2648
2649 hres = ITypeInfo2_GetFuncDesc(ti2, 3, &pfuncdesc);
2650 ok(hres == S_OK, "got %08lx\n", hres);
2651
2652 ok(pfuncdesc->memid == 0x60010009, "got %lx\n", pfuncdesc->memid);
2653 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2654 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2655 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2656 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2657 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2658 ok(pfuncdesc->cParams == 2, "got %d\n", pfuncdesc->cParams);
2659 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2660 todo_wine_if(sys != native_sys)
2661 ok(pfuncdesc->oVft == 6 * ptr_size, "got %d\n", pfuncdesc->oVft);
2662 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2663 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2664 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2665
2666 edesc = pfuncdesc->lprgelemdescParam;
2667 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
2668 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2669 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2670
2671 edesc = pfuncdesc->lprgelemdescParam + 1;
2672 ok(edesc->tdesc.vt == VT_UI2, "got: %d\n", edesc->tdesc.vt);
2673 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2674 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2675 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
2676 edesc->paramdesc.pparamdescex->cBytes);
2677 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_UI2, "got: %d\n",
2678 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2679 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0xFFFF, "got: 0x%x\n",
2680 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
2681
2682 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2683
2684 elemdesc[0].paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
2685 elemdesc[0].paramdesc.pparamdescex = &paramdescex;
2686 elemdesc[1].tdesc.vt = VT_INT;
2687 V_VT(&paramdescex.varDefaultValue) = VT_INT;
2688 V_INT(&paramdescex.varDefaultValue) = 0xffffffff;
2689 hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
2690 ok(hres == S_OK, "got %08lx\n", hres);
2691
2692 elemdesc[0].tdesc.vt = VT_BSTR;
2693 elemdesc[1].tdesc.vt = VT_BSTR;
2694 V_VT(&paramdescex.varDefaultValue) = VT_BSTR;
2695 V_BSTR(&paramdescex.varDefaultValue) = SysAllocString(defaultW);
2696 hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
2697 ok(hres == S_OK, "got %08lx\n", hres);
2698 SysFreeString(V_BSTR(&paramdescex.varDefaultValue));
2699
2700 hres = ITypeInfo2_GetFuncDesc(ti2, 3, &pfuncdesc);
2701 ok(hres == S_OK, "got %08lx\n", hres);
2702
2703 ok(pfuncdesc->memid == 0x6001000b, "got %lx\n", pfuncdesc->memid);
2704 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2705 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2706 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2707 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2708 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2709 ok(pfuncdesc->cParams == 2, "got %d\n", pfuncdesc->cParams);
2710 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2711 todo_wine_if(sys != native_sys)
2712 ok(pfuncdesc->oVft == 6 * ptr_size, "got %d\n", pfuncdesc->oVft);
2713 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2714 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2715 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2716
2717 edesc = pfuncdesc->lprgelemdescParam;
2718 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
2719 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2720 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2721 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
2722 edesc->paramdesc.pparamdescex->cBytes);
2723 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n",
2724 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2725 ok(compare_wstr(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue), defaultW),
2726 "got: %s\n",
2727 wine_dbgstr_w(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue)));
2728
2729 edesc = pfuncdesc->lprgelemdescParam + 1;
2730 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
2731 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2732 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2733 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
2734 edesc->paramdesc.pparamdescex->cBytes);
2735 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n",
2736 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2737 ok(compare_wstr(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue), defaultW),
2738 "got: %s\n",
2739 wine_dbgstr_w(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue)));
2740
2741 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2742
2743 elemdesc[0].tdesc.vt = VT_USERDEFINED;
2744 elemdesc[0].tdesc.hreftype = hreftype;
2745 elemdesc[0].paramdesc.pparamdescex = &paramdescex;
2746 elemdesc[0].paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
2747 V_VT(&paramdescex.varDefaultValue) = VT_INT;
2748 V_INT(&paramdescex.varDefaultValue) = 0x789;
2749
2750 funcdesc.lprgelemdescParam = elemdesc;
2751 funcdesc.invkind = INVOKE_FUNC;
2752 funcdesc.cParams = 1;
2753 funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
2754
2755 hres = ICreateTypeInfo_AddFuncDesc(createti, 5, &funcdesc);
2756 ok(hres == S_OK, "got %08lx\n", hres);
2757
2758 hres = ITypeInfo2_GetFuncDesc(ti2, 5, &pfuncdesc);
2759 ok(hres == S_OK, "got %08lx\n", hres);
2760
2761 ok(pfuncdesc->memid == 0x60010005, "got %lx\n", pfuncdesc->memid);
2762 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2763 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2764 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2765 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2766 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2767 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2768 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2769 todo_wine_if(sys != native_sys)
2770 ok(pfuncdesc->oVft == 8 * ptr_size, "got %d\n", pfuncdesc->oVft);
2771 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2772 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2773 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2774
2775 edesc = pfuncdesc->lprgelemdescParam;
2776 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2777 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
2778 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2779 ok(edesc->tdesc.vt == VT_USERDEFINED, "got: %d\n", edesc->tdesc.vt);
2780 ok(edesc->tdesc.hreftype == hreftype, "got: 0x%lx\n", edesc->tdesc.hreftype);
2781 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
2782 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2783 ok(V_INT(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x789, "got: %d\n",
2784 V_INT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2785
2786 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2787
2788 elemdesc[0].tdesc.vt = VT_VARIANT;
2789 elemdesc[0].paramdesc.pparamdescex = &paramdescex;
2790 elemdesc[0].paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
2791 V_VT(&paramdescex.varDefaultValue) = VT_INT;
2792 V_INT(&paramdescex.varDefaultValue) = 3;
2793
2794 funcdesc.lprgelemdescParam = elemdesc;
2795 funcdesc.invkind = INVOKE_FUNC;
2796 funcdesc.cParams = 1;
2797 funcdesc.elemdescFunc.tdesc.vt = VT_VARIANT;
2798
2799 hres = ICreateTypeInfo_AddFuncDesc(createti, 6, &funcdesc);
2800 ok(hres == S_OK, "got %08lx\n", hres);
2801
2802 hres = ITypeInfo2_GetFuncDesc(ti2, 6, &pfuncdesc);
2803 ok(hres == S_OK, "got %08lx\n", hres);
2804
2805 ok(pfuncdesc->memid == 0x60010006, "got %lx\n", pfuncdesc->memid);
2806 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2807 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2808 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2809 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2810 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2811 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2812 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2813 todo_wine_if(sys != native_sys)
2814 ok(pfuncdesc->oVft == 9 * ptr_size, "got %d\n", pfuncdesc->oVft);
2815 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2816 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VARIANT, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2817 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2818
2819 edesc = pfuncdesc->lprgelemdescParam;
2820 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
2821 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
2822 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
2823 ok(edesc->tdesc.vt == VT_VARIANT, "got: %d\n", edesc->tdesc.vt);
2824 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
2825 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2826 ok(V_INT(&edesc->paramdesc.pparamdescex->varDefaultValue) == 3, "got: %d\n",
2827 V_INT(&edesc->paramdesc.pparamdescex->varDefaultValue));
2828
2829 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2830
2831 hres = ITypeInfo_GetDocumentation(interface1, 0, &name, &docstring, &helpcontext, &helpfile);
2832 ok(hres == S_OK, "got %08lx\n", hres);
2833 ok(name == NULL, "name != NULL\n");
2834 ok(docstring == NULL, "docstring != NULL\n");
2835 ok(helpcontext == 0x201, "helpcontext != 0x201\n");
2836 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
2837
2839
2840 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, NULL, 1);
2841 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2842
2843 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, names1, 1);
2844 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2845
2846 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 2);
2847 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2848
2849 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names2, 1);
2850 ok(hres == S_OK, "got %08lx\n", hres);
2851
2852 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 1);
2853 ok(hres == S_OK, "got %08lx\n", hres);
2854
2855 hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
2856 ok(hres == S_OK, "got %08lx\n", hres);
2857 ok(!memcmp(name, func1W, sizeof(func1W)), "name = %s\n", wine_dbgstr_w(name));
2858
2860
2861 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names2, 3);
2862 ok(hres == S_OK, "got %08lx\n", hres);
2863
2864 hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names1, 3);
2865 ok(hres == TYPE_E_AMBIGUOUSNAME, "got %08lx\n", hres);
2866
2867 ITypeInfo2_Release(ti2);
2868 ICreateTypeInfo_Release(createti);
2869
2870 hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
2871 ok(hres == TYPE_E_NAMECONFLICT, "got %08lx\n", hres);
2872
2873 hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface2W, TKIND_INTERFACE, &createti);
2874 ok(hres == S_OK, "got %08lx\n", hres);
2875
2876 hres = ICreateTypeInfo_SetGuid(createti, &interface2guid);
2877 ok(hres == S_OK, "got %08lx\n", hres);
2878
2879 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface2);
2880 ok(hres == S_OK, "got %08lx\n", hres);
2881
2882 hres = ITypeInfo_GetRefTypeOfImplType(interface2, 0, &hreftype);
2883 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2884
2885 hres = ICreateTypeInfo_AddRefTypeInfo(createti, interface1, &hreftype);
2886 ok(hres == S_OK, "got %08lx\n", hres);
2887
2888 hres = ITypeInfo_GetRefTypeInfo(interface2, 0, &ti);
2889 ok(hres == S_OK, "got %08lx\n", hres);
2890 ok(ti == interface1, "Received and added interfaces are different\n");
2891
2892 ITypeInfo_Release(ti);
2893
2894 hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
2895 ok(hres == S_OK, "got %08lx\n", hres);
2896
2897 hres = ITypeInfo_GetRefTypeOfImplType(interface2, 0, &hreftype);
2898 ok(hres == S_OK, "got %08lx\n", hres);
2899 ok(hreftype == 2, "hreftype = %ld\n", hreftype);
2900
2901 hres = ITypeInfo_GetRefTypeOfImplType(interface2, -1, &hreftype);
2902 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2903
2904 hres = ICreateTypeInfo_SetImplTypeFlags(createti, 0, IMPLTYPEFLAG_FDEFAULT);
2905 ok(hres == TYPE_E_BADMODULEKIND, "got %08lx\n", hres);
2906
2907 hres = ITypeInfo_GetImplTypeFlags(interface2, 0, &impltypeflags);
2908 ok(hres == S_OK, "got %08lx\n", hres);
2909 ok(impltypeflags == 0, "impltypeflags = %x\n", impltypeflags);
2910
2911 hres = ITypeInfo_GetImplTypeFlags(interface2, 1, &impltypeflags);
2912 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
2913
2914 funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
2915 funcdesc.oVft = 0xaaac;
2916 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
2917 if(sys == SYS_WIN64){
2918 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2919 funcdesc.oVft = 0xaab0;
2920 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
2921 }
2922 ok(hres == S_OK, "got %08lx\n", hres);
2923 funcdesc.oVft = 0xaaa8;
2924 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
2925 ok(hres == S_OK, "got %08lx\n", hres);
2926
2927 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&ti2);
2928 ok(hres == S_OK, "got %08lx\n", hres);
2929
2930 hres = ITypeInfo2_GetFuncDesc(ti2, 0, &pfuncdesc);
2931 ok(hres == S_OK, "got %08lx\n", hres);
2932
2933 ok(pfuncdesc->memid == 0x60020000, "got %lx\n", pfuncdesc->memid);
2934 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
2935 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
2936 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
2937 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
2938 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
2939 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
2940 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
2941 ok(pfuncdesc->oVft == (short)0xaaa8, "got %d\n", pfuncdesc->oVft);
2942 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
2943 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
2944 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
2945
2946 ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
2947 ITypeInfo2_Release(ti2);
2948
2949 funcdesc.oVft = 0;
2950
2951 ICreateTypeInfo_Release(createti);
2952
2953 VariantInit(&cust_data);
2954
2955 hres = ICreateTypeLib2_CreateTypeInfo(createtl, interface3W, TKIND_INTERFACE, &createti);
2956 ok(hres == S_OK, "got %08lx\n", hres);
2957
2958 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void**)&createti2);
2959 ok(hres == S_OK, "got %08lx\n", hres);
2960
2961 hres = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo2, (void**)&ti2);
2962 ok(hres == S_OK, "got %08lx\n", hres);
2963
2964 hres = ITypeInfo2_GetCustData(ti2, NULL, NULL);
2965 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2966
2967 hres = ITypeInfo2_GetCustData(ti2, &custguid, NULL);
2968 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2969
2970 hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
2971 ok(hres == S_OK, "got %08lx\n", hres);
2972
2973 hres = ICreateTypeInfo2_SetCustData(createti2, NULL, NULL);
2974 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2975
2976 hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, NULL);
2977 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
2978
2979 hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
2980 ok(hres == DISP_E_BADVARTYPE, "got %08lx\n", hres);
2981
2982 V_VT(&cust_data) = VT_UI4;
2983 V_I4(&cust_data) = 0xdeadbeef;
2984
2985 hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
2986 ok(hres == S_OK, "got %08lx\n", hres);
2987
2988 V_I4(&cust_data) = 0;
2989 V_VT(&cust_data) = VT_EMPTY;
2990
2991 hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
2992 ok(hres == S_OK, "got %08lx\n", hres);
2993
2994 ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
2995 ok(V_I4(&cust_data) == 0xdeadbeef, "got 0x%08lx\n", V_I4(&cust_data));
2996
2997 V_VT(&cust_data) = VT_UI4;
2998 V_I4(&cust_data) = 12345678;
2999
3000 hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
3001 ok(hres == S_OK, "got %08lx\n", hres);
3002
3003 V_I4(&cust_data) = 0;
3004 V_VT(&cust_data) = VT_EMPTY;
3005
3006 hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
3007 ok(hres == S_OK, "got %08lx\n", hres);
3008
3009 ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
3010 ok(V_I4(&cust_data) == 12345678, "got 0x%08lx\n", V_I4(&cust_data));
3011
3012 V_VT(&cust_data) = VT_BSTR;
3013 V_BSTR(&cust_data) = SysAllocString(asdfW);
3014
3015 hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
3016 ok(hres == S_OK, "got %08lx\n", hres);
3017
3018 SysFreeString(V_BSTR(&cust_data));
3019 V_I4(&cust_data) = 0;
3020 V_VT(&cust_data) = VT_EMPTY;
3021
3022 hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
3023 ok(hres == S_OK, "got %08lx\n", hres);
3024
3025 ok(V_VT(&cust_data) == VT_BSTR, "got %d\n", V_VT(&cust_data));
3026 ok(!lstrcmpW(V_BSTR(&cust_data), asdfW), "got %s\n", wine_dbgstr_w(V_BSTR(&cust_data)));
3027 SysFreeString(V_BSTR(&cust_data));
3028
3029 V_VT(&cust_data) = VT_UI4;
3030 V_UI4(&cust_data) = 17;
3031
3032 hres = ITypeInfo2_GetCustData(ti2, &bogusguid, &cust_data);
3033 ok(hres == S_OK, "got %08lx\n", hres);
3034
3035 ok(V_VT(&cust_data) == VT_EMPTY, "got: %d\n", V_VT(&cust_data));
3036
3037 ITypeInfo2_Release(ti2);
3038 ICreateTypeInfo2_Release(createti2);
3039 ICreateTypeInfo_Release(createti);
3040
3041 hres = ICreateTypeLib2_CreateTypeInfo(createtl, coclassW, TKIND_COCLASS, &createti);
3042 ok(hres == S_OK, "got %08lx\n", hres);
3043
3044 hres = ICreateTypeInfo_AddRefTypeInfo(createti, interface1, &hreftype);
3045 ok(hres == S_OK, "got %08lx\n", hres);
3046
3047 hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
3048 ok(hres == S_OK, "got %08lx\n", hres);
3049
3050 hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
3051 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
3052
3053 hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
3054 ok(hres == S_OK, "got %08lx\n", hres);
3055
3056 hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
3057 ok(hres == S_OK, "got %08lx\n", hres);
3058
3059 hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
3060 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
3061
3062 hres = ICreateTypeInfo_AddImplType(createti, 2, hreftype);
3063 ok(hres == S_OK, "got %08lx\n", hres);
3064
3065 hres = ICreateTypeInfo_SetImplTypeFlags(createti, 0, IMPLTYPEFLAG_FDEFAULT);
3066 ok(hres == S_OK, "got %08lx\n", hres);
3067
3068 hres = ICreateTypeInfo_SetImplTypeFlags(createti, 1, IMPLTYPEFLAG_FRESTRICTED);
3069 ok(hres == S_OK, "got %08lx\n", hres);
3070
3071 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&ti);
3072 ok(hres == S_OK, "got %08lx\n", hres);
3073
3074 hres = ITypeInfo_GetImplTypeFlags(ti, 0, NULL);
3075 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
3076
3077 hres = ITypeInfo_GetImplTypeFlags(ti, 0, &impltypeflags);
3078 ok(hres == S_OK, "got %08lx\n", hres);
3079 ok(impltypeflags == IMPLTYPEFLAG_FDEFAULT, "impltypeflags = %x\n", impltypeflags);
3080
3081 hres = ITypeInfo_GetImplTypeFlags(ti, 1, &impltypeflags);
3082 ok(hres == S_OK, "got %08lx\n", hres);
3083 ok(impltypeflags == IMPLTYPEFLAG_FRESTRICTED, "impltypeflags = %x\n", impltypeflags);
3084
3085 hres = ITypeInfo_GetImplTypeFlags(ti, 2, &impltypeflags);
3086 ok(hres == S_OK, "got %08lx\n", hres);
3087 ok(impltypeflags == 0, "impltypeflags = %x\n", impltypeflags);
3088
3089 hres = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype);
3090 ok(hres == S_OK, "got %08lx\n", hres);
3091 ok(hreftype == 0, "hreftype = %ld\n", hreftype);
3092
3093 hres = ITypeInfo_GetRefTypeOfImplType(ti, 1, &hreftype);
3094 ok(hres == S_OK, "got %08lx\n", hres);
3095 ok(hreftype == 1, "hreftype = %ld\n", hreftype);
3096
3097 hres = ITypeInfo_GetRefTypeOfImplType(ti, 2, &hreftype);
3098 ok(hres == S_OK, "got %08lx\n", hres);
3099 ok(hreftype == 1, "hreftype = %ld\n", hreftype);
3100
3101 hres = ITypeInfo_GetRefTypeOfImplType(ti, -1, &hreftype);
3102 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
3103
3104 ITypeInfo_Release(ti);
3105
3106 ICreateTypeInfo_Release(createti);
3107
3108 hres = ICreateTypeLib2_CreateTypeInfo(createtl, dualW, TKIND_INTERFACE, &createti);
3109 ok(hres == S_OK, "got %08lx\n", hres);
3110
3111 hres = ICreateTypeInfo_SetTypeFlags(createti, TYPEFLAG_FDUAL);
3112 ok(hres == S_OK, "got %08lx\n", hres);
3113
3114 hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
3115 ok(hres == S_OK, "got %08lx\n", hres);
3116
3117 hres = ICreateTypeInfo_AddRefTypeInfo(createti, dispatch, &hreftype);
3118 ok(hres == S_OK, "got %08lx\n", hres);
3119
3120 hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
3121 ok(hres == S_OK, "got %08lx\n", hres);
3122
3123 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&dual);
3124 ok(hres == S_OK, "got %08lx\n", hres);
3125
3126 hres = ITypeInfo_GetTypeAttr(dual, &typeattr);
3127 ok(hres == S_OK, "got %08lx\n", hres);
3128 ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3129 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
3130 ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs);
3131 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3132 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3133 todo_wine_if(sys != native_sys)
3134 ok(typeattr->cbSizeVft == 8 * ptr_size, "cbSizeVft = %d\n", typeattr->cbSizeVft);
3135 ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
3136 ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "wTypeFlags = %d\n", typeattr->wTypeFlags);
3137 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3138 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3139
3140 ITypeInfo_ReleaseTypeAttr(dual, typeattr);
3141
3142 hres = ITypeInfo_GetRefTypeOfImplType(dual, -1, &hreftype);
3143 ok(hres == S_OK, "got %08lx\n", hres);
3144 ok(hreftype == -2, "got %08lx\n", hreftype);
3145
3146 EXPECT_REF(dual, 2);
3147 hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti);
3148 ok(hres == S_OK, "got %08lx\n", hres);
3149 todo_wine
3150 EXPECT_REF(dual, 3);
3151
3152 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
3153 ok(hres == S_OK, "got %08lx\n", hres);
3154 ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3155 ok(typeattr->typekind == TKIND_DISPATCH, "typekind = %d\n", typeattr->typekind);
3156 todo_wine_if(sys != native_sys)
3157 ok(typeattr->cFuncs == 8, "cFuncs = %d\n", typeattr->cFuncs);
3158 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3159 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3160 ok(typeattr->cbSizeVft == 7 * sizeof(void *), "cbSizeVft = %d\n", typeattr->cbSizeVft);
3161 ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
3162 ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "wTypeFlags = %d\n", typeattr->wTypeFlags);
3163 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3164 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3165
3166 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
3167
3168 hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti_2);
3169 ok(hres == S_OK, "Failed to get reference typeinfo, hr %#lx.\n", hres);
3170todo_wine {
3171 ok(ti == ti_2, "Unexpected typeinfo instance.\n");
3172 EXPECT_REF(dual, 4);
3173}
3174 ITypeInfo_AddRef(ti_2);
3175 todo_wine
3176 EXPECT_REF(dual, 5);
3177 ITypeInfo_Release(ti_2);
3178
3179 ITypeInfo_Release(ti_2);
3180 ITypeInfo_Release(ti);
3181
3182 hres = ICreateTypeInfo_SetTypeDescAlias(createti, &typedesc1);
3183 ok(hres == TYPE_E_BADMODULEKIND, "got %08lx\n", hres);
3184
3185 ICreateTypeInfo_Release(createti);
3186
3187 hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
3188 ok(hres == S_OK, "got %08lx\n", hres);
3189 ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3190 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
3191 ok(typeattr->cFuncs == 13, "cFuncs = %d\n", typeattr->cFuncs);
3192 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3193 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3194 todo_wine_if(sys != native_sys)
3195 ok(typeattr->cbSizeVft == 16 * ptr_size, "cbSizeVft = %d\n", typeattr->cbSizeVft);
3196 ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
3197 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3198 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3199 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3200
3201 ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
3202
3203 hres = ITypeInfo_GetTypeAttr(interface2, &typeattr);
3204 ok(hres == S_OK, "got %08lx\n", hres);
3205 ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3206 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
3207 ok(typeattr->cFuncs == 2, "cFuncs = %d\n", typeattr->cFuncs);
3208 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3209 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3210 ok((sys == SYS_WIN32 && typeattr->cbSizeVft == 0xaab0) ||
3211 (sys == SYS_WIN64 && typeattr->cbSizeVft == 0xaab8),
3212 "cbSizeVft = 0x%x\n", typeattr->cbSizeVft);
3213 ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
3214 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3215 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3216 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3217
3218 ITypeInfo_ReleaseTypeAttr(interface2, typeattr);
3219
3220 ok(ITypeInfo_Release(interface2)==0, "Object should be freed\n");
3221 ok(ITypeInfo_Release(interface1)==0, "Object should be freed\n");
3222 ok(ITypeInfo_Release(dual)==0, "Object should be freed\n");
3223
3224 hres = ICreateTypeLib2_CreateTypeInfo(createtl, aliasW, TKIND_ALIAS, &createti);
3225 ok(hres == S_OK, "got %08lx\n", hres);
3226
3227 hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface1);
3228 ok(hres == S_OK, "got %08lx\n", hres);
3229
3230 if(0){
3231 /* windows gives invalid values here, and even breaks the typeinfo permanently
3232 * on winxp. only call GetTypeAttr() on a TKIND_ALIAS after SetTypeDescAlias. */
3233 hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
3234 ok(hres == S_OK, "got %08lx\n", hres);
3235 ok(typeattr->cbSizeInstance == 0xffffffb4, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3236 ok(typeattr->typekind == TKIND_ALIAS, "typekind = %d\n", typeattr->typekind);
3237 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
3238 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3239 ok(typeattr->cImplTypes == 0, "cImplTypes = %d\n", typeattr->cImplTypes);
3240 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
3241 ok(typeattr->cbAlignment == 0, "cbAlignment = %d\n", typeattr->cbAlignment);
3242 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3243 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3244 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3245 ok(typeattr->tdescAlias.vt == VT_EMPTY, "Got wrong tdescAlias.vt: %u\n", typeattr->tdescAlias.vt);
3246 ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
3247 }
3248
3249 hres = ICreateTypeInfo_SetTypeDescAlias(createti, NULL);
3250 ok(hres == E_INVALIDARG, "got %08lx\n", hres);
3251
3252 typedesc1.vt = VT_I1;
3253 hres = ICreateTypeInfo_SetTypeDescAlias(createti, &typedesc1);
3254 ok(hres == S_OK, "got %08lx\n", hres);
3255
3256 hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
3257 ok(hres == S_OK, "got %08lx\n", hres);
3258 ok(typeattr->cbSizeInstance == 1, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3259 ok(typeattr->typekind == TKIND_ALIAS, "typekind = %d\n", typeattr->typekind);
3260 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
3261 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3262 ok(typeattr->cImplTypes == 0, "cImplTypes = %d\n", typeattr->cImplTypes);
3263 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
3264 ok(typeattr->cbAlignment == 1, "cbAlignment = %d\n", typeattr->cbAlignment);
3265 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3266 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3267 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3268 ok(typeattr->tdescAlias.vt == VT_I1, "Got wrong tdescAlias.vt: %u\n", typeattr->tdescAlias.vt);
3269 ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
3270
3271 typedesc1.vt = VT_R8;
3272 hres = ICreateTypeInfo_SetTypeDescAlias(createti, &typedesc1);
3273 ok(hres == S_OK, "got %08lx\n", hres);
3274
3275 hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
3276 ok(hres == S_OK, "got %08lx\n", hres);
3277 ok(typeattr->cbSizeInstance == 8, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3278 ok(typeattr->typekind == TKIND_ALIAS, "typekind = %d\n", typeattr->typekind);
3279 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
3280 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3281 ok(typeattr->cImplTypes == 0, "cImplTypes = %d\n", typeattr->cImplTypes);
3282 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
3283 ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
3284 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3285 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3286 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3287 ok(typeattr->tdescAlias.vt == VT_R8, "Got wrong tdescAlias.vt: %u\n", typeattr->tdescAlias.vt);
3288 ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
3289
3290 ITypeInfo_Release(interface1);
3291 ICreateTypeInfo_Release(createti);
3292
3293 hres = ICreateTypeLib2_SaveAllChanges(createtl);
3294 ok(hres == S_OK, "got %08lx\n", hres);
3295
3296 ok(ICreateTypeLib2_Release(createtl)==0, "Object should be freed\n");
3297
3298 ok(ITypeInfo_Release(dispatch)==0, "Object should be freed\n");
3299 ok(ITypeInfo_Release(unknown)==0, "Object should be freed\n");
3300 ok(ITypeLib_Release(stdole)==0, "Object should be freed\n");
3301
3303 ok(hres == S_OK, "got %08lx\n", hres);
3304
3305 hres = ITypeLib_GetLibAttr(tl, &libattr);
3306 ok(hres == S_OK, "got %08lx\n", hres);
3307 ok(libattr->syskind == sys, "syskind = %d\n", libattr->syskind);
3308 ok(libattr->wMajorVerNum == 0, "wMajorVer = %d\n", libattr->wMajorVerNum);
3309 ok(libattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", libattr->wMinorVerNum);
3310 ok(libattr->wLibFlags == LIBFLAG_FHASDISKIMAGE, "wLibFlags = %d\n", libattr->wLibFlags);
3311 ITypeLib_ReleaseTLibAttr(tl, libattr);
3312
3313 found = 2;
3314 memset(tinfos, 0, sizeof(tinfos));
3315 memids[0] = 0xdeadbeef;
3316 memids[1] = 0xdeadbeef;
3317 hres = ITypeLib_FindName(tl, param1W, 0, tinfos, memids, &found);
3318 ok(hres == S_OK, "got: %08lx\n", hres);
3319 ok(found == 0, "got wrong count: %u\n", found);
3320 ok(tinfos[0] == NULL, "got invalid typeinfo[0]\n");
3321 ok(tinfos[1] == NULL, "got invalid typeinfo[1]\n");
3322 ok(memids[0] == 0xdeadbeef, "got invalid memid[0]\n");
3323 ok(memids[1] == 0xdeadbeef, "got invalid memid[1]\n");
3324
3325 found = 2;
3326 memset(tinfos, 0, sizeof(tinfos));
3327 memids[0] = 0xdeadbeef;
3328 memids[1] = 0xdeadbeef;
3329 hres = ITypeLib_FindName(tl, func1W, 0, tinfos, memids, &found);
3330 ok(hres == S_OK, "got: %08lx\n", hres);
3331 ok(found == 1, "got wrong count: %u\n", found);
3332 ok(tinfos[0] != NULL, "got invalid typeinfo[0]\n");
3333 ok(tinfos[1] == NULL, "got invalid typeinfo[1]\n");
3334 ok(memids[0] == 0, "got invalid memid[0]\n");
3335 ok(memids[1] == 0xdeadbeef, "got invalid memid[1]\n");
3336 if(tinfos[0])
3337 ITypeInfo_Release(tinfos[0]);
3338
3339 found = 2;
3340 memset(tinfos, 0, sizeof(tinfos));
3341 memids[0] = 0xdeadbeef;
3342 memids[1] = 0xdeadbeef;
3343 hres = ITypeLib_FindName(tl, interface1W, 0, tinfos, memids, &found);
3344 ok(hres == S_OK, "got: %08lx\n", hres);
3345 ok(found == 1, "got wrong count: %u\n", found);
3346 ok(tinfos[0] != NULL, "got invalid typeinfo[0]\n");
3347 ok(tinfos[1] == NULL, "got invalid typeinfo[1]\n");
3348 ok(memids[0] == MEMBERID_NIL, "got invalid memid[0]: %lx\n", memids[0]);
3349 ok(memids[1] == 0xdeadbeef, "got invalid memid[1]\n");
3350 if(tinfos[0])
3351 ITypeInfo_Release(tinfos[0]);
3352
3353 hres = ITypeLib_GetDocumentation(tl, -1, &name, &docstring, &helpcontext, &helpfile);
3354 ok(hres == S_OK, "got %08lx\n", hres);
3355 ok(memcmp(typelibW, name, sizeof(typelibW)) == 0, "got wrong typelib name: %s\n",
3357 ok(docstring == NULL, "got wrong docstring: %s\n", wine_dbgstr_w(docstring));
3358 ok(helpcontext == 0, "got wrong helpcontext: 0x%lx\n", helpcontext);
3359 ok(memcmp(helpfileW, helpfile, sizeof(helpfileW)) == 0,
3360 "got wrong helpfile: %s\n", wine_dbgstr_w(helpfile));
3363
3364 hres = ITypeLib_GetDocumentation(tl, 0, &name, &docstring, &helpcontext, &helpfile);
3365 ok(hres == S_OK, "got %08lx\n", hres);
3366 ok(memcmp(interface1W, name, sizeof(interface1W)) == 0, "got wrong typeinfo name: %s\n",
3368 ok(docstring == NULL, "got wrong docstring: %s\n", wine_dbgstr_w(docstring));
3369 ok(helpcontext == 0, "got wrong helpcontext: 0x%lx\n", helpcontext);
3370 ok(memcmp(helpfileW, helpfile, sizeof(helpfileW)) == 0,
3371 "got wrong helpfile: %s\n", wine_dbgstr_w(helpfile));
3374
3375 hres = ITypeLib_QueryInterface(tl, &IID_ITypeLib2, (void**)&tl2);
3376 ok(hres == S_OK, "no ITypeLib2 interface (%lx)\n", hres);
3377 V_VT(&cust_data) = VT_EMPTY;
3378 V_I4(&cust_data) = 0;
3379 hres = ITypeLib2_GetCustData(tl2, &tlcustguid, &cust_data);
3380 ok(hres == S_OK, "got %08lx\n", hres);
3381 ok(V_VT(&cust_data) == VT_I4, "V_VT(&cust_data) = %d\n", V_VT(&cust_data));
3382 ok(V_I4(&cust_data) == 1, "V_I4(&cust_data) = %ld\n", V_I4(&cust_data));
3383 ITypeLib2_Release(tl2);
3384
3385 hres = ITypeLib_GetTypeInfo(tl, 0, &ti);
3386 ok(hres == S_OK, "got %08lx\n", hres);
3387
3388 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
3389 ok(hres == S_OK, "got %08lx\n", hres);
3390 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3391 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
3392 ok(typeattr->cFuncs == 13, "cFuncs = %d\n", typeattr->cFuncs);
3393 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3394 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3395 todo_wine_if(sys != native_sys)
3396 ok(typeattr->cbSizeVft == 16 * sizeof(void*), "cbSizeVft = %d\n", typeattr->cbSizeVft);
3397 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
3398 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3399 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3400 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3401 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
3402
3403 hres = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype);
3404 ok(hres == S_OK, "got %08lx\n", hres);
3405 ok(hreftype == 3, "hreftype = %ld\n", hreftype);
3406
3407 hres = ITypeInfo_GetRefTypeInfo(ti, hreftype, &unknown);
3408 ok(hres == S_OK, "got %08lx\n", hres);
3409
3410 hres = ITypeInfo_GetTypeAttr(unknown, &typeattr);
3411 ok(hres == S_OK, "got %08lx\n", hres);
3412 ok(IsEqualGUID(&typeattr->guid, &IID_IUnknown), "got wrong reftypeinfo\n");
3413 ITypeInfo_ReleaseTypeAttr(unknown, typeattr);
3414
3415 ITypeInfo_Release(unknown);
3416
3417 hres = ITypeInfo_GetFuncDesc(ti, 0, &pfuncdesc);
3418 ok(hres == S_OK, "got %08lx\n", hres);
3419 ok(pfuncdesc->memid == 0, "got %lx\n", pfuncdesc->memid);
3420 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3421 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3422 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3423 ok(pfuncdesc->invkind == INVOKE_PROPERTYPUTREF, "got 0x%x\n", pfuncdesc->invkind);
3424 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3425 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3426 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3427 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3428 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3429 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3430 edesc = pfuncdesc->lprgelemdescParam;
3431 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
3432 ok(edesc->idldesc.wIDLFlags == IDLFLAG_FIN, "got: %x\n", edesc->idldesc.wIDLFlags);
3433
3434 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3435 ok(hres == S_OK, "got: %08lx\n", hres);
3436 ok(!memcmp(name, func1W, sizeof(func1W)), "got name: %s\n", wine_dbgstr_w(name));
3437 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3438 ok(helpcontext == 0x201, "got helpcontext: 0x%lx\n", helpcontext);
3439 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3442
3443 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, NULL, 0, &cnames);
3444 ok(hres == E_INVALIDARG, "got: %08lx\n", hres);
3445
3446 cnames = 8;
3447 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, 0, &cnames);
3448 ok(hres == S_OK, "got: %08lx\n", hres);
3449 ok(cnames == 0, "got: %u\n", cnames);
3450
3451 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
3452 ok(hres == S_OK, "got: %08lx\n", hres);
3453 ok(cnames == 1, "got: %u\n", cnames);
3454 ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
3455 SysFreeString(names[0]);
3456
3457 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3458
3459 hres = ITypeInfo_GetFuncDesc(ti, 1, &pfuncdesc);
3460 ok(hres == S_OK, "got %08lx\n", hres);
3461 ok(pfuncdesc->memid == 0x60010001, "got %lx\n", pfuncdesc->memid);
3462 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3463 ok(pfuncdesc->lprgelemdescParam == NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3464 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3465 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3466 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3467 ok(pfuncdesc->cParams == 0, "got %d\n", pfuncdesc->cParams);
3468 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3469 todo_wine_if(sys != native_sys)
3470 ok(pfuncdesc->oVft == 4 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3471 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3472 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3473 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3474
3475 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3476 ok(hres == S_OK, "got: %08lx\n", hres);
3477 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3478 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3479 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3480 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3482 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3483
3484 hres = ITypeInfo_GetFuncDesc(ti, 2, &pfuncdesc);
3485 ok(hres == S_OK, "got %08lx\n", hres);
3486 ok(pfuncdesc->memid == 0x1, "got %lx\n", pfuncdesc->memid);
3487 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3488 ok(pfuncdesc->lprgelemdescParam == NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3489 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3490 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3491 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3492 ok(pfuncdesc->cParams == 0, "got %d\n", pfuncdesc->cParams);
3493 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3494 todo_wine_if(sys != native_sys)
3495 ok(pfuncdesc->oVft == 5 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3496 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3497 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3498 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3499
3500 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3501 ok(hres == S_OK, "got: %08lx\n", hres);
3502 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3503 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3504 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3505 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3507 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3508
3509 hres = ITypeInfo_GetFuncDesc(ti, 3, &pfuncdesc);
3510 ok(hres == S_OK, "got %08lx\n", hres);
3511 ok(pfuncdesc->memid == 0x6001000b, "got %lx\n", pfuncdesc->memid);
3512 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3513 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3514 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3515 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3516 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3517 ok(pfuncdesc->cParams == 2, "got %d\n", pfuncdesc->cParams);
3518 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3519 todo_wine_if(sys != native_sys)
3520 ok(pfuncdesc->oVft == 6 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3521 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3522 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3523 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3524
3525 edesc = pfuncdesc->lprgelemdescParam;
3526 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
3527 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3528 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3529 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3530 edesc->paramdesc.pparamdescex->cBytes);
3531 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n",
3532 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3533 ok(compare_wstr(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue), defaultW),
3534 "got: %s\n",
3535 wine_dbgstr_w(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue)));
3536
3537 edesc = pfuncdesc->lprgelemdescParam + 1;
3538 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
3539 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3540 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3541 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3542 edesc->paramdesc.pparamdescex->cBytes);
3543 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_BSTR, "got: %d\n",
3544 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3545 ok(compare_wstr(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue), defaultW),
3546 "got: %s\n",
3547 wine_dbgstr_w(V_BSTR(&edesc->paramdesc.pparamdescex->varDefaultValue)));
3548
3549 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3550 ok(hres == S_OK, "got: %08lx\n", hres);
3551 ok(!memcmp(name, func2W, sizeof(func2W)), "got name: %s\n", wine_dbgstr_w(name));
3552 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3553 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3554 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3557
3558 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
3559 ok(hres == S_OK, "got: %08lx\n", hres);
3560 ok(cnames == 3, "got: %u\n", cnames);
3561 ok(!memcmp(names[0], func2W, sizeof(func2W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
3562 ok(!memcmp(names[1], param1W, sizeof(func2W)), "got names[1]: %s\n", wine_dbgstr_w(names[1]));
3563 ok(!memcmp(names[2], param2W, sizeof(func2W)), "got names[2]: %s\n", wine_dbgstr_w(names[2]));
3564 SysFreeString(names[0]);
3565 SysFreeString(names[1]);
3566 SysFreeString(names[2]);
3567 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3568
3569 hres = ITypeInfo_GetFuncDesc(ti, 4, &pfuncdesc);
3570 ok(hres == S_OK, "got %08lx\n", hres);
3571 ok(pfuncdesc->memid == 0x6001000c, "got %lx\n", pfuncdesc->memid);
3572 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3573 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3574 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3575 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3576 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3577 ok(pfuncdesc->cParams == 2, "got %d\n", pfuncdesc->cParams);
3578 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3579 todo_wine_if(sys != native_sys)
3580 ok(pfuncdesc->oVft == 7 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3581 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3582 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3583 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3584
3585 edesc = pfuncdesc->lprgelemdescParam;
3586 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
3587 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3588 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3589 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3590 edesc->paramdesc.pparamdescex->cBytes);
3591 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_I4, "got: %d\n",
3592 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3593 ok(V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0xFFFFFFFF,
3594 "got: 0x%lx\n", V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue));
3595
3596 edesc = pfuncdesc->lprgelemdescParam + 1;
3597 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
3598 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3599 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3600 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3601 edesc->paramdesc.pparamdescex->cBytes);
3602 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_I4, "got: %d\n",
3603 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3604 ok(V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0xFFFFFFFF,
3605 "got: 0x%lx\n", V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue));
3606
3607 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3608 ok(hres == S_OK, "got: %08lx\n", hres);
3609 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3610 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3611 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3612 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3614 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3615
3616 hres = ITypeInfo_GetFuncDesc(ti, 5, &pfuncdesc);
3617 ok(hres == S_OK, "got %08lx\n", hres);
3618 ok(pfuncdesc->memid == 0x60010005, "got %lx\n", pfuncdesc->memid);
3619 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3620 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3621 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3622 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3623 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3624 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3625 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3626 todo_wine_if(sys != native_sys)
3627 ok(pfuncdesc->oVft == 8 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3628 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3629 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3630 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3631
3632 edesc = pfuncdesc->lprgelemdescParam;
3633 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3634 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3635 edesc->paramdesc.pparamdescex->cBytes);
3636 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
3637 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3638 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x789, "got: 0x%x\n",
3639 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
3640 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3641 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3642 ok(edesc->tdesc.vt == VT_USERDEFINED, "got: %d\n", edesc->tdesc.vt);
3643 ok(edesc->tdesc.hreftype == hreftype, "got: 0x%lx\n", edesc->tdesc.hreftype);
3644
3645 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3646 ok(hres == S_OK, "got: %08lx\n", hres);
3647 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3648 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3649 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3650 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3652 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3653
3654 hres = ITypeInfo_GetFuncDesc(ti, 6, &pfuncdesc);
3655 ok(hres == S_OK, "got %08lx\n", hres);
3656 ok(pfuncdesc->memid == 0x60010006, "got %lx\n", pfuncdesc->memid);
3657 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3658 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3659 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3660 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3661 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3662 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3663 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3664 todo_wine_if(sys != native_sys)
3665 ok(pfuncdesc->oVft == 9 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3666 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3667 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VARIANT, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3668 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3669
3670 edesc = pfuncdesc->lprgelemdescParam;
3671 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3672 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3673 edesc->paramdesc.pparamdescex->cBytes);
3674 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
3675 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3676 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x3, "got: 0x%x\n",
3677 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
3678 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3679 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3680 ok(edesc->tdesc.vt == VT_VARIANT, "got: %d\n", edesc->tdesc.vt);
3681 ok(edesc->tdesc.hreftype == 0, "got: 0x%lx\n", edesc->tdesc.hreftype);
3682
3683 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3684 ok(hres == S_OK, "got: %08lx\n", hres);
3685 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3686 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3687 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3688 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3690 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3691
3692 hres = ITypeInfo_GetFuncDesc(ti, 7, &pfuncdesc);
3693 ok(hres == S_OK, "got %08lx\n", hres);
3694 ok(pfuncdesc->memid == 0x60010009, "got %lx\n", pfuncdesc->memid);
3695 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3696 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3697 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3698 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3699 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3700 ok(pfuncdesc->cParams == 2, "got %d\n", pfuncdesc->cParams);
3701 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3702 todo_wine_if(sys != native_sys)
3703 ok(pfuncdesc->oVft == 10 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3704 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3705 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3706 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3707
3708 edesc = pfuncdesc->lprgelemdescParam;
3709 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
3710 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3711 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3712
3713 edesc = pfuncdesc->lprgelemdescParam + 1;
3714 ok(edesc->tdesc.vt == VT_UI2, "got: %d\n", edesc->tdesc.vt);
3715 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3716 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3717 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3718 edesc->paramdesc.pparamdescex->cBytes);
3719 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_UI2, "got: %d\n",
3720 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3721 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0xFFFF, "got: 0x%x\n",
3722 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
3723
3724 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3725 ok(hres == S_OK, "got: %08lx\n", hres);
3726 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3727 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3728 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3729 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3731 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3732
3733 hres = ITypeInfo_GetFuncDesc(ti, 8, &pfuncdesc);
3734 ok(hres == S_OK, "got %08lx\n", hres);
3735 ok(pfuncdesc->memid == 0x60010003, "got %lx\n", pfuncdesc->memid);
3736 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3737 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3738 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3739 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3740 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3741 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3742 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3743 todo_wine_if(sys != native_sys)
3744 ok(pfuncdesc->oVft == 11 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3745 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3746 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3747 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3748
3749 edesc = pfuncdesc->lprgelemdescParam;
3750 ok(edesc->tdesc.vt == VT_INT, "got: %d\n", edesc->tdesc.vt);
3751 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3752 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3753 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3754 edesc->paramdesc.pparamdescex->cBytes);
3755 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_I4, "got: %d\n",
3756 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3757 ok(V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x123, "got: 0x%lx\n",
3758 V_I4(&edesc->paramdesc.pparamdescex->varDefaultValue));
3759
3760 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3761 ok(hres == S_OK, "got: %08lx\n", hres);
3762 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3763 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3764 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3765 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3767 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3768
3769 hres = ITypeInfo_GetFuncDesc(ti, 9, &pfuncdesc);
3770 ok(hres == S_OK, "got %08lx\n", hres);
3771 ok(pfuncdesc->memid == 0, "got %lx\n", pfuncdesc->memid);
3772 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3773 ok(pfuncdesc->lprgelemdescParam == NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3774 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3775 ok(pfuncdesc->invkind == INVOKE_PROPERTYGET, "got 0x%x\n", pfuncdesc->invkind);
3776 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3777 ok(pfuncdesc->cParams == 0, "got %d\n", pfuncdesc->cParams);
3778 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3779 todo_wine_if(sys != native_sys)
3780 ok(pfuncdesc->oVft == 12 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3781 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3782 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_BSTR, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3783 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3784
3785 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3786 ok(hres == S_OK, "got: %08lx\n", hres);
3787 ok(!memcmp(name, func1W, sizeof(func1W)), "got name: %s\n", wine_dbgstr_w(name));
3788 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3789 ok(helpcontext == 0x201, "got helpcontext: 0x%lx\n", helpcontext);
3790 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3793
3794 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
3795 ok(hres == S_OK, "got: %08lx\n", hres);
3796 ok(cnames == 1, "got: %u\n", cnames);
3797 ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
3798 SysFreeString(names[0]);
3799 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3800
3801 hres = ITypeInfo_GetFuncDesc(ti, 10, &pfuncdesc);
3802 ok(hres == S_OK, "got %08lx\n", hres);
3803 ok(pfuncdesc->memid == 0x60010007, "got %lx\n", pfuncdesc->memid);
3804 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3805 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3806 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3807 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3808 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3809 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3810 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3811 todo_wine_if(sys != native_sys)
3812 ok(pfuncdesc->oVft == 13 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3813 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3814 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3815 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3816
3817 edesc = pfuncdesc->lprgelemdescParam;
3818 ok(edesc->tdesc.vt == VT_PTR, "got: %d\n", edesc->tdesc.vt);
3819 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3820 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3821 ok(edesc->tdesc.lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc);
3822 ok(edesc->tdesc.lptdesc->vt == VT_PTR, "got: %d\n", edesc->tdesc.lptdesc->vt);
3823 ok(edesc->tdesc.lptdesc->lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc->lptdesc);
3824 ok(edesc->tdesc.lptdesc->lptdesc->vt == VT_BSTR, "got: %d\n", edesc->tdesc.lptdesc->lptdesc->vt);
3825
3826 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3827 ok(hres == S_OK, "got: %08lx\n", hres);
3828 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3829 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3830 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3831 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3833 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3834
3835 hres = ITypeInfo_GetFuncDesc(ti, 11, &pfuncdesc);
3836 ok(hres == S_OK, "got %08lx\n", hres);
3837 ok(pfuncdesc->memid == 0x60010004, "got %lx\n", pfuncdesc->memid);
3838 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3839 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3840 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3841 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3842 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3843 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3844 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3845 todo_wine_if(sys != native_sys)
3846 ok(pfuncdesc->oVft == 14 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3847 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3848 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3849 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3850
3851 edesc = pfuncdesc->lprgelemdescParam;
3852 ok(edesc->tdesc.vt == VT_PTR, "got: %d\n", edesc->tdesc.vt);
3853 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FIN, "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3854 ok(edesc->paramdesc.pparamdescex == NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3855 ok(edesc->tdesc.lptdesc != NULL, "got: %p\n", edesc->tdesc.lptdesc);
3856 ok(edesc->tdesc.lptdesc->vt == VT_BSTR, "got: %d\n", edesc->tdesc.lptdesc->vt);
3857
3858 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3859 ok(hres == S_OK, "got: %08lx\n", hres);
3860 ok(name == NULL, "got name: %s\n", wine_dbgstr_w(name));
3861 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3862 ok(helpcontext == 0, "got helpcontext: 0x%lx\n", helpcontext);
3863 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3865 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3866
3867 hres = ITypeInfo_GetFuncDesc(ti, 12, &pfuncdesc);
3868 ok(hres == S_OK, "got %08lx\n", hres);
3869 ok(pfuncdesc->memid == 0, "got %lx\n", pfuncdesc->memid);
3870 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3871 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3872 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3873 ok(pfuncdesc->invkind == INVOKE_PROPERTYPUT, "got 0x%x\n", pfuncdesc->invkind);
3874 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3875 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3876 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3877 todo_wine_if(sys != native_sys)
3878 ok(pfuncdesc->oVft == 15 * sizeof(void*), "got %d\n", pfuncdesc->oVft);
3879 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3880 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3881 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3882
3883 edesc = pfuncdesc->lprgelemdescParam;
3884 ok(edesc->tdesc.vt == VT_BSTR, "got: %d\n", edesc->tdesc.vt);
3885 ok(edesc->idldesc.wIDLFlags == IDLFLAG_FIN, "got: %x\n", edesc->idldesc.wIDLFlags);
3886
3887 hres = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &name, &docstring, &helpcontext, &helpfile);
3888 ok(hres == S_OK, "got: %08lx\n", hres);
3889 ok(!memcmp(name, func1W, sizeof(func1W)), "got name: %s\n", wine_dbgstr_w(name));
3890 ok(docstring == NULL, "got docstring: %s\n", wine_dbgstr_w(docstring));
3891 ok(helpcontext == 0x201, "got helpcontext: 0x%lx\n", helpcontext);
3892 ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "got helpfile: %s\n", wine_dbgstr_w(helpfile));
3895
3896 hres = ITypeInfo_GetNames(ti, pfuncdesc->memid, names, ARRAY_SIZE(names), &cnames);
3897 ok(hres == S_OK, "got: %08lx\n", hres);
3898 ok(cnames == 1, "got: %u\n", cnames);
3899 ok(!memcmp(names[0], func1W, sizeof(func1W)), "got names[0]: %s\n", wine_dbgstr_w(names[0]));
3900 SysFreeString(names[0]);
3901 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3902
3903 hres = ITypeInfo_GetFuncDesc(ti, 13, &pfuncdesc);
3904 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
3905
3906 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
3907
3908 hres = ITypeLib_GetTypeInfo(tl, 1, &ti);
3909 ok(hres == S_OK, "got %08lx\n", hres);
3910
3911 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
3912 ok(hres == S_OK, "got %08lx\n", hres);
3913 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
3914 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
3915 ok(typeattr->cFuncs == 2, "cFuncs = %d\n", typeattr->cFuncs);
3916 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
3917 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
3918 ok(typeattr->cbSizeVft == 0xaab8 || typeattr->cbSizeVft == 0xaab0 ||
3919 typeattr->cbSizeVft == 0x555c || typeattr->cbSizeVft == 0x5560,
3920 "cbSizeVft = 0x%x\n", typeattr->cbSizeVft);
3921 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
3922 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
3923 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
3924 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
3925 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
3926
3927 hres = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype);
3928 ok(hres == S_OK, "got %08lx\n", hres);
3929
3930 hres = ITypeInfo_GetFuncDesc(ti, 0, &pfuncdesc);
3931 ok(hres == S_OK, "got %08lx\n", hres);
3932 ok(pfuncdesc->memid == 0x60020000, "got %lx\n", pfuncdesc->memid);
3933 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3934 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3935 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3936 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3937 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3938 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3939 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3940 ok(pfuncdesc->oVft == (short)(0xaaa8 * sizeof(void *) / ptr_size), "got %x\n", pfuncdesc->oVft);
3941 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3942 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3943 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3944
3945 edesc = pfuncdesc->lprgelemdescParam;
3946 ok(edesc->tdesc.vt == VT_VARIANT, "got: %d\n", edesc->tdesc.vt);
3947 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3948 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3949 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3950 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3951 edesc->paramdesc.pparamdescex->cBytes);
3952 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
3953 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3954 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x3, "got: 0x%x\n",
3955 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
3956 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3957 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3958 ok(edesc->tdesc.lptdesc == NULL, "got: %p\n", edesc->tdesc.lptdesc);
3959 ok(edesc->tdesc.hreftype == 0, "got: %ld\n", edesc->tdesc.hreftype);
3960 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3961
3962 hres = ITypeInfo_GetFuncDesc(ti, 1, &pfuncdesc);
3963 ok(hres == S_OK, "got %08lx\n", hres);
3964 ok(pfuncdesc->memid == 0x60020001, "got %lx\n", pfuncdesc->memid);
3965 ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
3966 ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
3967 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
3968 ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
3969 ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
3970 ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
3971 ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
3972 ok(pfuncdesc->oVft == (short)((sys == SYS_WIN64 ? 0xaab0 : 0xaaac) * sizeof(void *) / ptr_size), "got %x\n", pfuncdesc->oVft);
3973 ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
3974 ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
3975 ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
3976
3977 edesc = pfuncdesc->lprgelemdescParam;
3978 ok(edesc->tdesc.vt == VT_VARIANT, "got: %d\n", edesc->tdesc.vt);
3979 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3980 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3981 ok(edesc->paramdesc.pparamdescex != NULL, "got: %p\n", edesc->paramdesc.pparamdescex);
3982 ok(edesc->paramdesc.pparamdescex->cBytes == sizeof(PARAMDESCEX), "got: %ld\n",
3983 edesc->paramdesc.pparamdescex->cBytes);
3984 ok(V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
3985 V_VT(&edesc->paramdesc.pparamdescex->varDefaultValue));
3986 ok(V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue) == 0x3, "got: 0x%x\n",
3987 V_UI2(&edesc->paramdesc.pparamdescex->varDefaultValue));
3988 ok(edesc->paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
3989 "got: 0x%x\n", edesc->paramdesc.wParamFlags);
3990 ok(edesc->tdesc.lptdesc == NULL, "got: %p\n", edesc->tdesc.lptdesc);
3991 ok(edesc->tdesc.hreftype == 0, "got: %ld\n", edesc->tdesc.hreftype);
3992 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
3993
3994 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
3995
3996 hres = ITypeLib_GetTypeInfo(tl, 2, &ti);
3997 ok(hres == S_OK, "got %08lx\n", hres);
3998
3999 hres = ITypeInfo_QueryInterface(ti, &IID_ITypeInfo2, (void**)&ti2);
4000 ok(hres == S_OK, "got %08lx\n", hres);
4001
4002 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
4003 ok(hres == S_OK, "got %08lx\n", hres);
4004 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
4005 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
4006 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
4007 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
4008 ok(typeattr->cImplTypes == 0, "cImplTypes = %d\n", typeattr->cImplTypes);
4009 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
4010 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
4011 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
4012 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
4013 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
4014 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
4015
4016 VariantClear(&cust_data);
4017 hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
4018 ok(hres == S_OK, "got %08lx\n", hres);
4019 ok(V_VT(&cust_data) == VT_BSTR, "got wrong custdata type: %u\n", V_VT(&cust_data));
4020 ok(!lstrcmpW(V_BSTR(&cust_data), asdfW), "got wrong custdata value: %s\n", wine_dbgstr_w(V_BSTR(&cust_data)));
4021 SysFreeString(V_BSTR(&cust_data));
4022
4023 ITypeInfo2_Release(ti2);
4024 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
4025
4026 hres = ITypeLib_GetTypeInfo(tl, 3, &ti);
4027 ok(hres == S_OK, "got %08lx\n", hres);
4028
4029 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
4030 ok(hres == S_OK, "got %08lx\n", hres);
4031 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
4032 ok(typeattr->typekind == TKIND_COCLASS, "typekind = %d\n", typeattr->typekind);
4033 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
4034 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
4035 ok(typeattr->cImplTypes == 3, "cImplTypes = %d\n", typeattr->cImplTypes);
4036 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
4037 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
4038 ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
4039 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
4040 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
4041 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
4042
4043 hres = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype);
4044 ok(hres == S_OK, "got %08lx\n", hres);
4045 ok(hreftype == 0, "got wrong hreftype: %lx\n", hreftype);
4046
4047 hres = ITypeInfo_GetImplTypeFlags(ti, 0, &impltypeflags);
4048 ok(hres == S_OK, "got %08lx\n", hres);
4049 ok(impltypeflags == IMPLTYPEFLAG_FDEFAULT, "got wrong flag: %x\n", impltypeflags);
4050
4051 hres = ITypeInfo_GetRefTypeOfImplType(ti, 1, &hreftype);
4052 ok(hres == S_OK, "got %08lx\n", hres);
4053 ok(hreftype == 1, "got wrong hreftype: %lx\n", hreftype);
4054
4055 hres = ITypeInfo_GetImplTypeFlags(ti, 1, &impltypeflags);
4056 ok(hres == S_OK, "got %08lx\n", hres);
4057 ok(impltypeflags == IMPLTYPEFLAG_FRESTRICTED, "got wrong flag: %x\n", impltypeflags);
4058
4059 hres = ITypeInfo_GetRefTypeOfImplType(ti, 2, &hreftype);
4060 ok(hres == S_OK, "got %08lx\n", hres);
4061 ok(hreftype == 1, "got wrong hreftype: %lx\n", hreftype);
4062
4063 hres = ITypeInfo_GetImplTypeFlags(ti, 2, &impltypeflags);
4064 ok(hres == S_OK, "got %08lx\n", hres);
4065 ok(impltypeflags == 0, "got wrong flag: %x\n", impltypeflags);
4066
4067 hres = ITypeInfo_GetRefTypeOfImplType(ti, 3, &hreftype);
4068 ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hres);
4069
4070 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
4071
4072 hres = ITypeLib_GetTypeInfo(tl, 4, &ti);
4073 ok(hres == S_OK, "got %08lx\n", hres);
4074
4075 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
4076 ok(hres == S_OK, "got %08lx\n", hres);
4077 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
4078 ok(typeattr->typekind == TKIND_DISPATCH, "typekind = %d\n", typeattr->typekind);
4079 todo_wine_if(sys != native_sys)
4080 ok(typeattr->cFuncs == 8, "cFuncs = %d\n", typeattr->cFuncs);
4081 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
4082 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
4083 ok(typeattr->cbSizeVft == 7 * sizeof(void*), "cbSizeVft = %d\n", typeattr->cbSizeVft);
4084 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
4085 ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL), "wTypeFlags = 0x%x\n", typeattr->wTypeFlags);
4086 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
4087 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
4088 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
4089
4090 hres = ITypeInfo_GetTypeComp(ti, &tcomp);
4091 ok(hres == S_OK, "got %08lx\n", hres);
4092
4093 hres = ITypeInfo_QueryInterface(ti, &IID_ITypeComp, (void**)&tcomp2);
4094 ok(hres == S_OK, "got %08lx\n", hres);
4095 ok(tcomp == tcomp2, "got %p, was %p\n", tcomp2, tcomp);
4096 ITypeComp_Release(tcomp2);
4097
4098 hres = ITypeComp_Bind(tcomp, invokeW, 0, INVOKE_FUNC, &interface1, &desckind, &bindptr);
4099 ok(hres == S_OK, "got %08lx\n", hres);
4100 ok(desckind == DESCKIND_FUNCDESC, "got wrong desckind: 0x%x\n", desckind);
4101 ok(bindptr.lpfuncdesc->memid == 0x60010003, "got %lx\n", bindptr.lpfuncdesc->memid);
4102 ok(bindptr.lpfuncdesc->lprgscode == NULL, "got %p\n", bindptr.lpfuncdesc->lprgscode);
4103 ok(bindptr.lpfuncdesc->lprgelemdescParam != NULL, "got %p\n", bindptr.lpfuncdesc->lprgelemdescParam);
4104 ok(bindptr.lpfuncdesc->funckind == FUNC_DISPATCH, "got 0x%x\n", bindptr.lpfuncdesc->funckind);
4105 ok(bindptr.lpfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", bindptr.lpfuncdesc->invkind);
4106 ok(bindptr.lpfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", bindptr.lpfuncdesc->callconv);
4107 ok(bindptr.lpfuncdesc->cParams == 8, "got %d\n", bindptr.lpfuncdesc->cParams);
4108 ok(bindptr.lpfuncdesc->cParamsOpt == 0, "got %d\n", bindptr.lpfuncdesc->cParamsOpt);
4109 ok(bindptr.lpfuncdesc->oVft == 6 * sizeof(void*), "got %x\n", bindptr.lpfuncdesc->oVft);
4110 ok(bindptr.lpfuncdesc->cScodes == 0, "got %d\n", bindptr.lpfuncdesc->cScodes);
4111 ok(bindptr.lpfuncdesc->elemdescFunc.tdesc.vt == VT_VOID, "got %d\n", bindptr.lpfuncdesc->elemdescFunc.tdesc.vt);
4112 ok(bindptr.lpfuncdesc->wFuncFlags == FUNCFLAG_FRESTRICTED, "got 0x%x\n", bindptr.lpfuncdesc->wFuncFlags);
4113
4114 ITypeInfo_ReleaseFuncDesc(interface1, bindptr.lpfuncdesc);
4115 ITypeInfo_Release(interface1);
4116 ITypeComp_Release(tcomp);
4117
4118 hres = ITypeInfo_GetRefTypeOfImplType(ti, -1, &hreftype);
4119 ok(hres == S_OK, "got %08lx\n", hres);
4120 ok(hreftype == -2, "got wrong hreftype: %lx\n", hreftype);
4121
4122 hres = ITypeInfo_GetRefTypeInfo(ti, hreftype, &interface1);
4123 ok(hres == S_OK, "got %08lx\n", hres);
4124
4125 hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
4126 ok(hres == S_OK, "got %08lx\n", hres);
4127 ok(typeattr->cbSizeInstance == sizeof(void*), "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
4128 ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
4129 ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs);
4130 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
4131 ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
4132 todo_wine_if(sys != native_sys)
4133 ok(typeattr->cbSizeVft == 8 * sizeof(void*), "cbSizeVft = %d\n", typeattr->cbSizeVft);
4134 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
4135 ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL), "wTypeFlags = 0x%x\n", typeattr->wTypeFlags);
4136 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
4137 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
4138 ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
4139
4140 ITypeInfo_Release(interface1);
4141
4142 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
4143
4144 hres = ITypeLib_GetTypeInfo(tl, 5, &ti);
4145 ok(hres == S_OK, "got %08lx\n", hres);
4146
4147 hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
4148 ok(hres == S_OK, "got %08lx\n", hres);
4149 ok(typeattr->cbSizeInstance == 8, "cbSizeInstance = %ld\n", typeattr->cbSizeInstance);
4150 ok(typeattr->typekind == TKIND_ALIAS, "typekind = %d\n", typeattr->typekind);
4151 ok(typeattr->cFuncs == 0, "cFuncs = %d\n", typeattr->cFuncs);
4152 ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
4153 ok(typeattr->cImplTypes == 0, "cImplTypes = %d\n", typeattr->cImplTypes);
4154 ok(typeattr->cbSizeVft == 0, "cbSizeVft = %d\n", typeattr->cbSizeVft);
4155 ok(typeattr->cbAlignment == alignment, "cbAlignment = %d\n", typeattr->cbAlignment);
4156 ok(typeattr->wTypeFlags == 0, "wTypeFlags = 0x%x\n", typeattr->wTypeFlags);
4157 ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
4158 ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
4159 ok(typeattr->tdescAlias.vt == VT_R8, "Got wrong tdescAlias.vt: %u\n", typeattr->tdescAlias.vt);
4160 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
4161
4162 ok(ITypeInfo_Release(ti) == 0, "Object should be freed\n");
4163
4164 ok(ITypeLib_Release(tl)==0, "Object should be freed\n");
4165
4168}
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
Definition: align.cpp:48
static const TCHAR helpfile[]
Definition: dialog.c:19
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
#define E_INVALIDARG
Definition: ddrawi.h:101
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_VOID
Definition: compat.h:2318
@ VT_PTR
Definition: compat.h:2320
@ VT_R8
Definition: compat.h:2300
@ VT_USERDEFINED
Definition: compat.h:2323
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
HRESULT WINAPI LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind, ITypeLib **pptLib)
Definition: typelib.c:473
GLuint GLuint * names
Definition: glext.h:11545
#define todo_wine_if(is_todo)
Definition: minitest.h:81
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
Definition: test.h:537
#define todo_wine
Definition: minitest.h:80
static const DWORD ptr_size
Definition: registry.c:58
static const WCHAR filenameW[]
Definition: amstream.c:41
HRESULT hres
Definition: protocol.c:465
static OLECHAR OLECHAR *static SYSKIND
Definition: typelib.c:87
static BOOL compare_wstr(const WCHAR *wstr, const WCHAR *ref)
Definition: typelib.c:105
#define EXPECT_REF(obj, ref)
Definition: typelib.c:77
coclass SHDocVw::ShellWindows dual
Definition: exdisp.idl:631
#define MEMBERID_NIL
Definition: oleauto.h:1003
@ REGKIND_NONE
Definition: oleauto.h:927
unsigned short USHORT
Definition: pedump.c:61
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
@ TKIND_ALIAS
Definition: widltypes.h:240
@ TKIND_DISPATCH
Definition: widltypes.h:238
#define TYPE_E_BADMODULEKIND
Definition: winerror.h:3647
#define TYPE_E_ELEMENTNOTFOUND
Definition: winerror.h:3642
#define DISP_E_BADVARTYPE
Definition: winerror.h:3620
#define TYPE_E_AMBIGUOUSNAME
Definition: winerror.h:3643
#define TYPE_E_INCONSISTENTPROPFUNCS
Definition: winerror.h:3656
#define TYPE_E_NAMECONFLICT
Definition: winerror.h:3644

Referenced by START_TEST().

◆ test_DeleteFuncDesc()

static void test_DeleteFuncDesc ( void  )
static

Definition at line 8724 of file typelib.c.

8725{
8726 OLECHAR interface1W[] = L"interface1";
8728 ICreateTypeInfo2 *createti2;
8729 ICreateTypeInfo *createti;
8730 ICreateTypeLib2 *createtl;
8731 FUNCDESC funcdesc;
8732 TYPEATTR *typeattr;
8733 ITypeInfo *ti;
8734 ITypeLib *tl;
8735 HRESULT hr;
8736
8739
8740 hr = CreateTypeLib2(SYS_WIN32, filenameW, &createtl);
8741 ok(hr == S_OK, "Failed to create instance, hr %#lx.\n", hr);
8742
8743 hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
8744 ok(hr == S_OK, "Failed to create instance, hr %#lx.\n", hr);
8745 hr = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void **)&createti2);
8746 ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr);
8747 ICreateTypeInfo_Release(createti);
8748
8749 hr = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo, (void **)&ti);
8750 ok(hr == S_OK, "Failed to get typeinfo, hr %#lx.\n", hr);
8751
8752 memset(&funcdesc, 0, sizeof(FUNCDESC));
8753 funcdesc.funckind = FUNC_PUREVIRTUAL;
8754 funcdesc.invkind = INVOKE_PROPERTYGET;
8755 funcdesc.callconv = CC_STDCALL;
8756 funcdesc.elemdescFunc.tdesc.vt = VT_BSTR;
8757 funcdesc.elemdescFunc.idldesc.wIDLFlags = IDLFLAG_NONE;
8758
8759 hr = ICreateTypeInfo2_AddFuncDesc(createti2, 0, &funcdesc);
8760 ok(hr == S_OK, "Failed to add a funcdesc, hr %#lx.\n", hr);
8761
8762 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8763 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8764 ok(typeattr->cFuncs == 1, "Unexpected cFuncs %u.\n", typeattr->cFuncs);
8765 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8766
8767 hr = ICreateTypeInfo2_DeleteFuncDesc(createti2, 1);
8768 ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#lx.\n", hr);
8769
8770 hr = ICreateTypeInfo2_DeleteFuncDesc(createti2, 0);
8771 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
8772
8773 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8774 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8775 ok(!typeattr->cFuncs, "Unexpected cFuncs %u.\n", typeattr->cFuncs);
8776 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8777
8778 hr = ICreateTypeLib2_SaveAllChanges(createtl);
8779 ok(hr == S_OK, "Failed to save changes, hr %#lx.\n", hr);
8780 ICreateTypeLib2_Release(createtl);
8781 ITypeInfo_Release(ti);
8782 ICreateTypeInfo2_Release(createti2);
8783
8784 /* Load and check typeinfo. */
8786 ok(hr == S_OK, "Failed to load typelib, hr %#lx.\n", hr);
8787
8788 hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
8789 ok(hr == S_OK, "Failed to get typeinfo, hr %#lx.\n", hr);
8790 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8791 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8792 ok(!typeattr->cFuncs, "Unexpected cFuncs value.\n");
8793 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8794 ITypeInfo_Release(ti);
8795
8796 ITypeLib_Release(tl);
8797
8799}
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:1999
char temp_path[MAX_PATH]
Definition: mspatcha.c:123

Referenced by START_TEST().

◆ test_DeleteImplType()

static void test_DeleteImplType ( void  )
static

Definition at line 8627 of file typelib.c.

8628{
8629 static OLECHAR interface1W[] = L"interface1";
8630 HREFTYPE hreftype, hreftype2;
8631 ICreateTypeInfo2 *createti2;
8632 ICreateTypeInfo *createti;
8633 ICreateTypeLib2 *createtl;
8635 ITypeInfo *dispti, *ti;
8636 ITypeLib *stdole, *tl;
8637 TYPEATTR *typeattr;
8638 HRESULT hr;
8639 int flags;
8640
8641 hr = LoadTypeLib(L"stdole2.tlb", &stdole);
8642 ok(hr == S_OK, "Failed to load stdole2, hr %#lx.\n", hr);
8643
8644 hr = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispti);
8645 ok(hr == S_OK, "Failed to get IDispatch typeinfo, hr %#lx.\n", hr);
8646
8647 GetTempFileNameW(L".", L"tlb", 0, filenameW);
8648
8649 hr = CreateTypeLib2(SYS_WIN32, filenameW, &createtl);
8650 ok(hr == S_OK, "Failed to create instance, hr %#lx.\n", hr);
8651
8652 hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
8653 ok(hr == S_OK, "Failed to create instance, hr %#lx.\n", hr);
8654 hr = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void **)&createti2);
8655 ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr);
8656 ICreateTypeInfo_Release(createti);
8657
8658 hr = ICreateTypeInfo2_AddRefTypeInfo(createti2, dispti, &hreftype);
8659 ok(hr == S_OK, "Failed to add referenced typeinfo, hr %#lx.\n", hr);
8660
8661 hr = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo, (void **)&ti);
8662 ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr);
8663
8664 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8665 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8666 ok(!(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE), "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
8667 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8668
8669 hr = ICreateTypeInfo2_AddImplType(createti2, 0, hreftype);
8670 ok(hr == S_OK, "Failed to add impl type, hr %#lx.\n", hr);
8671
8672 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8673 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8674 ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
8675 ok(typeattr->cImplTypes == 1, "Unexpected cImplTypes value.\n");
8676 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8677
8678 /* Delete impltype, check flags. */
8679 hr = ICreateTypeInfo2_DeleteImplType(createti2, 0);
8680 ok(hr == S_OK, "Failed to delete impl type, hr %#lx.\n", hr);
8681
8682 hr = ICreateTypeInfo2_DeleteImplType(createti2, 0);
8683 ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#lx.\n", hr);
8684
8685 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8686 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8687 ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
8688 ok(!typeattr->cImplTypes, "Unexpected cImplTypes value.\n");
8689 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8690
8691 hr = ITypeInfo_GetImplTypeFlags(ti, 0, &flags);
8692 ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#lx.\n", hr);
8693
8694 hr = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype2);
8695 ok(hr == TYPE_E_ELEMENTNOTFOUND, "Unexpected hr %#lx.\n", hr);
8696
8697 hr = ICreateTypeLib2_SaveAllChanges(createtl);
8698 ok(hr == S_OK, "Failed to save changes, hr %#lx.\n", hr);
8699 ICreateTypeLib2_Release(createtl);
8700 ITypeInfo_Release(ti);
8701 ICreateTypeInfo2_Release(createti2);
8702
8703 /* Load and check typeinfo. */
8705 ok(hr == S_OK, "Failed to load typelib, hr %#lx.\n", hr);
8706
8707 hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
8708 ok(hr == S_OK, "Failed to get typeinfo, hr %#lx.\n", hr);
8709 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8710 ok(hr == S_OK, "Failed to get type attr, hr %#lx.\n", hr);
8711 ok(typeattr->wTypeFlags & TYPEFLAG_FDISPATCHABLE, "Unexpected type flags %#x.\n", typeattr->wTypeFlags);
8712 ok(!typeattr->cImplTypes, "Unexpected cImplTypes value.\n");
8713 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8714 ITypeInfo_Release(ti);
8715
8716 ITypeLib_Release(tl);
8717
8718 ITypeLib_Release(stdole);
8719 ITypeInfo_Release(dispti);
8720
8722}

Referenced by START_TEST().

◆ test_dep()

static void test_dep ( SYSKIND  sys)
static

Definition at line 8513 of file typelib.c.

8514{
8515 HRESULT hr;
8516 const WCHAR *refFilename;
8517 ITypeLib *preftLib;
8518 ITypeInfo *preftInfo;
8519 char filename[MAX_PATH];
8521 ICreateTypeLib2 *pctLib;
8522 ICreateTypeInfo *pctInfo;
8523 ITypeLib *ptLib;
8524 ITypeInfo *ptInfo;
8525 ITypeInfo *ptInfoExt = NULL;
8526 HREFTYPE refType;
8527
8528 static WCHAR ifacenameW[] = {'I','T','e','s','t','D','e','p',0};
8529
8530 static const GUID libguid = {0xe0228f26,0x2946,0x478c,{0xb6,0x4a,0x93,0xfe,0xef,0xa5,0x05,0x32}};
8531 static const GUID ifaceguid = {0x394376dd,0x3bb8,0x4804,{0x8c,0xcc,0x95,0x59,0x43,0x40,0x04,0xf3}};
8532
8533 winetest_push_context( "%s", sys == SYS_WIN32 ? "win32" : "win64" );
8534
8535 refFilename = create_test_typelib(4);
8536 hr = LoadTypeLibEx(refFilename, REGKIND_NONE, &preftLib);
8537 ok(hr == S_OK, "got %08lx\n", hr);
8538
8539 hr = ITypeLib_GetTypeInfoOfGuid(preftLib, &IID_IBaseIface, &preftInfo);
8540 ok(hr == S_OK, "got %08lx\n", hr);
8541
8542 GetTempFileNameA(".", "tlb", 0, filename);
8544
8545 hr = CreateTypeLib2(sys, filenameW, &pctLib);
8546 ok(hr == S_OK, "got %08lx\n", hr);
8547
8548 hr = ICreateTypeLib2_SetGuid(pctLib, &libguid);
8549 ok(hr == S_OK, "got %08lx\n", hr);
8550
8551 hr = ICreateTypeLib2_SetLcid(pctLib, LOCALE_NEUTRAL);
8552 ok(hr == S_OK, "got %08lx\n", hr);
8553
8554 hr = ICreateTypeLib2_CreateTypeInfo(pctLib, ifacenameW, TKIND_INTERFACE, &pctInfo);
8555 ok(hr == S_OK, "got %08lx\n", hr);
8556
8557 hr = ICreateTypeInfo_SetGuid(pctInfo, &ifaceguid);
8558 ok(hr == S_OK, "got %08lx\n", hr);
8559
8560 hr = ICreateTypeInfo_SetTypeFlags(pctInfo, TYPEFLAG_FOLEAUTOMATION);
8561 ok(hr == S_OK, "got %08lx\n", hr);
8562
8563 hr = ICreateTypeInfo_AddRefTypeInfo(pctInfo, preftInfo, &refType);
8564 ok(hr == S_OK, "got %08lx\n", hr);
8565
8566 hr = ICreateTypeInfo_AddImplType(pctInfo, 0, refType);
8567 ok(hr == S_OK, "got %08lx\n", hr);
8568
8569 ICreateTypeInfo_Release(pctInfo);
8570
8571 hr = ICreateTypeLib2_SaveAllChanges(pctLib);
8572 ok(hr == S_OK, "got %08lx\n", hr);
8573
8574 ICreateTypeLib2_Release(pctLib);
8575
8576 ITypeInfo_Release(preftInfo);
8577 ITypeLib_Release(preftLib);
8578 DeleteFileW(refFilename);
8579
8581 ok(hr == S_OK, "got: %lx\n", hr);
8582
8583 hr = ITypeLib_GetTypeInfoOfGuid(ptLib, &ifaceguid, &ptInfo);
8584 ok(hr == S_OK, "got: %lx\n", hr);
8585
8586 hr = ITypeInfo_GetRefTypeOfImplType(ptInfo, 0, &refType);
8587 ok(hr == S_OK, "got: %lx\n", hr);
8588
8589 hr = ITypeInfo_GetRefTypeInfo(ptInfo, refType, &ptInfoExt);
8590 ok(hr == TYPE_E_CANTLOADLIBRARY, "got: %lx\n", hr);
8591
8592 ITypeInfo_Release(ptInfo);
8593 if(ptInfoExt)
8594 ITypeInfo_Release(ptInfoExt);
8595 ITypeLib_Release(ptLib);
8596
8598 ok(hr == S_OK, "got %08lx\n", hr);
8599
8600 hr = ITypeLib_GetTypeInfo(ptLib, 0, &ptInfo);
8601 ok(hr == S_OK, "GetTypeInfo failed: %08lx\n", hr);
8602
8603 hr = ITypeInfo_GetRefTypeOfImplType(ptInfo, 0, &refType);
8604 ok(hr == S_OK, "GetRefTypeOfImplType failed: %08lx\n", hr);
8605
8606 hr = ITypeInfo_GetRefTypeInfo(ptInfo, refType, &ptInfoExt);
8607 ok(hr == TYPE_E_CANTLOADLIBRARY, "got: %lx\n", hr);
8608
8609 refFilename = create_test_typelib(4);
8610 hr = LoadTypeLibEx(refFilename, REGKIND_NONE, &preftLib);
8611 ok(hr == S_OK, "got %08lx\n", hr);
8612
8613 hr = ITypeInfo_GetRefTypeInfo(ptInfo, refType, &ptInfoExt);
8614 ok(hr == S_OK, "got: %lx\n", hr);
8615 ITypeInfo_Release(ptInfoExt);
8616
8617 ITypeLib_Release(preftLib);
8618 DeleteFileW(refFilename);
8619
8620 ITypeInfo_Release(ptInfo);
8621 ITypeLib_Release(ptLib);
8622
8625}
#define TYPE_E_CANTLOADLIBRARY
Definition: winerror.h:3655

Referenced by START_TEST().

◆ test_DispCallFunc()

static void test_DispCallFunc ( void  )
static

Definition at line 1503 of file typelib.c.

1504{
1505 void **inst;
1506 HRESULT res;
1507 VARIANT result, args[5];
1508 VARIANTARG *pargs[5];
1509 VARTYPE types[5];
1510 int i;
1511
1512 for (i = 0; i < 5; i++) pargs[i] = &args[i];
1513
1514 memset( args, 0x55, sizeof(args) );
1515
1516 types[0] = VT_VARIANT;
1517 V_VT(&args[0]) = VT_I4;
1518 V_I4(&args[0]) = 2;
1519 types[1] = VT_VARIANT;
1520 V_VT(&args[1]) = VT_BSTR;
1522 memset( &result, 0xcc, sizeof(result) );
1524 ok(res == S_OK, "DispCallFunc error %#lx\n", res);
1525 ok(V_VT(&result) == VT_UI4, "wrong result type %d\n", V_VT(&result));
1526 ok(V_UI4(&result) == 4321, "wrong result %lu\n", V_UI4(&result));
1527
1528 V_VT(&result) = VT_I4;
1529 V_UI4(&result) = 1234;
1530 inst = vtable2;
1531 res = DispCallFunc(&inst, 3 * sizeof(void *), CC_STDCALL, VT_VARIANT, 2, types, pargs, &result);
1532 ok(res == S_OK, "DispCallFunc error %#lx\n", res);
1533 ok(V_VT(&result) == VT_UI4, "wrong result type %d\n", V_VT(&result));
1534 ok(V_UI4(&result) == 4321, "wrong result %lu\n", V_UI4(&result));
1535
1536 VariantClear(&args[1]);
1537
1538 memset( args, 0x55, sizeof(args) );
1539 types[0] = VT_UI4;
1540 V_UI4(&args[0]) = 1;
1541 types[1] = VT_I4;
1542 V_I4(&args[1]) = -1;
1543 types[2] = VT_I2;
1544 V_I2(&args[2]) = 1234;
1545 types[3] = VT_UI4;
1546 V_UI4(&args[3]) = 0xdeadbeef;
1547 types[4] = VT_UI4;
1548 V_I1(&args[4]) = -3;
1549 memset( &result, 0xcc, sizeof(result) );
1551 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1552 ok( V_VT(&result) == VT_UI4, "wrong result type %d\n", V_VT(&result) );
1553 ok( V_UI4(&result) == 4321, "wrong result %lu\n", V_UI4(&result) );
1554
1555 /* the function checks the argument sizes for stdcall */
1557 {
1559 ok( res == DISP_E_BADCALLEE, "DispCallFunc wrong error %lx\n", res );
1561 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1563 ok( res == DISP_E_BADCALLEE, "DispCallFunc wrong error %lx\n", res );
1564 }
1565
1566 memset( args, 0x55, sizeof(args) );
1567 types[0] = VT_R8;
1568 V_R8(&args[0]) = 1.2;
1569 types[1] = VT_R4;
1570 V_R4(&args[1]) = 3.25;
1571 types[2] = VT_R8;
1572 V_R8(&args[2]) = 1.2e12;
1573 types[3] = VT_I4;
1574 V_I4(&args[3]) = -4433;
1575 memset( &result, 0xcc, sizeof(result) );
1577 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1578 ok( V_VT(&result) == VT_R8, "wrong result type %d\n", V_VT(&result) );
1579 ok( V_R8(&result) == 4321, "wrong result %f\n", V_R8(&result) );
1580
1581 memset( args, 0x55, sizeof(args) );
1582 types[0] = VT_I8;
1583 V_I8(&args[0]) = 0xdead00000000beefll;
1584 types[1] = VT_CY;
1585 V_CY(&args[1]).int64 = (ULONGLONG)10000 * 12345678;
1586 memset( &result, 0xcc, sizeof(result) );
1588 ok( res == S_OK || broken(res == E_INVALIDARG), /* longlong not supported on <= win2k */
1589 "DispCallFunc failed %lx\n", res );
1590 if (res == S_OK)
1591 {
1592 ok( V_VT(&result) == VT_I8, "wrong result type %d\n", V_VT(&result) );
1593 ok( V_I8(&result) == (((ULONGLONG)4321 << 32) | 8765), "wrong result %#I64x\n",
1594 V_I8(&result) );
1595 }
1596
1597 memset( args, 0x55, sizeof(args) );
1598 types[0] = VT_I4;
1599 V_I4(&args[0]) = 2233;
1600 types[1] = VT_BOOL;
1601 V_BOOL(&args[1]) = 1;
1602 types[2] = VT_DECIMAL;
1603 V_DECIMAL(&args[2]).Hi32 = 1122;
1604 V_DECIMAL(&args[2]).Lo64 = 3344;
1605 types[3] = VT_VARIANT;
1606 V_VT(&args[3]) = VT_EMPTY;
1607 V_UI4(&args[3]) = 0xdeadbeef;
1608 types[4] = VT_EMPTY;
1609 memset( &result, 0xcc, sizeof(result) );
1611 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1612 ok( V_VT(&result) == VT_LPWSTR, "wrong result type %d\n", V_VT(&result) );
1613 ok( V_UI4(&result) == 0xbabe, "wrong result %08lx\n", V_UI4(&result) );
1614
1615 memset( args, 0x55, sizeof(args) );
1616 types[0] = VT_EMPTY;
1617 types[1] = VT_I4;
1618 V_I4(&args[1]) = 1111;
1619 types[2] = VT_EMPTY;
1620 types[3] = VT_I4;
1621 V_I4(&args[3]) = 0;
1622 types[4] = VT_EMPTY;
1623 memset( &result, 0xcc, sizeof(result) );
1625 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1626 ok( V_VT(&result) == VT_EMPTY, "wrong result type %d\n", V_VT(&result) );
1627#ifdef __i386__
1628 ok( V_UI4(&result) == 0xcccccccc, "wrong result %08lx\n", V_UI4(&result) );
1629#else
1630 ok( V_UI4(&result) == 12, "wrong result %08lx\n", V_UI4(&result) );
1631#endif
1632 memset( args, 0x55, sizeof(args) );
1633 types[0] = VT_I4;
1634 V_I4(&args[0]) = 3;
1635 memset( &result, 0xcc, sizeof(result) );
1636 inst = vtable;
1637 res = DispCallFunc( &inst, 3 * sizeof(void*), CC_STDCALL, VT_I4, 1, types, pargs, &result );
1638 ok( res == S_OK, "DispCallFunc failed %lx\n", res );
1639 ok( V_VT(&result) == VT_I4, "wrong result type %d\n", V_VT(&result) );
1640 ok( V_I4(&result) == 6, "wrong result %08lx\n", V_I4(&result) );
1641
1642 memset( &result, 0xcc, sizeof(result) );
1644 ok(res == S_OK, "DispCallFunc failed: %08lx\n", res);
1645 ok(V_VT(&result) == VT_ERROR, "V_VT(result) = %u\n", V_VT(&result));
1646 ok(V_ERROR(&result) == S_FALSE, "V_ERROR(result) = %08lx\n", V_ERROR(&result));
1647
1648 memset( &result, 0xcc, sizeof(result) );
1650 ok(res == E_INVALIDARG, "DispCallFunc failed: %08lx\n", res);
1651 ok(V_VT(&result) == 0xcccc, "V_VT(result) = %u\n", V_VT(&result));
1652}
void(* void_func)(int a, int b)
Definition: ckconfig.c:157
unsigned short VARTYPE
Definition: compat.h:2254
@ VT_R4
Definition: compat.h:2299
@ VT_DECIMAL
Definition: compat.h:2309
@ VT_ERROR
Definition: compat.h:2305
@ VT_LPWSTR
Definition: compat.h:2325
@ VT_CY
Definition: compat.h:2301
HRESULT WINAPI DispCallFunc(void *pvInstance, ULONG_PTR oVft, CALLCONV cc, VARTYPE vtReturn, UINT cActuals, VARTYPE *prgvt, VARIANTARG **prgpvarg, VARIANT *pvargResult)
Definition: typelib.c:7071
GLuint64EXT * result
Definition: glext.h:11304
static int WINAPI int_func(int a0, int a1, int a2, int a3, int a4)
Definition: typelib.c:1377
static LONGLONG WINAPI longlong_func(LONGLONG a0, CY a1)
Definition: typelib.c:1400
static void * vtable[]
Definition: typelib.c:1500
static const BOOL abi_supports_stdcall
Definition: typelib.c:102
static void * vtable2[]
Definition: typelib.c:1501
static VARIANT WINAPI variant_func(int a0, BOOL a1, DECIMAL a2, VARIANT a3)
Definition: typelib.c:1407
static int WINAPI stdcall_func(int a)
Definition: typelib.c:1433
static double WINAPI double_func(double a0, float a1, double a2, int a3)
Definition: typelib.c:1391
static VARIANT WINAPI variant_func2(VARIANT v1, VARIANT v2)
Definition: typelib.c:1452
static HRESULT WINAPI ret_false_func(void)
Definition: typelib.c:1445
#define V_ERROR(A)
Definition: oleauto.h:241
#define V_R4(A)
Definition: oleauto.h:260
#define V_DECIMAL(A)
Definition: oleauto.h:236
#define V_CY(A)
Definition: oleauto.h:229
#define V_R8(A)
Definition: oleauto.h:262
@ CC_CDECL
Definition: spec2def.c:95
Definition: match.c:390
Definition: cmds.c:130
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define DISP_E_BADCALLEE
Definition: winerror.h:3628

Referenced by START_TEST().

◆ test_dump_typelib()

static void test_dump_typelib ( const WCHAR name)
static

Definition at line 6568 of file typelib.c.

6569{
6571 CUSTDATA cust_data;
6572 int iface = 0, func, var, cust;
6573 HREFTYPE hRefType = 0;
6574 VARIANT v;
6575 HRESULT hr;
6576 TLIBATTR *libattr;
6577 const type_info *ti;
6578
6580
6581 ole_check(ITypeLib_GetLibAttr(typelib, &libattr));
6582 if(libattr->syskind != info_syskind) {
6583 /* struct VARDESC::oInst may vary from changes in sizeof(void *) affecting the offset of later fields*/
6584 skip("ignoring VARDESC::oInst, (libattr->syskind expected %d got %d)\n", info_syskind, libattr->syskind);
6585 }
6586
6587 for (ti = info; ti != info + ARRAY_SIZE(info); ti++)
6588 {
6589 ITypeInfo2 *typeinfo2;
6591 TYPEATTR *typeattr;
6592 BSTR bstrIfName;
6593 DWORD help_ctx;
6594
6595 winetest_push_context("Interface %s", ti->name);
6596 ole_check(ITypeLib_GetTypeInfo(typelib, iface, &typeinfo));
6597 if (hRefType)
6598 {
6599 ITypeInfo *refInfo;
6600 ole_check(ITypeInfo_GetRefTypeInfo(typeinfo, hRefType, &refInfo));
6601 ITypeInfo_Release(typeinfo);
6602 typeinfo = refInfo;
6603 }
6604 ole_check(ITypeLib_GetDocumentation(typelib, iface, &bstrIfName, NULL, &help_ctx, NULL));
6605 expect_wstr_acpval(bstrIfName, ti->name);
6606 SysFreeString(bstrIfName);
6607
6608 ole_check(ITypeInfo_GetTypeAttr(typeinfo, &typeattr));
6609 expect_int(typeattr->typekind, ti->type);
6610 expect_hex(typeattr->wTypeFlags, ti->wTypeFlags);
6611 expect_int(typeattr->cbAlignment, ti->cbAlignment);
6612 expect_int(typeattr->cbSizeInstance, ti->cbSizeInstance);
6613 expect_int(help_ctx, ti->help_ctx);
6614 expect_int(MAKELONG(typeattr->wMinorVerNum, typeattr->wMajorVerNum), ti->version);
6615 expect_int(typeattr->cbSizeVft, ti->cbSizeVft * sizeof(void*));
6616 expect_int(typeattr->cFuncs, ti->cFuncs);
6617 expect_int(typeattr->cVars, ti->cVars);
6618
6619 /* compare type uuid */
6620 if (ti->uuid && *ti->uuid)
6621 {
6622 ITypeInfo *typeinfo2;
6623 HRESULT hr;
6624 GUID guid;
6625
6626 parse_guid(ti->uuid,&guid);
6627 expect_guid(&guid, &typeattr->guid);
6628
6629 /* check that it's possible to search using this uuid */
6630 typeinfo2 = NULL;
6631 hr = ITypeLib_GetTypeInfoOfGuid(typelib, &guid, &typeinfo2);
6632 ok(hr == S_OK || (IsEqualGUID(&guid, &IID_NULL) && hr == TYPE_E_ELEMENTNOTFOUND), "got 0x%08lx\n", hr);
6633 if (hr == S_OK) ITypeInfo_Release(typeinfo2);
6634 }
6635
6636 ole_check(ITypeInfo_GetTypeAttr(typeinfo, &typeattr));
6637
6638 hr = ITypeInfo_QueryInterface(typeinfo, &IID_ITypeInfo2, (void**)&typeinfo2);
6639 ok(hr == S_OK, "Could not get ITypeInfo2: %08lx\n", hr);
6640
6641 memset(&cust_data, 0, sizeof(cust_data));
6642 ole_check(ITypeInfo2_GetAllCustData(typeinfo2,&cust_data));
6643 expect_int(cust_data.cCustData, ti->cCustData);
6644 ClearCustData(&cust_data);
6645 for (cust = 0; cust < ti->cCustData; cust++)
6646 {
6647 GUID guid;
6648 parse_guid(ti->custdata[cust].uuid,&guid);
6649 /* check that it's possible to search using this uuid */
6650 hr = ITypeInfo2_GetCustData(typeinfo2,&guid,&v);
6651 ok(hr == S_OK, "GetCustDatafailed: %08lx\n", hr);
6652 check_variant_info(&v,&ti->custdata[cust].value);
6653 VariantClear(&v);
6654 }
6655
6656 for (func = 0; func < typeattr->cFuncs; func++)
6657 {
6658 const function_info *fn_info = &ti->funcs[func];
6659 FUNCDESC *desc;
6660 BSTR namesTab[256];
6661 UINT cNames;
6662 int i;
6663
6664 winetest_push_context("Function %s", fn_info->names[0]);
6665 ole_check(ITypeInfo_GetFuncDesc(typeinfo, func, &desc));
6666 expect_int(desc->memid, fn_info->memid);
6667 expect_int(desc->funckind, fn_info->funckind);
6668 expect_int(desc->invkind, fn_info->invkind);
6669 expect_int(desc->callconv, fn_info->callconv);
6670 expect_int(desc->cParams, fn_info->cParams);
6671 expect_int(desc->cParamsOpt, fn_info->cParamsOpt);
6672 expect_int(desc->oVft, fn_info->vtbl_index * sizeof(void*));
6673 expect_int(desc->cScodes, fn_info->cScodes);
6674 expect_int(desc->wFuncFlags, fn_info->wFuncFlags);
6675
6676 memset(&cust_data, 0, sizeof(cust_data));
6677 ole_check(ITypeInfo2_GetAllFuncCustData(typeinfo2,func,&cust_data));
6678 expect_int(cust_data.cCustData, fn_info->cCustData);
6679 ClearCustData(&cust_data);
6680 for (cust = 0; cust < fn_info->cCustData; cust++)
6681 {
6682 GUID guid;
6683 parse_guid(fn_info->custdata[cust].uuid,&guid);
6684 /* check that it's possible to search using this uuid */
6685 hr = ITypeInfo2_GetFuncCustData(typeinfo2,func,&guid,&v);
6686 ok(hr == S_OK, "GetCustDatafailed: %08lx\n", hr);
6687 check_variant_info(&v,&fn_info->custdata[cust].value);
6688 VariantClear(&v);
6689 }
6690
6691 ole_check(ITypeInfo_GetNames(typeinfo, desc->memid, namesTab, 256, &cNames));
6692 for (i = 0; i < cNames; i++)
6693 {
6694 expect_wstr_acpval(namesTab[i], fn_info->names[i]);
6695 SysFreeString(namesTab[i]);
6696 }
6697 expect_null(fn_info->names[cNames]);
6698
6699 check_type(&desc->elemdescFunc, &fn_info->ret_type);
6700 for (i = 0 ; i < desc->cParams; i++)
6701 {
6702 check_type(&desc->lprgelemdescParam[i], &fn_info->params[i]);
6703
6704 memset(&cust_data, 0, sizeof(cust_data));
6705 ole_check(ITypeInfo2_GetAllParamCustData(typeinfo2,func,i,&cust_data));
6706 expect_int(cust_data.cCustData, fn_info->params[i].cCustData);
6707 ClearCustData(&cust_data);
6708 for (cust = 0; cust < fn_info->params[i].cCustData; cust++)
6709 {
6710 GUID guid;
6711 parse_guid(fn_info->params[i].custdata[cust].uuid,&guid);
6712 /* check that it's possible to search using this uuid */
6713 hr = ITypeInfo2_GetParamCustData(typeinfo2,func,i,&guid,&v);
6714 ok(hr == S_OK, "GetParamCustDatafailed: %08lx\n", hr);
6715 check_variant_info(&v,&fn_info->params[i].custdata[cust].value);
6716 VariantClear(&v);
6717 }
6718
6719 if (desc->lprgelemdescParam[i].tdesc.vt == VT_USERDEFINED)
6720 {
6722 TYPEATTR *var_attr;
6723
6724 ole_check(ITypeInfo_GetRefTypeInfo(typeinfo, desc->lprgelemdescParam[i].tdesc.hreftype, &param));
6725 ole_check(ITypeInfo_GetTypeAttr(param, &var_attr));
6726
6727 ok(var_attr->typekind == fn_info->params[i].type, "expected %#x, got %#x\n", fn_info->params[i].type, var_attr->typekind);
6728
6729 ITypeInfo_ReleaseTypeAttr(param, var_attr);
6730 ITypeInfo_Release(param);
6731 }
6732 }
6733 expect_int(fn_info->params[desc->cParams].vt, (VARTYPE)-1);
6734
6735 V_VT(&v) = VT_ERROR;
6736 hr = ITypeInfo2_GetFuncCustData(typeinfo2, func, &IID_NULL, &v);
6737 ok(hr == S_OK, "GetFuncCustData failed: %08lx\n", hr);
6738 ok(V_VT(&v) == VT_EMPTY, "V_VT(&v) = %d\n", V_VT(&v));
6739 VariantClear(&v);
6740
6741 V_VT(&v) = VT_ERROR;
6742 hr = ITypeInfo2_GetFuncCustData(typeinfo2, func, &IID_IBaseIface, &v);
6743 ok(hr == S_OK, "GetFuncCustData failed: %08lx\n", hr);
6744 ok(V_VT(&v) == VT_EMPTY, "V_VT(&v) = %d\n", V_VT(&v));
6745 VariantClear(&v);
6746
6747 memset(&cust_data, 0, sizeof(cust_data));
6748 ITypeInfo_ReleaseFuncDesc(typeinfo, desc);
6750 }
6751
6752 for (var = 0; var < typeattr->cVars; var++)
6753 {
6754 const var_info *var_info = &ti->vars[var];
6755 VARDESC *desc;
6756 BSTR varname;
6757 UINT cNames;
6758
6759 winetest_push_context("Variable %s", var_info->name);
6760 ole_check(ITypeInfo_GetVarDesc(typeinfo, var, &desc));
6761
6762 expect_int(desc->memid, var_info->memid);
6763
6764 ole_check(ITypeInfo_GetNames(typeinfo, desc->memid, &varname, 1, &cNames));
6765 expect_int(cNames, 1);
6766 expect_wstr_acpval(varname, var_info->name);
6767 SysFreeString(varname);
6768
6769 expect_null(desc->lpstrSchema); /* Reserved */
6770 expect_int(desc->wVarFlags, var_info->wVarFlags);
6771 expect_int(desc->varkind, var_info->varkind);
6772 if (desc->varkind == VAR_PERINSTANCE) {
6773 /* oInst depends on preceding field data sizes (except for unions),
6774 * so it may not be valid to expect it to match info[] on other platforms */
6775 if ((libattr->syskind == info_syskind) || (typeattr->typekind == TKIND_UNION)) {
6776 expect_int(desc->oInst, var_info->oInst);
6777 }
6778 } else if(desc->varkind == VAR_CONST) {
6779 check_variant_info(desc->lpvarValue, &var_info->varValue);
6780 } else {
6781 expect_null(desc->lpvarValue);
6782 }
6783 memset(&cust_data, 0, sizeof(cust_data));
6784 ole_check(ITypeInfo2_GetAllVarCustData(typeinfo2,var,&cust_data));
6785 expect_int(cust_data.cCustData, var_info->cCustData);
6786 ClearCustData(&cust_data);
6787 for (cust = 0; cust < var_info->cCustData; cust++)
6788 {
6789 GUID guid;
6791 /* check that it's possible to search using this uuid */
6792 hr = ITypeInfo2_GetVarCustData(typeinfo2,var,&guid,&v);
6793 ok(hr == S_OK, "GetVarCustData failed: %08lx\n", hr);
6795 VariantClear(&v);
6796 }
6797
6798 check_type(&desc->elemdescVar, &var_info->elemdescVar);
6799
6800 ITypeInfo_ReleaseVarDesc(typeinfo, desc);
6802 }
6803
6804 if ((typeattr->typekind == TKIND_DISPATCH) && (typeattr->wTypeFlags & TYPEFLAG_FDUAL) &&
6805 SUCCEEDED(ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &hRefType)))
6806 {
6807 /* next iteration dumps hRefType, the TKIND_INTERFACE reference underneath this [dual] TKIND_DISPATCH */
6808 }
6809 else
6810 {
6811 iface++; /* move to the next item in typelib */
6812 hRefType = 0;
6813 }
6814
6815 ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
6816
6817 ITypeInfo2_Release(typeinfo2);
6818 ITypeInfo_Release(typeinfo);
6820 }
6821 expect_eq(ITypeLib_GetTypeInfoCount(typelib), iface, UINT, "%d");
6822 ITypeLib_ReleaseTLibAttr(typelib, libattr);
6823 ITypeLib_Release(typelib);
6824}
void WINAPI ClearCustData(CUSTDATA *lpCust)
Definition: typelib.c:11635
const GLdouble * v
Definition: gl.h:2040
GLenum func
Definition: glext.h:6028
GLfloat param
Definition: glext.h:5796
#define SUCCEEDED(hr)
Definition: intsafe.h:50
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
const char * var
Definition: shader.c:5666
#define expect_hex(expr, value)
Definition: typelib.c:45
#define expect_eq(expr, value, type, format)
Definition: typelib.c:43
#define check_variant_info(value, expected)
Definition: typelib.c:6538
#define expect_guid(expected, guid)
Definition: typelib.c:47
#define expect_null(expr)
Definition: typelib.c:46
static void parse_guid(LPCSTR strGuid, GUID *guid)
Definition: typelib.c:6561
static const SYSKIND info_syskind
Definition: typelib.c:4855
#define check_type(elem, info)
Definition: typelib.c:6556
unsigned int UINT
Definition: ndis.h:50
#define IID_NULL
Definition: guiddef.h:98
char * name
Definition: cxx.h:334
variant_info value
Definition: typelib.c:4791
LPCSTR uuid
Definition: typelib.c:4790
TYPEKIND type
Definition: typelib.c:4797
DWORD cCustData
Definition: typelib.c:4799
VARTYPE vt
Definition: typelib.c:4796
custdata_info custdata[5]
Definition: typelib.c:4800
custdata_info custdata[5]
Definition: typelib.c:4816
WORD wFuncFlags
Definition: typelib.c:4813
DWORD cCustData
Definition: typelib.c:4815
FUNCKIND funckind
Definition: typelib.c:4806
short cParamsOpt
Definition: typelib.c:4810
MEMBERID memid
Definition: typelib.c:4805
short vtbl_index
Definition: typelib.c:4811
short cScodes
Definition: typelib.c:4812
element_info ret_type
Definition: typelib.c:4814
INVOKEKIND invkind
Definition: typelib.c:4807
LPCSTR names[15]
Definition: typelib.c:4818
element_info params[15]
Definition: typelib.c:4817
short cParams
Definition: typelib.c:4809
CALLCONV callconv
Definition: typelib.c:4808
LPCSTR name
Definition: typelib.c:4824
DWORD cCustData
Definition: typelib.c:4831
custdata_info custdata[5]
Definition: typelib.c:4832
WORD wVarFlags
Definition: typelib.c:4825
MEMBERID memid
Definition: typelib.c:4823
element_info elemdescVar
Definition: typelib.c:4833
VARKIND varkind
Definition: typelib.c:4826
variant_info varValue
Definition: typelib.c:4829
ULONG oInst
Definition: typelib.c:4828
#define MAKELONG(a, b)
Definition: typedefs.h:249
@ TKIND_UNION
Definition: widltypes.h:241

Referenced by START_TEST().

◆ test_FindName()

static void test_FindName ( void  )
static

Definition at line 7720 of file typelib.c.

7721{
7722 static const WCHAR invalidW[] = {'i','n','v','a','l','i','d',0};
7723 WCHAR buffW[100];
7724 MEMBERID memid;
7725 ITypeInfo *ti;
7726 ITypeLib *tl;
7727 HRESULT hr;
7728 UINT16 c;
7729
7730 hr = LoadTypeLib(wszStdOle2, &tl);
7731 ok(hr == S_OK, "got 0x%08lx\n", hr);
7732
7733 hr = ITypeLib_FindName(tl, NULL, 0, NULL, NULL, NULL);
7734 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
7735
7736 lstrcpyW(buffW, wszGUID);
7737 hr = ITypeLib_FindName(tl, buffW, 0, NULL, NULL, NULL);
7738 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
7739
7740 c = 0;
7741 ti = (void*)0xdeadbeef;
7742 hr = ITypeLib_FindName(tl, buffW, 0, &ti, NULL, &c);
7743 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
7744 ok(c == 0, "got %d\n", c);
7745 ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
7746
7747 c = 1;
7748 ti = (void*)0xdeadbeef;
7749 hr = ITypeLib_FindName(tl, buffW, 0, &ti, NULL, &c);
7750 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
7751 ok(c == 1, "got %d\n", c);
7752 ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
7753
7754 c = 1;
7755 memid = 0;
7756 ti = (void*)0xdeadbeef;
7757 hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
7758 ok(hr == S_OK, "got 0x%08lx\n", hr);
7759 ok(memid == MEMBERID_NIL, "got %ld\n", memid);
7760 ok(!lstrcmpW(buffW, wszGUID), "got %s\n", wine_dbgstr_w(buffW));
7761 ok(c == 1, "got %d\n", c);
7762 ITypeInfo_Release(ti);
7763
7764 c = 1;
7765 memid = 0;
7766 lstrcpyW(buffW, wszguid);
7767 ti = (void*)0xdeadbeef;
7768 hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
7769 ok(hr == S_OK, "got 0x%08lx\n", hr);
7770todo_wine {
7771 ok(memid == MEMBERID_NIL, "got %ld\n", memid);
7772 ok(!lstrcmpW(buffW, wszGUID), "got %s\n", wine_dbgstr_w(buffW));
7773 ok(c == 1, "got %d\n", c);
7774}
7775 if (c == 1)
7776 ITypeInfo_Release(ti);
7777
7778 c = 1;
7779 memid = -1;
7780 lstrcpyW(buffW, invalidW);
7781 ti = (void*)0xdeadbeef;
7782 hr = ITypeLib_FindName(tl, buffW, 0, &ti, &memid, &c);
7783 ok(hr == S_OK, "got 0x%08lx\n", hr);
7784 ok(memid == MEMBERID_NIL, "got %ld\n", memid);
7785 ok(!lstrcmpW(buffW, invalidW), "got %s\n", wine_dbgstr_w(buffW));
7786 ok(c == 0, "got %d\n", c);
7787 ok(ti == (void*)0xdeadbeef, "got %p\n", ti);
7788
7789 ITypeLib_Release(tl);
7790}
unsigned short UINT16
Definition: actypes.h:129
#define lstrcpyW
Definition: compat.h:749
const GLubyte * c
Definition: glext.h:8905
#define c
Definition: ke_i.h:80
static const WCHAR invalidW[]
Definition: locale.c:52
static WCHAR wszguid[]
Definition: typelib.c:94
static WCHAR wszGUID[]
Definition: typelib.c:93

Referenced by START_TEST().

◆ test_GetLibAttr()

static void test_GetLibAttr ( void  )
static

Definition at line 8291 of file typelib.c.

8292{
8293 ULONG ref1, ref2;
8294 TLIBATTR *attr;
8295 ITypeLib *tl;
8296 HRESULT hr;
8297
8298 hr = LoadTypeLib(wszStdOle2, &tl);
8299 ok(hr == S_OK, "got 0x%08lx\n", hr);
8300
8301 ref1 = ITypeLib_AddRef(tl);
8302 ITypeLib_Release(tl);
8303
8304 hr = ITypeLib_GetLibAttr(tl, &attr);
8305 ok(hr == S_OK, "got 0x%08lx\n", hr);
8306
8307 ref2 = ITypeLib_AddRef(tl);
8308 ITypeLib_Release(tl);
8309 ok(ref2 == ref1, "got %ld, %ld\n", ref2, ref1);
8310
8311 ITypeLib_ReleaseTLibAttr(tl, attr);
8312 ITypeLib_Release(tl);
8313}

Referenced by START_TEST().

◆ test_inheritance()

static void test_inheritance ( void  )
static

Definition at line 1832 of file typelib.c.

1833{
1834 HRESULT hr;
1835 ITypeLib *pTL;
1836 ITypeInfo *pTI, *pTI_p, *dual_ti;
1837 TYPEATTR *pTA;
1838 HREFTYPE href;
1839 FUNCDESC *pFD;
1842
1845
1846 hr = LoadTypeLib(path, &pTL);
1847 if(FAILED(hr)) return;
1848
1849
1850 /* ItestIF3 is a syntax 2 dispinterface */
1851 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF3, &pTI);
1852 ok(hr == S_OK, "hr %08lx\n", hr);
1853
1854 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
1855 ok(hr == S_OK, "hr %08lx\n", hr);
1856 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
1857 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
1858 ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags);
1859 ok(pTA->cFuncs == 6, "cfuncs %d\n", pTA->cFuncs);
1860 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
1861 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
1862
1863 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
1864 ok(hr == S_OK, "hr %08lx\n", hr);
1865 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
1866 ok(hr == S_OK, "hr %08lx\n", hr);
1867 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
1868 ok(hr == S_OK, "got %08lx\n", hr);
1869 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
1870 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
1871 ITypeInfo_Release(pTI_p);
1872
1873 /* Should have six methods */
1874 hr = ITypeInfo_GetFuncDesc(pTI, 6, &pFD);
1875 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
1876 hr = ITypeInfo_GetFuncDesc(pTI, 5, &pFD);
1877 ok(hr == S_OK, "hr %08lx\n", hr);
1878 ok(pFD->memid == 0x60020000, "memid %08lx\n", pFD->memid);
1879 ok(pFD->oVft == 5 * sizeof(void *), "oVft %d\n", pFD->oVft);
1880 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
1881 ITypeInfo_Release(pTI);
1882
1883
1884 /* ItestIF4 is a syntax 1 dispinterface */
1885 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF4, &pTI);
1886 ok(hr == S_OK, "hr %08lx\n", hr);
1887
1888 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
1889 ok(hr == S_OK, "hr %08lx\n", hr);
1890 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
1891 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
1892 ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags);
1893 ok(pTA->cFuncs == 1, "cfuncs %d\n", pTA->cFuncs);
1894 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
1895 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
1896
1897 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
1898 ok(hr == S_OK, "hr %08lx\n", hr);
1899 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
1900 ok(hr == S_OK, "hr %08lx\n", hr);
1901 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
1902 ok(hr == S_OK, "got %08lx\n", hr);
1903 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
1904 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
1905 ITypeInfo_Release(pTI_p);
1906 hr = ITypeInfo_GetFuncDesc(pTI, 1, &pFD);
1907 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
1908 hr = ITypeInfo_GetFuncDesc(pTI, 0, &pFD);
1909 ok(hr == S_OK, "hr %08lx\n", hr);
1910 ok(pFD->memid == 0x1c, "memid %08lx\n", pFD->memid);
1911 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
1912 ITypeInfo_Release(pTI);
1913
1914
1915 /* ItestIF5 is dual with inherited ifaces which derive from IUnknown but not IDispatch */
1916 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF5, &pTI);
1917 ok(hr == S_OK, "hr %08lx\n", hr);
1918
1919 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
1920 ok(hr == S_OK, "hr %08lx\n", hr);
1921 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
1922 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
1923 ok(pTA->wTypeFlags == TYPEFLAG_FDUAL, "typeflags %x\n", pTA->wTypeFlags);
1924 ok(pTA->cFuncs == 8, "cfuncs %d\n", pTA->cFuncs);
1925 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
1926 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
1927
1928 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
1929 ok(hr == S_OK, "hr %08lx\n", hr);
1930 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
1931 ok(hr == S_OK, "hr %08lx\n", hr);
1932 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
1933 ok(hr == S_OK, "got %08lx\n", hr);
1934 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
1935 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
1936 ITypeInfo_Release(pTI_p);
1937 hr = ITypeInfo_GetFuncDesc(pTI, 6, &pFD);
1938 ok(hr == S_OK, "hr %08lx\n", hr);
1939 ok(pFD->memid == 0x1234, "memid %08lx\n", pFD->memid);
1940 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
1941 ITypeInfo_Release(pTI);
1942
1943 /* ItestIF7 is dual with inherited ifaces which derive from Dispatch */
1944 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF7, &pTI);
1945 ok(hr == S_OK, "hr %08lx\n", hr);
1946
1947 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
1948 ok(hr == S_OK, "hr %08lx\n", hr);
1949 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
1950 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
1951 ok(pTA->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "typeflags %x\n", pTA->wTypeFlags);
1952 ok(pTA->cFuncs == 10, "cfuncs %d\n", pTA->cFuncs);
1953 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
1954 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
1955
1956 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
1957 ok(hr == S_OK, "hr %08lx\n", hr);
1958 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
1959 ok(hr == S_OK, "hr %08lx\n", hr);
1960 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
1961 ok(hr == S_OK, "got %08lx\n", hr);
1962 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
1963 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
1964 ITypeInfo_Release(pTI_p);
1965
1966 hr = ITypeInfo_GetFuncDesc(pTI, 9, &pFD);
1967 ok(hr == S_OK, "hr %08lx\n", hr);
1968 ok(pFD->memid == 0x1236, "memid %08lx\n", pFD->memid);
1969 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
1970 ITypeInfo_Release(pTI);
1971
1972 /* ItestIF10 is a syntax 2 dispinterface which doesn't derive from IUnknown */
1973 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF10, &pTI);
1974 ok(hr == S_OK, "hr %08lx\n", hr);
1975
1976 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
1977 ok(hr == S_OK, "hr %08lx\n", hr);
1978 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
1979 ok(pTA->cbSizeVft == sizeof(IDispatchVtbl), "sizevft %d\n", pTA->cbSizeVft);
1980 ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags);
1981 ok(pTA->cFuncs == 3, "cfuncs %d\n", pTA->cFuncs);
1982 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
1983 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
1984
1985 hr = ITypeInfo_GetRefTypeOfImplType(pTI, -1, &href);
1986 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
1987 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
1988 ok(hr == S_OK, "hr %08lx\n", hr);
1989 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
1990 ok(hr == S_OK, "hr %08lx\n", hr);
1991 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
1992 ok(hr == S_OK, "got %08lx\n", hr);
1993 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
1994 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
1995 ITypeInfo_Release(pTI_p);
1996
1997 /* Should have three methods */
1998 hr = ITypeInfo_GetFuncDesc(pTI, 3, &pFD);
1999 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
2000 hr = ITypeInfo_GetFuncDesc(pTI, 2, &pFD);
2001 ok(hr == S_OK, "hr %08lx\n", hr);
2002 ok(pFD->memid == 0x60010000, "memid %08lx\n", pFD->memid);
2003 ok(pFD->oVft == 2 * sizeof(void *), "oVft %d\n", pFD->oVft);
2004 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
2005 ITypeInfo_Release(pTI);
2006
2007 /* ItestIF11 is a syntax 2 dispinterface which derives from IDispatch */
2008 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &DIID_ItestIF11, &pTI);
2009 ok(hr == S_OK, "hr %08lx\n", hr);
2010
2011 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
2012 ok(hr == S_OK, "hr %08lx\n", hr);
2013 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
2014 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
2015 ok(pTA->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "typeflags %x\n", pTA->wTypeFlags);
2016 ok(pTA->cFuncs == 10, "cfuncs %d\n", pTA->cFuncs);
2017 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
2018 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
2019
2020 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
2021 ok(hr == S_OK, "hr %08lx\n", hr);
2022 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
2023 ok(hr == S_OK, "hr %08lx\n", hr);
2024 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
2025 ok(hr == S_OK, "got %08lx\n", hr);
2026 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", debugstr_guid(&pTA->guid));
2027 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
2028 ITypeInfo_Release(pTI_p);
2029
2030 /* Should have ten methods */
2031 hr = ITypeInfo_GetFuncDesc(pTI, 10, &pFD);
2032 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
2033 hr = ITypeInfo_GetFuncDesc(pTI, 9, &pFD);
2034 ok(hr == S_OK, "hr %08lx\n", hr);
2035 ok(pFD->memid == 0x1236, "memid %08lx\n", pFD->memid);
2036 ok(pFD->oVft == 9 * sizeof(void *), "oVft %d\n", pFD->oVft);
2037
2038 /* first argument to 10th function is an HREFTYPE from the impl type */
2039 ok(pFD->cParams == 1, "cParams %i\n", pFD->cParams);
2040 ok(pFD->lprgelemdescParam[0].tdesc.vt == VT_USERDEFINED,
2041 "vt 0x%x\n", pFD->lprgelemdescParam[0].tdesc.vt);
2042 href = pFD->lprgelemdescParam[0].tdesc.hreftype;
2043 ok((href & 0xff000000) == 0x04000000, "href 0x%08lx\n", href);
2044 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
2045 ok(hr == S_OK, "hr %08lx\n", hr);
2046 if (SUCCEEDED(hr)) ITypeInfo_Release(pTI_p);
2047 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
2048 ITypeInfo_Release(pTI);
2049
2050
2051 /* ItestIF2 is an interface which derives from IUnknown */
2052 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF2, &pTI);
2053 ok(hr == S_OK, "hr %08lx\n", hr);
2054
2055 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
2056 ok(hr == S_OK, "hr %08lx\n", hr);
2057 ok(pTA->typekind == TKIND_INTERFACE, "kind %04x\n", pTA->typekind);
2058 ok(pTA->cbSizeVft == 6 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
2059 ok(pTA->wTypeFlags == 0, "typeflags %x\n", pTA->wTypeFlags);
2060 ok(pTA->cFuncs == 1, "cfuncs %d\n", pTA->cFuncs);
2061 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
2062 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
2063
2064 /* Should have one method */
2065 hr = ITypeInfo_GetFuncDesc(pTI, 1, &pFD);
2066 ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08lx\n", hr);
2067 hr = ITypeInfo_GetFuncDesc(pTI, 0, &pFD);
2068 ok(hr == S_OK, "hr %08lx\n", hr);
2069 ok(pFD->memid == 0x60020000, "memid %08lx\n", pFD->memid);
2070 ok(pFD->oVft == 5 * sizeof(void *), "oVft %d\n", pFD->oVft);
2071 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
2072 ITypeInfo_Release(pTI);
2073
2074 /* ItestIF13 is dual with inherited dual ifaces */
2075 hr = ITypeLib_GetTypeInfoOfGuid(pTL, &IID_ItestIF13, &pTI);
2076 ok(hr == S_OK, "hr %08lx\n", hr);
2077
2078 hr = ITypeInfo_GetTypeAttr(pTI, &pTA);
2079 ok(hr == S_OK, "hr %08lx\n", hr);
2080 ok(pTA->typekind == TKIND_DISPATCH, "kind %04x\n", pTA->typekind);
2081 ok(pTA->cbSizeVft == 7 * sizeof(void *), "sizevft %d\n", pTA->cbSizeVft);
2082 ok(pTA->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "typeflags %x\n", pTA->wTypeFlags);
2083 ok(pTA->cFuncs == 10, "cfuncs %d\n", pTA->cFuncs);
2084 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
2085 ITypeInfo_ReleaseTypeAttr(pTI, pTA);
2086
2087 hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
2088 ok(hr == S_OK, "hr %08lx\n", hr);
2089 hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
2090 ok(hr == S_OK, "hr %08lx\n", hr);
2091 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
2092 ok(hr == S_OK, "got %08lx\n", hr);
2093 ok(IsEqualGUID(&pTA->guid, &IID_IDispatch), "guid %s\n", wine_dbgstr_guid(&pTA->guid));
2094 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
2095
2096 hr = ITypeInfo_GetFuncDesc(pTI, 9, &pFD);
2097 ok(hr == S_OK, "hr %08lx\n", hr);
2098 ok(pFD->memid == 0x1236, "memid %08lx\n", pFD->memid);
2099 ITypeInfo_ReleaseFuncDesc(pTI, pFD);
2100
2101 hr = ITypeInfo_GetRefTypeInfo(pTI, -2, &dual_ti);
2102 ok(hr == S_OK, "hr %08lx\n", hr);
2103
2104 hr = ITypeInfo_GetTypeAttr(dual_ti, &pTA);
2105 ok(hr == S_OK, "hr %08lx\n", hr);
2106 ok(pTA->typekind == TKIND_INTERFACE, "kind %04x\n", pTA->typekind);
2107 ok(pTA->cbSizeVft == sizeof(ItestIF13Vtbl), "sizevft %d\n", pTA->cbSizeVft);
2108 ok(pTA->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL), "typeflags %x\n", pTA->wTypeFlags);
2109 ok(pTA->cFuncs == 1, "cfuncs %d\n", pTA->cFuncs);
2110 ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
2111 ITypeInfo_ReleaseTypeAttr(dual_ti, pTA);
2112
2113 hr = ITypeInfo_GetRefTypeOfImplType(dual_ti, 0, &href);
2114 ok(hr == S_OK, "hr %08lx\n", hr);
2115 hr = ITypeInfo_GetRefTypeInfo(dual_ti, href, &pTI_p);
2116 ok(hr == S_OK, "hr %08lx\n", hr);
2117 hr = ITypeInfo_GetTypeAttr(pTI_p, &pTA);
2118 ok(hr == S_OK, "got %08lx\n", hr);
2119 ok(pTA->typekind == TKIND_INTERFACE, "kind %04x\n", pTA->typekind);
2120 ok(pTA->cbSizeVft == sizeof(ItestIF12Vtbl), "sizevft %d\n", pTA->cbSizeVft);
2121 ok(IsEqualGUID(&pTA->guid, &IID_ItestIF12), "guid %s\n", wine_dbgstr_guid(&pTA->guid));
2122 ITypeInfo_ReleaseTypeAttr(pTI_p, pTA);
2123 ITypeInfo_Release(pTI_p);
2124
2125 ITypeInfo_Release(dual_ti);
2126 ITypeInfo_Release(pTI);
2127
2128 ITypeLib_Release(pTL);
2129
2130 return;
2131}
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
GLuint pathA
Definition: glext.h:11719
#define FAILED(hr)
Definition: intsafe.h:51
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171

Referenced by START_TEST().

◆ test_invoke_func()

static void test_invoke_func ( ITypeInfo typeinfo)
static

Definition at line 846 of file typelib.c.

847{
848 DISPID named_args[3] = { DISPID_THIS };
849 VARIANT args[3], res;
850 DISPPARAMS dp = {args, named_args, 1, 0};
851 UINT i;
853
854 V_VT(args) = VT_INT;
855 V_INT(args) = 3;
856 V_VT(&res) = VT_ERROR;
857 hres = ITypeInfo_Invoke(typeinfo, &invoketest, 3, DISPATCH_METHOD, &dp, &res, NULL, &i);
858 ok(hres == S_OK, "got 0x%08lx\n", hres);
859 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
860 ok(V_I4(&res) == 4, "got %ld\n", V_I4(&res));
861
864 V_VT(args+1) = VT_INT;
865 V_INT(args+1) = 3;
866 V_VT(&res) = VT_ERROR;
867 dp.cNamedArgs = 1;
868 dp.cArgs = 2;
869 hres = ITypeInfo_Invoke(typeinfo, &invoketest, 3, DISPATCH_METHOD, &dp, &res, NULL, &i);
870 ok(hres == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hres);
871}
@ VT_DISPATCH
Definition: compat.h:2304
static IInvokeTest invoketest
Definition: typelib.c:342
static VARIANTARG static DISPID
Definition: ordinal.c:49
struct stdole::DISPPARAMS DISPPARAMS
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define DISPID_THIS
Definition: olectl.h:395
#define args
Definition: format.c:66
#define DISP_E_BADPARAMCOUNT
Definition: winerror.h:3626

Referenced by test_TypeInfo().

◆ test_LoadRegTypeLib()

static void test_LoadRegTypeLib ( void  )
static

Definition at line 7905 of file typelib.c.

7906{
7910 TLIBATTR *attr;
7911 HANDLE handle;
7912 ITypeLib *tl;
7913 HRESULT hr;
7914 BSTR path;
7915 BOOL ret;
7916
7917 create_manifest_file("testdep.manifest", manifest_dep);
7918 create_manifest_file("main.manifest", manifest_main);
7919
7920 handle = create_actctx("main.manifest");
7921 DeleteFileA("testdep.manifest");
7922 DeleteFileA("main.manifest");
7923
7924 /* create typelib file */
7925 write_typelib(1, L"test_actctx_tlb.tlb");
7926 write_typelib(3, L"test_actctx_tlb2.tlb");
7927
7928 hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &tl);
7929 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
7930
7932 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
7933
7934 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 0, LOCALE_NEUTRAL, &path);
7935 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
7936
7938 ok(ret, "ActivateActCtx failed: %lu\n", GetLastError());
7939
7940 path = NULL;
7941 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 0, LOCALE_NEUTRAL, &path);
7942 ok(hr == S_OK, "got 0x%08lx\n", hr);
7944
7945 path = NULL;
7946 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 0, lcid_en, &path);
7947 ok(hr == S_OK, "got 0x%08lx\n", hr);
7949
7950 path = NULL;
7951 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 0, lcid_ru, &path);
7952 ok(hr == S_OK, "got 0x%08lx\n", hr);
7954
7955 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 8, LOCALE_NEUTRAL, &path);
7956 ok(hr == TYPE_E_LIBNOTREGISTERED || broken(hr == S_OK) /* winxp */, "got 0x%08lx\n", hr);
7957
7958 path = NULL;
7959 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 2, 7, LOCALE_NEUTRAL, &path);
7960 ok(hr == S_OK, "got 0x%08lx\n", hr);
7962
7963 path = NULL;
7964 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &path);
7965 ok(hr == TYPE_E_LIBNOTREGISTERED || broken(hr == S_OK) /* winxp */, "got 0x%08lx\n", hr);
7967
7968 path = NULL;
7969 hr = QueryPathOfRegTypeLib(&LIBID_TestTypelib, 0xffff, 0xffff, LOCALE_NEUTRAL, &path);
7970 ok(hr == S_OK, "got 0x%08lx\n", hr);
7972
7973 /* manifest version is 2.0, actual is 1.0 */
7975 ok(hr == TYPE_E_LIBNOTREGISTERED || broken(hr == S_OK) /* winxp */, "got 0x%08lx\n", hr);
7976 if (hr == S_OK) ITypeLib_Release(tl);
7977
7979 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
7980
7981 /* manifest version is 2.7, actual is 2.5 */
7982 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 0, LOCALE_NEUTRAL, &tl);
7983 ok(hr == S_OK, "got 0x%08lx\n", hr);
7984 if (hr == S_OK) ITypeLib_Release(tl);
7985
7986 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 1, LOCALE_NEUTRAL, &tl);
7987 ok(hr == S_OK, "got 0x%08lx\n", hr);
7988 if (hr == S_OK) ITypeLib_Release(tl);
7989
7990 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 0, lcid_en, &tl);
7991 ok(hr == S_OK, "got 0x%08lx\n", hr);
7992 if (hr == S_OK) ITypeLib_Release(tl);
7993
7994 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 0, lcid_ru, &tl);
7995 ok(hr == S_OK, "got 0x%08lx\n", hr);
7996 if (hr == S_OK) ITypeLib_Release(tl);
7997
7998 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 7, LOCALE_NEUTRAL, &tl);
7999 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
8000
8001 hr = LoadRegTypeLib(&LIBID_TestTypelib, 2, 5, LOCALE_NEUTRAL, &tl);
8002 ok(hr == S_OK, "got 0x%08lx\n", hr);
8003
8004#ifdef __REACTOS__
8005 if (!is_reactos() && (GetNTVersion() == _WIN32_WINNT_WS08))
8006 {
8007 win_skip("Skipping parts that crash on Windows Server 2008 - Build 6003 SP2 - AMD64\n");
8008 }
8009 else
8010 {
8011#endif
8012 hr = ITypeLib_GetLibAttr(tl, &attr);
8013 ok(hr == S_OK, "got 0x%08lx\n", hr);
8014
8015 ok(attr->lcid == 0, "got %lx\n", attr->lcid);
8016 ok(attr->wMajorVerNum == 2, "got %d\n", attr->wMajorVerNum);
8017 ok(attr->wMinorVerNum == 5, "got %d\n", attr->wMinorVerNum);
8018 ok(attr->wLibFlags == LIBFLAG_FHASDISKIMAGE, "got %x\n", attr->wLibFlags);
8019
8020 ITypeLib_ReleaseTLibAttr(tl, attr);
8021 ITypeLib_Release(tl);
8022#ifdef __REACTOS__
8023 }
8024#endif
8025
8026 hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 7, LOCALE_NEUTRAL, &tl);
8027 ok(hr == TYPE_E_LIBNOTREGISTERED, "got 0x%08lx\n", hr);
8028
8029 tl = NULL;
8030 hr = LoadRegTypeLib(&LIBID_TestTypelib, 0xffff, 0xffff, LOCALE_NEUTRAL, &tl);
8031 ok(hr == S_OK, "got 0x%08lx\n", hr);
8032
8033 if (tl)
8034 {
8035 hr = ITypeLib_GetLibAttr(tl, &attr);
8036 ok(hr == S_OK, "got 0x%08lx\n", hr);
8037
8038 ok(attr->lcid == 0, "got %lx\n", attr->lcid);
8039 ok(attr->wMajorVerNum == 2, "got %d\n", attr->wMajorVerNum);
8040 ok(attr->wMinorVerNum == 5, "got %d\n", attr->wMinorVerNum);
8041 ok(attr->wLibFlags == LIBFLAG_FHASDISKIMAGE, "got %x\n", attr->wLibFlags);
8042
8043 ITypeLib_ReleaseTLibAttr(tl, attr);
8044 ITypeLib_Release(tl);
8045 }
8046
8047 DeleteFileA("test_actctx_tlb.tlb");
8048 DeleteFileA("test_actctx_tlb2.tlb");
8049
8051 ok(ret, "DeactivateActCtx failed: %lu\n", GetLastError());
8052
8054}
#define GetNTVersion()
Definition: apitest.h:17
VOID WINAPI ReleaseActCtx(IN HANDLE hActCtx)
Definition: actctx.c:208
BOOL WINAPI DeactivateActCtx(IN DWORD dwFlags, IN ULONG_PTR ulCookie)
Definition: actctx.c:268
BOOL WINAPI ActivateActCtx(IN HANDLE hActCtx, OUT PULONG_PTR ulCookie)
Definition: actctx.c:237
HRESULT WINAPI LoadRegTypeLib(REFGUID rguid, WORD wVerMajor, WORD wVerMinor, LCID lcid, ITypeLib **ppTLib)
Definition: typelib.c:531
HRESULT WINAPI QueryPathOfRegTypeLib(REFGUID guid, WORD wMaj, WORD wMin, LCID lcid, LPBSTR path)
Definition: typelib.c:406
static const GUID LIBID_register_test
Definition: custom.c:2016
static const char manifest_dep[]
Definition: typelib.c:7880
static void create_manifest_file(const char *filename, const char *manifest)
Definition: typelib.c:7840
static HANDLE create_actctx(const char *file)
Definition: typelib.c:7852
static const char manifest_main[]
Definition: typelib.c:7895
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_NEUTRAL
Definition: nls.h:167
#define LANG_RUSSIAN
Definition: nls.h:113
DWORD LCID
Definition: nls.h:13
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
#define _WIN32_WINNT_WS08
Definition: sdkddkver.h:26
Definition: cookie.c:34
#define TYPE_E_LIBNOTREGISTERED
Definition: winerror.h:3637

Referenced by START_TEST().

◆ test_LoadTypeLib()

static void test_LoadTypeLib ( void  )
static

Definition at line 7326 of file typelib.c.

7327{
7328 ITypeLib *tl;
7329 HRESULT hres;
7330
7331 static const WCHAR kernel32_dllW[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0};
7332
7333 hres = LoadTypeLib(kernel32_dllW, &tl);
7334 ok(hres == TYPE_E_CANTLOADLIBRARY, "LoadTypeLib returned: %08lx, expected TYPE_E_CANTLOADLIBRARY\n", hres);
7335
7337 ok(hres == E_INVALIDARG, "Got %#lx.\n", hres);
7338
7339 tl = (void *)0xdeadbeef;
7340 hres = LoadTypeLib(NULL, &tl);
7341 ok(hres == E_INVALIDARG, "Got %#lx.\n", hres);
7342 ok(tl == (void *)0xdeadbeef, "Got %p.\n", tl);
7343
7345 ok(hres == E_INVALIDARG, "Got %#lx.\n", hres);
7346
7347 tl = (void *)0xdeadbeef;
7349 ok(hres == E_INVALIDARG, "Got %#lx.\n", hres);
7350 ok(tl == (void *)0xdeadbeef, "Got %p.\n", tl);
7351}

Referenced by START_TEST().

◆ test_QueryPathOfRegTypeLib()

static void test_QueryPathOfRegTypeLib ( DWORD  arch)
static

Definition at line 1769 of file typelib.c.

1770{
1771 static const struct test_data
1772 {
1773 WORD maj, min;
1774 HRESULT ret;
1775 const WCHAR path[16];
1776 } td[] = {
1777 { 1, 0, TYPE_E_LIBNOTREGISTERED, { 0 } },
1778 { 3, 0, S_OK, {'f','a','k','e','_','3','_','0','.','d','l','l',0 } },
1779 { 3, 1, S_OK, {'f','a','k','e','_','3','_','1','.','d','l','l',0 } },
1780 { 3, 22, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
1781 { 3, 37, S_OK, {'f','a','k','e','_','3','_','3','7','.','d','l','l',0 } },
1782 { 3, 40, TYPE_E_LIBNOTREGISTERED, { 0 } },
1783 { 0xffff, 0xffff, S_OK, {'f','a','k','e','_','5','_','3','7','.','d','l','l',0 } },
1784 { 0xffff, 0, TYPE_E_LIBNOTREGISTERED, { 0 } },
1785 { 3, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } },
1786 { 5, 0xffff, TYPE_E_LIBNOTREGISTERED, { 0 } },
1787 { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } }
1788 };
1789 static const WCHAR base[] = {'f','a','k','e',0};
1790 static const WCHAR wrongW[] = {'w','r','o','n','g',0};
1791 UINT i;
1793 GUID uid;
1794 WCHAR uid_str[40];
1795 HRESULT ret;
1796 BSTR path;
1797
1798 status = UuidCreate(&uid);
1799 ok(!status || status == RPC_S_UUID_LOCAL_ONLY, "UuidCreate error %08lx\n", status);
1800
1801 StringFromGUID2(&uid, uid_str, 40);
1802 /*trace("GUID: %s\n", wine_dbgstr_w(uid_str));*/
1803
1804 if (!do_typelib_reg_key(&uid, 3, 0, arch, base, FALSE)) return;
1805 if (!do_typelib_reg_key(&uid, 3, 1, arch, base, FALSE)) return;
1806 if (!do_typelib_reg_key(&uid, 3, 37, arch, base, FALSE)) return;
1807 if (!do_typelib_reg_key(&uid, 5, 37, arch, base, FALSE)) return;
1808 if (!do_typelib_reg_key(&uid, 5, 37, (arch == 32) ? 64 : 32, wrongW, FALSE)) return;
1809
1810 for (i = 0; i < ARRAY_SIZE(td); i++)
1811 {
1812 winetest_push_context( "win%lu: %u", arch, i );
1813 ret = QueryPathOfRegTypeLib(&uid, td[i].maj, td[i].min, LOCALE_NEUTRAL, &path);
1814 ok(ret == td[i].ret || (ret == TYPE_E_LIBNOTREGISTERED && arch == 64 && !is_win64 && !is_wow64),
1815 "QueryPathOfRegTypeLib(%u.%u) returned %08lx\n", td[i].maj, td[i].min, ret);
1816 if (ret == S_OK)
1817 {
1818 if (i == 6 && arch == (is_win64 ? 32 : 64))
1819 ok( !lstrcmpW( path, L"wrong_5_37.dll" ), "typelib %u.%u path doesn't match: %s\n",
1820 td[i].maj, td[i].min, debugstr_w(path));
1821 else
1822 ok(!lstrcmpW(td[i].path, path), "typelib %u.%u path doesn't match: %s\n",
1823 td[i].maj, td[i].min, debugstr_w(path));
1825 }
1827 }
1828
1829 do_typelib_reg_key(&uid, 0, 0, arch, NULL, TRUE);
1830}
unsigned short WORD
Definition: ntddk_ex.h:93
#define debugstr_w
Definition: kernel32.h:32
char * uid_str
Definition: mkisofs.c:193
static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, DWORD arch, LPCWSTR base, BOOL remove)
Definition: typelib.c:1722
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:330
long RPC_STATUS
Definition: rpc.h:48
Definition: ps.c:97
#define RPC_S_UUID_LOCAL_ONLY
Definition: winerror.h:1488

Referenced by START_TEST().

◆ test_register_typelib()

static void test_register_typelib ( BOOL  system_registration)
static

Definition at line 6914 of file typelib.c.

6915{
6916 HRESULT hr;
6917 WCHAR *filename;
6919 WCHAR uuidW[40];
6920 char key_name[MAX_PATH], uuid[40];
6921 LONG ret, expect_ret;
6922 UINT count, i;
6923 HKEY hkey;
6924 REGSAM opposite = (sizeof(void*) == 8 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
6926 LONG size;
6927 struct
6928 {
6929 TYPEKIND kind;
6930 WORD flags;
6931 } attrs[] =
6932 {
6933 { TKIND_INTERFACE, 0 },
6934 { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
6935 { TKIND_INTERFACE, TYPEFLAG_FOLEAUTOMATION },
6936 { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FOLEAUTOMATION },
6937 { TKIND_DISPATCH, TYPEFLAG_FDUAL },
6938 { TKIND_DISPATCH, TYPEFLAG_FDUAL },
6939 { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL },
6940 { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL },
6941 { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
6942 { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
6943 { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
6944 { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
6945 { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
6946 { TKIND_RECORD, 0 },
6947 { TKIND_MODULE, 0 },
6948 };
6949
6950 if (!system_registration && (!pRegisterTypeLibForUser || !pUnRegisterTypeLibForUser))
6951 {
6952 win_skip("User typelib registration functions are not available\n");
6953 return;
6954 }
6955 winetest_push_context( "%s", system_registration ? "system" : "user" );
6956
6957 if (pIsWow64Process)
6958 pIsWow64Process(GetCurrentProcess(), &is_wow64);
6959
6961
6963 ok(hr == S_OK, "got %08lx\n", hr);
6964
6965 if (system_registration)
6967 else
6968 hr = pRegisterTypeLibForUser(typelib, filename, NULL);
6970 {
6971 win_skip("Insufficient privileges to register typelib in the registry\n");
6972 ITypeLib_Release(typelib);
6975 return;
6976 }
6977 ok(hr == S_OK, "got %08lx\n", hr);
6978
6979 count = ITypeLib_GetTypeInfoCount(typelib);
6980 ok(count == 15, "got %d\n", count);
6981
6982 for(i = 0; i < count; i++)
6983 {
6985 TYPEATTR *attr;
6986
6987 hr = ITypeLib_GetTypeInfo(typelib, i, &typeinfo);
6988 ok(hr == S_OK, "got %08lx\n", hr);
6989
6990 hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
6991 ok(hr == S_OK, "got %08lx\n", hr);
6992
6993 ok(attr->typekind == attrs[i].kind, "%d: got kind %d\n", i, attr->typekind);
6994 ok(attr->wTypeFlags == attrs[i].flags, "%d: got flags %04x\n", i, attr->wTypeFlags);
6995
6996 if(attr->typekind == TKIND_DISPATCH && (attr->wTypeFlags & TYPEFLAG_FDUAL))
6997 {
6998 HREFTYPE reftype;
6999 ITypeInfo *dual_info;
7000 TYPEATTR *dual_attr;
7001
7002 hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &reftype);
7003 ok(hr == S_OK, "got %08lx\n", hr);
7004
7005 hr = ITypeInfo_GetRefTypeInfo(typeinfo, reftype, &dual_info);
7006 ok(hr == S_OK, "got %08lx\n", hr);
7007
7008 hr = ITypeInfo_GetTypeAttr(dual_info, &dual_attr);
7009 ok(hr == S_OK, "got %08lx\n", hr);
7010
7011 ok(dual_attr->typekind == TKIND_INTERFACE, "%d: got kind %d\n", i, dual_attr->typekind);
7012 ok(dual_attr->wTypeFlags == (attrs[i].flags | TYPEFLAG_FOLEAUTOMATION),
7013 "%d: got flags %04x\n", i, dual_attr->wTypeFlags);
7014
7015 ITypeInfo_ReleaseTypeAttr(dual_info, dual_attr);
7016 ITypeInfo_Release(dual_info);
7017
7018 }
7019
7020 StringFromGUID2(&attr->guid, uuidW, ARRAY_SIZE(uuidW));
7021 WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
7022 sprintf(key_name, "Interface\\%s", uuid);
7023
7024 /* All dispinterfaces will be registered (this includes dual interfaces) as well
7025 as oleautomation interfaces */
7026 if((attr->typekind == TKIND_INTERFACE && (attr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
7027 attr->typekind == TKIND_DISPATCH)
7028 expect_ret = ERROR_SUCCESS;
7029 else
7030 expect_ret = ERROR_FILE_NOT_FOUND;
7031
7033 ok(ret == expect_ret, "%d: got %ld\n", i, ret);
7034 if (ret == ERROR_SUCCESS)
7035 {
7036 size = sizeof(uuid);
7037 ret = RegQueryValueA(hkey, "ProxyStubClsid32", uuid, &size);
7038 ok(!ret, "Failed to get proxy GUID, error %lu.\n", ret);
7039
7040 if (attrs[i].kind == TKIND_INTERFACE || (attrs[i].flags & TYPEFLAG_FDUAL))
7041 {
7042 ok(!strcasecmp(uuid, "{00020424-0000-0000-c000-000000000046}"),
7043 "Got unexpected proxy CLSID %s.\n", uuid);
7044 }
7045 else
7046 {
7047 ok(!strcasecmp(uuid, "{00020420-0000-0000-c000-000000000046}"),
7048 "Got unexpected proxy CLSID %s.\n", uuid);
7049 }
7050
7051 RegCloseKey(hkey);
7052 }
7053
7054
7055 /* 32-bit typelibs should be registered into both registry bit modes */
7056 if (is_win64 || is_wow64)
7057 {
7058 ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
7059 ok(ret == expect_ret, "%d: got %ld\n", i, ret);
7060 if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
7061 }
7062
7063 ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
7064 ITypeInfo_Release(typeinfo);
7065 }
7066
7067 if (system_registration)
7069 else
7070 hr = pUnRegisterTypeLibForUser(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, is_win64 ? SYS_WIN64 : SYS_WIN32);
7071 ok(hr == S_OK, "got %08lx\n", hr);
7072
7073 for(i = 0; i < count; i++)
7074 {
7076 TYPEATTR *attr;
7077
7078 hr = ITypeLib_GetTypeInfo(typelib, i, &typeinfo);
7079 ok(hr == S_OK, "got %08lx\n", hr);
7080
7081 hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
7082 ok(hr == S_OK, "got %08lx\n", hr);
7083
7084 if((attr->typekind == TKIND_INTERFACE && (attr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
7085 attr->typekind == TKIND_DISPATCH)
7086 {
7087 StringFromGUID2(&attr->guid, uuidW, ARRAY_SIZE(uuidW));
7088 WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
7089 sprintf(key_name, "Interface\\%s", uuid);
7090
7092 ok(ret == ERROR_FILE_NOT_FOUND, "Interface registry remains in %s (%d)\n", key_name, i);
7093 if (is_win64 || is_wow64)
7094 {
7095 ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
7096 ok(ret == ERROR_FILE_NOT_FOUND, "Interface registry remains in %s (%d)\n", key_name, i);
7097 }
7098 }
7099 ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
7100 ITypeInfo_Release(typeinfo);
7101 }
7102
7103 ITypeLib_Release(typelib);
7106}
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LSTATUS WINAPI RegQueryValueA(HKEY hkey, LPCSTR name, LPSTR data, LPLONG count)
Definition: reg.c:4212
HRESULT WINAPI RegisterTypeLib(ITypeLib *ptlib, const WCHAR *szFullPath, const WCHAR *szHelpDir)
Definition: typelib.c:656
HRESULT WINAPI UnRegisterTypeLib(REFGUID libid, WORD wVerMajor, WORD wVerMinor, LCID lcid, SYSKIND syskind)
Definition: typelib.c:882
#define strcasecmp
Definition: fake.h:9
GLuint GLuint GLsizei count
Definition: gl.h:1545
Definition: msctf.idl:532
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define sprintf
Definition: sprintf.c:45
@ TKIND_MODULE
Definition: widltypes.h:236
@ TKIND_RECORD
Definition: widltypes.h:235
#define TYPE_E_REGISTRYACCESS
Definition: winerror.h:3636
ACCESS_MASK REGSAM
Definition: winreg.h:76

◆ test_register_typelib_64()

static void test_register_typelib_64 ( void  )
static

Definition at line 7108 of file typelib.c.

7109{
7110 REGSAM opposite = (sizeof(void*) == 8 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY);
7111 ICreateTypeInfo *createti, *createti_co;
7112 ELEMDESC elemdesc[5], elemdesc2[5];
7113 FUNCDESC funcdesc, funcdesc2;
7114 ITypeInfo *unknown, *tinfo;
7116 ICreateTypeLib2 *createtl;
7119 HREFTYPE hreftype;
7120 HRESULT hr;
7121
7122 static const WCHAR wszStdOle2[] = { 's','t','d','o','l','e','2','.','t','l','b',0 };
7123
7124 static OLECHAR typelibW[] = { 'W','i','n','e','T','e','s','t','T','y','p','e','L','i','b',0};
7125 static OLECHAR helpfileW[] = { 'C',':','\\','b','o','g','u','s','.','h','l','p',0 };
7126 static OLECHAR dllfileW[] = { 'C',':','\\','b','o','g','u','s','.','d','l','l',0 };
7127 static OLECHAR interface1W[] = { 'I','T','e','s','t','W','i','n','e','6', '4', 0};
7128 static OLECHAR coclassW[] = {'W','i','n','e','T','e','s','t','C','o','c','l','a','s','s',0 };
7129 static OLECHAR func1W[] = { 'f','u','n','c','1',0 };
7130 static OLECHAR func2W[] = { 'f','u','n','c','2',0 };
7131 static OLECHAR param1W[] = { 'p','a','r','a','m','1',0 };
7132 static OLECHAR param2W[] = { 'p','a','r','a','m','2',0 };
7133 static OLECHAR *names1[] = { func1W, param1W, param2W };
7134 static OLECHAR *names2[] = { func2W, param1W };
7135 static const GUID tlcustguid = { 0x512d2fec,0xcaf6,0x4c33,{0xbc,0x38,0x84,0x2f,0x2e,0x37,0x0d,0x7b} };
7136 static const GUID coclassguid = { 0x317cd4dd,0x0ce0,0x4525,{0x8d,0x33,0x68,0x14,0x4c,0x53,0x60,0xe9} };
7137 static const GUID interfaceguid = { 0x35cc5cea,0x11cc,0x4bca,{0x89,0x8c,0xf8,0x92,0x8e,0xb8,0xda,0x24} };
7138
7139 static const SYSKIND sys = SYS_WIN64;
7140
7141 if (pIsWow64Process)
7142 pIsWow64Process(GetCurrentProcess(), &is_wow64);
7143
7145 ok(hr == S_OK, "got %08lx\n", hr);
7146
7147 hr = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &unknown);
7148 ok(hr == S_OK, "got %08lx\n", hr);
7149
7150 GetTempFileNameW(L".", L"tlb", 0, filename);
7151
7152 hr = CreateTypeLib2(sys, filename, &createtl);
7153 ok(hr == S_OK, "got %08lx\n", hr);
7154
7155 hr = ICreateTypeLib2_SetName(createtl, typelibW);
7156 ok(hr == S_OK, "got %08lx\n", hr);
7157
7158 hr = ICreateTypeLib2_SetHelpFileName(createtl, helpfileW);
7159 ok(hr == S_OK, "got %08lx\n", hr);
7160
7161 hr = ICreateTypeLib2_SetHelpStringDll(createtl, dllfileW);
7162 ok(hr == S_OK, "got %08lx\n", hr);
7163
7164 hr = ICreateTypeLib2_SetGuid(createtl, &tlcustguid);
7165 ok(hr == S_OK, "got %08lx\n", hr);
7166
7167 hr = ICreateTypeLib2_SetVersion(createtl, 1, 0);
7168 ok(hr == S_OK, "got %08lx\n", hr);
7169
7170 hr = ICreateTypeLib2_CreateTypeInfo(createtl, coclassW, TKIND_COCLASS, &createti_co);
7171 ok(hr == S_OK, "got %08lx\n", hr);
7172
7173 hr = ICreateTypeLib2_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
7174 ok(hr == S_OK, "got %08lx\n", hr);
7175
7176 hr = ICreateTypeInfo_LayOut(createti);
7177 ok(hr == S_OK, "got %08lx\n", hr);
7178
7179 hr = ICreateTypeInfo_SetGuid(createti, &interfaceguid);
7180 ok(hr == S_OK, "got %08lx\n", hr);
7181
7182 hr = ICreateTypeInfo_SetVersion(createti, 1, 0);
7183 ok(hr == S_OK, "got %08lx\n", hr);
7184
7185 hr = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
7186 ok(hr == S_OK, "got %08lx\n", hr);
7187
7188 hr = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
7189 ok(hr == S_OK, "got %08lx\n", hr);
7190
7191 elemdesc[0].tdesc.vt = VT_UINT;
7192 elemdesc[0].idldesc.dwReserved = 0;
7193 elemdesc[0].idldesc.wIDLFlags = IDLFLAG_FIN;
7194
7195 elemdesc[1].tdesc.vt = VT_DECIMAL;
7196 elemdesc[1].idldesc.dwReserved = 0;
7197 elemdesc[1].idldesc.wIDLFlags = IDLFLAG_FIN;
7198
7199 memset(&funcdesc, 0, sizeof(FUNCDESC));
7200 funcdesc.funckind = FUNC_PUREVIRTUAL;
7201 funcdesc.invkind = INVOKE_FUNC;
7202 funcdesc.callconv = CC_STDCALL;
7203 funcdesc.cParams = 2;
7204 funcdesc.memid = 0x1;
7205 funcdesc.elemdescFunc.tdesc.vt = VT_HRESULT;
7206 funcdesc.lprgelemdescParam = elemdesc;
7207
7208 hr = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
7209 ok(hr == S_OK, "got %08lx\n", hr);
7210
7211 elemdesc2[0].tdesc.vt = VT_UINT;
7212 elemdesc2[0].idldesc.dwReserved = 0;
7213 elemdesc2[0].idldesc.wIDLFlags = IDLFLAG_FIN | IDLFLAG_FOUT;
7214
7215 memset(&funcdesc2, 0, sizeof(FUNCDESC));
7216 funcdesc2.funckind = FUNC_PUREVIRTUAL;
7217 funcdesc2.invkind = INVOKE_FUNC;
7218 funcdesc.callconv = CC_STDCALL;
7219 funcdesc2.cParams = 1;
7220 funcdesc2.memid = 0x2;
7221 funcdesc2.elemdescFunc.tdesc.vt = VT_HRESULT;
7222 funcdesc2.lprgelemdescParam = elemdesc2;
7223
7224 hr = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc2);
7225 ok(hr == S_OK, "got %08lx\n", hr);
7226
7227 hr = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
7228 ok(hr == S_OK, "got %08lx\n", hr);
7229
7230 hr = ICreateTypeInfo_SetFuncHelpContext(createti, 1, 0xabcdefab);
7231 ok(hr == S_OK, "got %08lx\n", hr);
7232
7233 hr = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 3);
7234 ok(hr == S_OK, "got %08lx\n", hr);
7235
7236 hr = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, names2, 2);
7237 ok(hr == S_OK, "got %08lx\n", hr);
7238
7239 hr = ICreateTypeInfo_SetTypeFlags(createti, TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FNONEXTENSIBLE | TYPEFLAG_FDUAL);
7240 ok(hr == S_OK, "got %08lx\n", hr);
7241
7242 hr = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&tinfo);
7243 ok(hr == S_OK, "got %08lx\n", hr);
7244
7245 hr = ITypeInfo_GetRefTypeOfImplType(tinfo, 0, &hreftype);
7246 ok(hr == S_OK, "got %08lx\n", hr);
7247
7248 hr = ICreateTypeInfo_SetGuid(createti_co, &coclassguid);
7249 ok(hr == S_OK, "got %08lx\n", hr);
7250
7251 hr = ICreateTypeInfo_AddRefTypeInfo(createti_co, tinfo, &hreftype);
7252 ok(hr == S_OK, "got %08lx\n", hr);
7253
7254 hr = ICreateTypeInfo_AddImplType(createti_co, 0, hreftype);
7255 ok(hr == S_OK, "got %08lx\n", hr);
7256
7257 hr = ICreateTypeInfo_SetImplTypeFlags(createti_co, 0, IMPLTYPEFLAG_FDEFAULT);
7258 ok(hr == S_OK, "got %08lx\n", hr);
7259
7260 hr = ICreateTypeInfo_Release(createti_co);
7261 ok(hr == S_OK, "got %08lx\n", hr);
7262
7263 ICreateTypeInfo_Release(createti);
7264
7265 hr = ICreateTypeLib2_SaveAllChanges(createtl);
7266 ok(hr == S_OK, "got %08lx\n", hr);
7267
7268 ICreateTypeLib2_Release(createtl);
7269
7270 trace("TypeLib to load: %ls\n", filename);
7272 ok(hr == S_OK, "got: %08lx\n", hr);
7273
7274 if(typelib)
7275 {
7277 OLECHAR tlb_name[16];
7278 HKEY hkey;
7279 LONG size;
7280
7283 {
7284 win_skip("Insufficient privileges to register typelib in the registry\n");
7285 ITypeLib_Release(typelib);
7287 return;
7288 }
7289 ok(hr == S_OK, "got: %08lx\n", hr);
7290
7291 ITypeLib_Release(typelib);
7292
7293 StringFromGUID2(&tlcustguid, uuid, ARRAY_SIZE(uuid));
7294 swprintf(key_name, sizeof(key_name), L"TypeLib\\%ls\\1.0", uuid);
7295
7297 ok(hr == S_OK, "got %08lx\n", hr);
7298
7299 size = sizeof(tlb_name);
7300 hr = RegQueryValueW(hkey, L"", tlb_name, &size);
7301 ok(hr == S_OK, "got %08lx\n", hr);
7302
7303 /* The typelib should be registered in WoW64_32 and WoW64_64 mode */
7304 if(is_win64 || is_wow64)
7305 {
7306 hr = RegOpenKeyExW(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ | opposite, &hkey);
7307 ok(hr == S_OK, "got %08lx\n", hr);
7308
7309 if(hkey)
7310 {
7311 size = sizeof(tlb_name);
7312 hr = RegQueryValueW(hkey, L"", tlb_name, &size);
7313 ok(hr == S_OK, "got %08lx\n", hr);
7314
7315 RegCloseKey(hkey);
7316 }
7317 }
7318
7319 ok(!wcscmp(tlb_name, typelibW),
7320 "Got unexpected TypLib description: %ls\n", tlb_name);
7321 }
7322
7324}
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
#define swprintf
Definition: precomp.h:40

Referenced by START_TEST().

◆ test_SetDocString()

static void test_SetDocString ( void  )
static

Definition at line 7572 of file typelib.c.

7573{
7574 static OLECHAR nameW[] = {'n','a','m','e',0};
7575 static OLECHAR name2W[] = {'n','a','m','e','2',0};
7576 static OLECHAR doc1W[] = {'d','o','c','1',0};
7577 static OLECHAR doc2W[] = {'d','o','c','2',0};
7578 static OLECHAR var_nameW[] = {'v','a','r','n','a','m','e',0};
7581 ICreateTypeLib2 *ctl;
7582 ICreateTypeInfo *cti;
7583 ITypeLib *tl;
7584 ITypeInfo *ti;
7585 BSTR namestr, docstr;
7586 VARDESC desc, *pdesc;
7587 FUNCDESC funcdesc, *pfuncdesc;
7588 HRESULT hr;
7589 VARIANT v;
7590
7591 GetTempFileNameA(".", "tlb", 0, filenameA);
7593
7595 ok(hr == S_OK, "got %08lx\n", hr);
7596
7597 hr = ICreateTypeLib2_CreateTypeInfo(ctl, nameW, TKIND_ENUM, &cti);
7598 ok(hr == S_OK, "got %08lx\n", hr);
7599
7600 hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc1W);
7601 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7602
7603 hr = ICreateTypeInfo_SetVarDocString(cti, 0, NULL);
7604 ok(hr == E_INVALIDARG, "got %08lx\n", hr);
7605
7606 memset(&desc, 0, sizeof(desc));
7607 desc.memid = MEMBERID_NIL;
7608 desc.elemdescVar.tdesc.vt = VT_INT;
7609 desc.varkind = VAR_CONST;
7610
7611 V_VT(&v) = VT_INT;
7612 V_INT(&v) = 1;
7613 desc.lpvarValue = &v;
7614 hr = ICreateTypeInfo_AddVarDesc(cti, 0, &desc);
7615 ok(hr == S_OK, "got %08lx\n", hr);
7616
7617 hr = ICreateTypeInfo_SetVarName(cti, 0, NULL);
7618 ok(hr == E_INVALIDARG, "got %08lx\n", hr);
7619
7620 hr = ICreateTypeInfo_SetVarName(cti, 1, var_nameW);
7621 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7622
7623 hr = ICreateTypeInfo_SetVarName(cti, 0, var_nameW);
7624 ok(hr == S_OK, "got %08lx\n", hr);
7625
7626 hr = ICreateTypeInfo_SetVarDocString(cti, 0, NULL);
7627 ok(hr == E_INVALIDARG, "got %08lx\n", hr);
7628
7629 hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc1W);
7630 ok(hr == S_OK, "got %08lx\n", hr);
7631
7632 /* already set */
7633 hr = ICreateTypeInfo_SetVarDocString(cti, 0, doc2W);
7634 ok(hr == S_OK, "got %08lx\n", hr);
7635
7636 /* wrong index now */
7637 hr = ICreateTypeInfo_SetVarDocString(cti, 1, doc1W);
7638 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7639
7640 ICreateTypeInfo_Release(cti);
7641
7642 hr = ICreateTypeLib2_CreateTypeInfo(ctl, name2W, TKIND_INTERFACE, &cti);
7643 ok(hr == S_OK, "got %08lx\n", hr);
7644
7645 hr = ICreateTypeInfo_SetFuncDocString(cti, 0, doc1W);
7646 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7647
7648 hr = ICreateTypeInfo_SetFuncDocString(cti, 0, NULL);
7649 ok(hr == E_INVALIDARG, "got %08lx\n", hr);
7650
7651 memset(&funcdesc, 0, sizeof(funcdesc));
7652 funcdesc.memid = MEMBERID_NIL;
7653 funcdesc.funckind = FUNC_PUREVIRTUAL;
7654 funcdesc.invkind = INVOKE_FUNC;
7655 funcdesc.callconv = CC_STDCALL;
7656
7657 hr = ICreateTypeInfo_AddFuncDesc(cti, 0, &funcdesc);
7658 ok(hr == S_OK, "got %08lx\n", hr);
7659
7660 hr = ICreateTypeInfo_SetFuncDocString(cti, 0, doc1W);
7661 ok(hr == S_OK, "got %08lx\n", hr);
7662
7663 ICreateTypeInfo_Release(cti);
7664
7665 hr = ICreateTypeLib2_SaveAllChanges(ctl);
7666 ok(hr == S_OK, "got: %08lx\n", hr);
7667
7668 ICreateTypeLib2_Release(ctl);
7669
7670 hr = LoadTypeLib(filenameW, &tl);
7671 ok(hr == S_OK, "got: %08lx\n", hr);
7672
7673 hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
7674 ok(hr == S_OK, "got %08lx\n", hr);
7675
7676 hr = ITypeInfo_GetVarDesc(ti, 0, &pdesc);
7677 ok(hr == S_OK, "got %08lx\n", hr);
7678 ok(pdesc->memid == 0x40000000, "got wrong memid: %lx\n", pdesc->memid);
7679 ok(pdesc->elemdescVar.tdesc.vt == VT_INT, "got wrong vardesc type: %u\n", pdesc->elemdescVar.tdesc.vt);
7680 ok(pdesc->varkind == VAR_CONST, "got wrong varkind: %u\n", pdesc->varkind);
7681 ok(V_VT(pdesc->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(pdesc->lpvarValue));
7682 ok(V_INT(pdesc->lpvarValue) == 1, "got wrong value: 0x%x\n", V_INT(pdesc->lpvarValue));
7683
7684 hr = ITypeInfo_GetDocumentation(ti, pdesc->memid, &namestr, &docstr, NULL, NULL);
7685 ok(hr == S_OK, "got %08lx\n", hr);
7686 ok(memcmp(namestr, var_nameW, sizeof(var_nameW)) == 0, "got wrong name: %s\n", wine_dbgstr_w(namestr));
7687 ok(memcmp(docstr, doc2W, sizeof(doc2W)) == 0, "got wrong docstring: %s\n", wine_dbgstr_w(docstr));
7688
7689 SysFreeString(namestr);
7691
7692 ITypeInfo_ReleaseVarDesc(ti, pdesc);
7693 ITypeInfo_Release(ti);
7694
7695 hr = ITypeLib_GetTypeInfo(tl, 1, &ti);
7696 ok(hr == S_OK, "got %08lx\n", hr);
7697
7698 hr = ITypeInfo_GetFuncDesc(ti, 0, &pfuncdesc);
7699 ok(hr == S_OK, "got %08lx\n", hr);
7700 ok(pfuncdesc->memid == 0x60000000, "got wrong memid: %lx\n", pfuncdesc->memid);
7701 ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got wrong funckind: %x\n", pfuncdesc->funckind);
7702 ok(pfuncdesc->invkind == INVOKE_FUNC, "got wrong invkind: %x\n", pfuncdesc->invkind);
7703 ok(pfuncdesc->callconv == CC_STDCALL, "got wrong callconv: %x\n", pfuncdesc->callconv);
7704
7705 hr = ITypeInfo_GetDocumentation(ti, pfuncdesc->memid, &namestr, &docstr, NULL, NULL);
7706 ok(hr == S_OK, "got %08lx\n", hr);
7707 ok(namestr == NULL, "got wrong name: %s\n", wine_dbgstr_w(namestr));
7708 ok(memcmp(docstr, doc1W, sizeof(doc1W)) == 0, "got wrong docstring: %s\n", wine_dbgstr_w(docstr));
7709
7711
7712 ITypeInfo_ReleaseFuncDesc(ti, pfuncdesc);
7713 ITypeInfo_Release(ti);
7714
7715 ITypeLib_Release(tl);
7716
7718}
const char * docstr(char *str, int *no_help) const
Definition: mkisofs.c:1763
static CHAR filenameA[MAX_PATH]
Definition: storage32.c:35
@ TKIND_ENUM
Definition: widltypes.h:234

Referenced by START_TEST().

◆ test_SetFuncAndParamNames()

static void test_SetFuncAndParamNames ( void  )
static

Definition at line 7433 of file typelib.c.

7434{
7435 static OLECHAR nameW[] = {'n','a','m','e',0};
7436 static OLECHAR name2W[] = {'n','a','m','e','2',0};
7437 static OLECHAR prop[] = {'p','r','o','p',0};
7438 static OLECHAR *propW[] = {prop};
7439 static OLECHAR func[] = {'f','u','n','c',0};
7440 static OLECHAR *funcW[] = {func, NULL};
7443 ICreateTypeLib2 *ctl;
7444 ICreateTypeInfo *cti;
7445 ITypeLib *tl;
7446 ITypeInfo *infos[3];
7447 MEMBERID memids[3];
7448 FUNCDESC funcdesc;
7449 ELEMDESC edesc;
7450 HRESULT hr;
7451 USHORT found;
7452
7453 GetTempFileNameA(".", "tlb", 0, filenameA);
7455
7457 ok(hr == S_OK, "got %08lx\n", hr);
7458
7459 hr = ICreateTypeLib2_CreateTypeInfo(ctl, nameW, TKIND_DISPATCH, &cti);
7460 ok(hr == S_OK, "got %08lx\n", hr);
7461
7462 /* get method */
7463 memset(&funcdesc, 0, sizeof(FUNCDESC));
7464 funcdesc.funckind = FUNC_DISPATCH;
7465 funcdesc.callconv = CC_STDCALL;
7466 funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
7467 funcdesc.wFuncFlags = FUNCFLAG_FBINDABLE;
7468
7469 /* put method */
7470 memset(&edesc, 0, sizeof(edesc));
7471 edesc.tdesc.vt = VT_BSTR;
7472 edesc.idldesc.dwReserved = 0;
7473 edesc.idldesc.wIDLFlags = IDLFLAG_FIN;
7474
7475 funcdesc.lprgelemdescParam = &edesc;
7476 funcdesc.invkind = INVOKE_PROPERTYPUT;
7477 funcdesc.cParams = 1;
7478
7479 hr = ICreateTypeInfo_AddFuncDesc(cti, 0, &funcdesc);
7480 ok(hr == S_OK, "got 0x%08lx\n", hr);
7481
7482 /* setter name */
7483 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 0, propW, 1);
7484 ok(hr == S_OK, "got 0x%08lx\n", hr);
7485
7486 /* putref method */
7487 funcdesc.invkind = INVOKE_PROPERTYPUTREF;
7488 hr = ICreateTypeInfo_AddFuncDesc(cti, 1, &funcdesc);
7489 ok(hr == S_OK, "got 0x%08lx\n", hr);
7490
7491 /* putref name */
7492 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 1, propW, 1);
7493 ok(hr == S_OK, "got 0x%08lx\n", hr);
7494
7495 funcdesc.invkind = INVOKE_PROPERTYGET;
7496 funcdesc.cParams = 0;
7497 hr = ICreateTypeInfo_AddFuncDesc(cti, 2, &funcdesc);
7498 ok(hr == S_OK, "got 0x%08lx\n", hr);
7499
7500 /* getter name */
7501 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 2, propW, 1);
7502 ok(hr == S_OK, "got 0x%08lx\n", hr);
7503
7504 hr = ICreateTypeInfo_AddFuncDesc(cti, 3, &funcdesc);
7505 ok(hr == S_OK, "got 0x%08lx\n", hr);
7506
7507 /* getter name again */
7508 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 3, propW, 1);
7509 ok(hr == TYPE_E_AMBIGUOUSNAME, "got 0x%08lx\n", hr);
7510
7511 /* regular function */
7512 funcdesc.invkind = INVOKE_FUNC;
7513 funcdesc.cParams = 1;
7514 hr = ICreateTypeInfo_AddFuncDesc(cti, 4, &funcdesc);
7515 ok(hr == S_OK, "got 0x%08lx\n", hr);
7516
7517 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 4, funcW, 2);
7518 ok(hr == S_OK, "got 0x%08lx\n", hr);
7519
7520 ICreateTypeInfo_Release(cti);
7521
7522 hr = ICreateTypeLib2_CreateTypeInfo(ctl, name2W, TKIND_INTERFACE, &cti);
7523 ok(hr == S_OK, "got %08lx\n", hr);
7524
7525 funcdesc.funckind = FUNC_PUREVIRTUAL;
7526 funcdesc.invkind = INVOKE_FUNC;
7527 funcdesc.cParams = 0;
7528 funcdesc.lprgelemdescParam = NULL;
7529 hr = ICreateTypeInfo_AddFuncDesc(cti, 0, &funcdesc);
7530 ok(hr == S_OK, "got 0x%08lx\n", hr);
7531
7532 hr = ICreateTypeInfo_SetFuncAndParamNames(cti, 0, funcW, 1);
7533 ok(hr == S_OK, "got 0x%08lx\n", hr);
7534
7535 ICreateTypeInfo_Release(cti);
7536
7537 hr = ICreateTypeLib2_QueryInterface(ctl, &IID_ITypeLib, (void**)&tl);
7538 ok(hr == S_OK, "got %08lx\n", hr);
7539
7540 found = 1;
7541 memset(infos, 0, sizeof(infos));
7542 memids[0] = 0xdeadbeef;
7543 memids[1] = 0xdeadbeef;
7544 memids[2] = 0xdeadbeef;
7545 hr = ITypeLib_FindName(tl, func, 0, infos, memids, &found);
7546 ok(hr == S_OK, "got %08lx\n", hr);
7547 ok(found == 1, "got wrong count: %u\n", found);
7548 ok(infos[0] && !infos[1] && !infos[2], "got wrong typeinfo\n");
7549 ok(memids[0] == 0, "got wrong memid[0]\n");
7550 ok(memids[1] == 0xdeadbeef && memids[2] == 0xdeadbeef, "got wrong memids\n");
7551 ITypeInfo_Release(infos[0]);
7552
7553 found = 3;
7554 memset(infos, 0, sizeof(infos));
7555 memids[0] = 0xdeadbeef;
7556 memids[1] = 0xdeadbeef;
7557 memids[2] = 0xdeadbeef;
7558 hr = ITypeLib_FindName(tl, func, 0, infos, memids, &found);
7559 ok(hr == S_OK, "got %08lx\n", hr);
7560 ok(found == 2, "got wrong count: %u\n", found);
7561 ok(infos[0] && infos[1] && infos[0] != infos[1], "got same typeinfo\n");
7562 ok(memids[0] == 0, "got wrong memid[0]\n");
7563 ok(memids[1] == 0, "got wrong memid[1]\n");
7564 ITypeInfo_Release(infos[0]);
7565 ITypeInfo_Release(infos[1]);
7566
7567 ITypeLib_Release(tl);
7568 ICreateTypeLib2_Release(ctl);
7570}

Referenced by START_TEST().

◆ test_SetTypeDescAlias()

static void test_SetTypeDescAlias ( SYSKIND  kind)
static

Definition at line 8200 of file typelib.c.

8201{
8204 ITypeLib *tl;
8205 ICreateTypeLib2 *ctl;
8206 ITypeInfo *ti;
8207 ICreateTypeInfo *cti;
8208 HREFTYPE hreftype;
8209 TYPEATTR *typeattr;
8210 ULONG href_cbSizeInstance, i;
8211 WORD href_cbAlignment, ptr_size;
8212 HRESULT hr;
8213
8214 static OLECHAR interfaceW[] = {'i','n','t','e','r','f','a','c','e',0};
8215
8216 switch(kind){
8217 case SYS_WIN32:
8218 winetest_push_context("win32");
8219 ptr_size = 4;
8220 break;
8221 case SYS_WIN64:
8222 winetest_push_context("win64");
8223 ptr_size = 8;
8224 break;
8225 default:
8226 return;
8227 }
8228
8229 GetTempFileNameA(".", "tlb", 0, filenameA);
8231
8232 hr = CreateTypeLib2(kind, filenameW, &ctl);
8233 ok(hr == S_OK, "got %08lx\n", hr);
8234
8235 hr = ICreateTypeLib2_CreateTypeInfo(ctl, interfaceW, TKIND_INTERFACE, &cti);
8236 ok(hr == S_OK, "got %08lx\n", hr);
8237
8238 hr = ICreateTypeInfo_QueryInterface(cti, &IID_ITypeInfo, (void**)&ti);
8239 ok(hr == S_OK, "got %08lx\n", hr);
8240
8241 hr = ICreateTypeInfo_AddRefTypeInfo(cti, ti, &hreftype);
8242 ok(hr == S_OK, "got %08lx\n", hr);
8243
8244 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8245 ok(hr == S_OK, "got %08lx\n", hr);
8246
8247 href_cbSizeInstance = typeattr->cbSizeInstance;
8248 href_cbAlignment = typeattr->cbAlignment;
8249
8250 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8251
8252 ITypeInfo_Release(ti);
8253 ICreateTypeInfo_Release(cti);
8254
8255 hr = ICreateTypeLib2_QueryInterface(ctl, &IID_ITypeLib, (void**)&tl);
8256 ok(hr == S_OK, "got %08lx\n", hr);
8257
8258 for(i = 0; TDATests[i].vt; ++i)
8259 testTDA(tl, &TDATests[i], ptr_size, hreftype, href_cbSizeInstance, href_cbAlignment, TRUE);
8260
8261 hr = ICreateTypeLib2_SaveAllChanges(ctl);
8262 ok(hr == S_OK, "got %08lx\n", hr);
8263
8264 ITypeLib_Release(tl);
8265 ok(0 == ICreateTypeLib2_Release(ctl), "typelib should have been released\n");
8266
8268 ok(hr == S_OK, "got %08lx\n", hr);
8269
8270 hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
8271 ok(hr == S_OK, "got %08lx\n", hr);
8272
8273 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8274 ok(hr == S_OK, "got %08lx\n", hr);
8275
8276 href_cbSizeInstance = typeattr->cbSizeInstance;
8277 href_cbAlignment = typeattr->cbAlignment;
8278
8279 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8280 ITypeInfo_Release(ti);
8281
8282 for(i = 0; TDATests[i].vt; ++i)
8283 testTDA(tl, &TDATests[i], ptr_size, hreftype, href_cbSizeInstance, href_cbAlignment, FALSE);
8284
8285 ok(0 == ITypeLib_Release(tl), "typelib should have been released\n");
8286
8289}
static struct _TDATest TDATests[]
static void testTDA(ITypeLib *tl, struct _TDATest *TDATest, ULONG ptr_size, HREFTYPE hreftype, ULONG href_cbSizeInstance, WORD href_cbAlignment, BOOL create)
Definition: typelib.c:8100

Referenced by START_TEST().

◆ test_SetVarHelpContext()

static void test_SetVarHelpContext ( void  )
static

Definition at line 7353 of file typelib.c.

7354{
7355 static OLECHAR nameW[] = {'n','a','m','e',0};
7358 ICreateTypeLib2 *ctl;
7359 ICreateTypeInfo *cti;
7360 ITypeLib *tl;
7361 ITypeInfo *ti;
7362 VARDESC desc, *pdesc;
7363 HRESULT hr;
7364 DWORD ctx;
7365 VARIANT v;
7366
7367 GetTempFileNameA(".", "tlb", 0, filenameA);
7369
7371 ok(hr == S_OK, "got %08lx\n", hr);
7372
7373 hr = ICreateTypeLib2_CreateTypeInfo(ctl, nameW, TKIND_ENUM, &cti);
7374 ok(hr == S_OK, "got %08lx\n", hr);
7375
7376 hr = ICreateTypeInfo_SetVarHelpContext(cti, 0, 0);
7377 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7378
7379 memset(&desc, 0, sizeof(desc));
7380 desc.memid = MEMBERID_NIL;
7381 desc.elemdescVar.tdesc.vt = VT_INT;
7382 desc.varkind = VAR_CONST;
7383
7384 V_VT(&v) = VT_INT;
7385 V_INT(&v) = 1;
7386 desc.lpvarValue = &v;
7387 hr = ICreateTypeInfo_AddVarDesc(cti, 0, &desc);
7388 ok(hr == S_OK, "got %08lx\n", hr);
7389
7390 hr = ICreateTypeInfo_SetVarHelpContext(cti, 0, 0);
7391 ok(hr == S_OK, "got %08lx\n", hr);
7392
7393 /* another time */
7394 hr = ICreateTypeInfo_SetVarHelpContext(cti, 0, 1);
7395 ok(hr == S_OK, "got %08lx\n", hr);
7396
7397 /* wrong index now */
7398 hr = ICreateTypeInfo_SetVarHelpContext(cti, 1, 0);
7399 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got %08lx\n", hr);
7400
7401 ICreateTypeInfo_Release(cti);
7402
7403 hr = ICreateTypeLib2_SaveAllChanges(ctl);
7404 ok(hr == S_OK, "got: %08lx\n", hr);
7405
7406 ICreateTypeLib2_Release(ctl);
7407
7408 hr = LoadTypeLib(filenameW, &tl);
7409 ok(hr == S_OK, "got: %08lx\n", hr);
7410
7411 hr = ITypeLib_GetTypeInfo(tl, 0, &ti);
7412 ok(hr == S_OK, "got %08lx\n", hr);
7413
7414 hr = ITypeInfo_GetVarDesc(ti, 0, &pdesc);
7415 ok(hr == S_OK, "got %08lx\n", hr);
7416 ok(pdesc->memid == 0x40000000, "got wrong memid: %lx\n", pdesc->memid);
7417 ok(pdesc->elemdescVar.tdesc.vt == VT_INT, "got wrong vardesc type: %u\n", pdesc->elemdescVar.tdesc.vt);
7418 ok(pdesc->varkind == VAR_CONST, "got wrong varkind: %u\n", pdesc->varkind);
7419 ok(V_VT(pdesc->lpvarValue) == VT_INT, "got wrong value type: %u\n", V_VT(pdesc->lpvarValue));
7420 ok(V_INT(pdesc->lpvarValue) == 1, "got wrong value: 0x%x\n", V_INT(pdesc->lpvarValue));
7421
7422 hr = ITypeInfo_GetDocumentation(ti, pdesc->memid, NULL, NULL, &ctx, NULL);
7423 ok(hr == S_OK, "got %08lx\n", hr);
7424 ok(ctx == 1, "got wrong help context: 0x%lx\n", ctx);
7425
7426 ITypeInfo_ReleaseVarDesc(ti, pdesc);
7427 ITypeInfo_Release(ti);
7428 ITypeLib_Release(tl);
7429
7431}

Referenced by START_TEST().

◆ test_stub()

static void test_stub ( void  )
static

Definition at line 8338 of file typelib.c.

8339{
8341 DWORD *sam_list;
8342 HRESULT hr;
8344 ICreateTypeLib2 *ctl;
8345 ICreateTypeInfo *cti;
8346 ITypeLib *tl;
8347 ITypeInfo *unk, *ti;
8348 HREFTYPE href;
8349 char filenameA[MAX_PATH];
8351 int i;
8352
8353 static const GUID libguid = {0x3b9ff02e,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
8354 static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
8355 static const GUID coclassguid = {0x3b9ff030,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
8356 static OLECHAR interfaceW[] = {'i','n','t','e','r','f','a','c','e',0};
8357 static OLECHAR classW[] = {'c','l','a','s','s',0};
8358 static DWORD sam_list32[] = { 0, ~0 };
8359 static DWORD sam_list64[] = { 0, KEY_WOW64_32KEY, KEY_WOW64_64KEY, ~0 };
8360
8361 if (pIsWow64Process)
8362 pIsWow64Process(GetCurrentProcess(), &is_wow64);
8363 if (is_wow64 || is_win64)
8364 sam_list = sam_list64;
8365 else
8366 sam_list = sam_list32;
8367
8369
8371 ok(hr == S_OK, "got %08lx\n", hr);
8372
8373 hr = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IUnknown, &unk);
8374 ok(hr == S_OK, "got %08lx\n", hr);
8375
8376 GetTempFileNameA(".", "tlb", 0, filenameA);
8378
8380 ok(hr == S_OK, "got %08lx\n", hr);
8381
8382 hr = ICreateTypeLib2_SetGuid(ctl, &libguid);
8383 ok(hr == S_OK, "got %08lx\n", hr);
8384
8385 hr = ICreateTypeLib2_SetLcid(ctl, LOCALE_NEUTRAL);
8386 ok(hr == S_OK, "got %08lx\n", hr);
8387
8388 hr = ICreateTypeLib2_CreateTypeInfo(ctl, interfaceW, TKIND_INTERFACE, &cti);
8389 ok(hr == S_OK, "got %08lx\n", hr);
8390
8391 hr = ICreateTypeInfo_SetGuid(cti, &interfaceguid);
8392 ok(hr == S_OK, "got %08lx\n", hr);
8393
8394 hr = ICreateTypeInfo_SetTypeFlags(cti, TYPEFLAG_FOLEAUTOMATION);
8395 ok(hr == S_OK, "got %08lx\n", hr);
8396
8397 hr = ICreateTypeInfo_AddRefTypeInfo(cti, unk, &href);
8398 ok(hr == S_OK, "got %08lx\n", hr);
8399
8400 hr = ICreateTypeInfo_AddImplType(cti, 0, href);
8401 ok(hr == S_OK, "got %08lx\n", hr);
8402
8403 hr = ICreateTypeInfo_QueryInterface(cti, &IID_ITypeInfo, (void**)&ti);
8404 ok(hr == S_OK, "got %08lx\n", hr);
8405
8406 ICreateTypeInfo_Release(cti);
8407 ITypeInfo_Release(unk);
8408 ITypeLib_Release(stdole);
8409
8410 hr = ICreateTypeLib2_CreateTypeInfo(ctl, classW, TKIND_COCLASS, &cti);
8411 ok(hr == S_OK, "got %08lx\n", hr);
8412
8413 hr = ICreateTypeInfo_SetGuid(cti, &coclassguid);
8414 ok(hr == S_OK, "got %08lx\n", hr);
8415
8416 hr = ICreateTypeInfo_AddRefTypeInfo(cti, ti, &href);
8417 ok(hr == S_OK, "got %08lx\n", hr);
8418
8419 hr = ICreateTypeInfo_AddImplType(cti, 0, href);
8420 ok(hr == S_OK, "got %08lx\n", hr);
8421
8422 ITypeInfo_Release(ti);
8423 ICreateTypeInfo_Release(cti);
8424
8425 hr = ICreateTypeLib2_SaveAllChanges(ctl);
8426 ok(hr == S_OK, "got %08lx\n", hr);
8427
8428 hr = ICreateTypeLib2_QueryInterface(ctl, &IID_ITypeLib, (void**)&tl);
8429 ok(hr == S_OK, "got %08lx\n", hr);
8430
8431 for (i = 0; sam_list[i] != ~0; i++)
8432 {
8434 IRpcStubBuffer *base_stub;
8435 REGSAM side = sam_list[i];
8436 CLSID clsid;
8437 HKEY hkey;
8438 LONG lr;
8439
8442 {
8443 win_skip("Insufficient privileges to register typelib in the registry\n");
8444 break;
8445 }
8446 ok(hr == S_OK, "got %08lx, side: %04lx\n", hr, side);
8447
8448 /* SYS_WIN32 typelibs should be registered only as 32-bit */
8449 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win64", 0, KEY_READ | side, &hkey);
8450 ok(lr == ERROR_FILE_NOT_FOUND, "got wrong return code: %lu, side: %04lx\n", lr, side);
8451
8452 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win32", 0, KEY_READ | side, &hkey);
8453 ok(lr == ERROR_SUCCESS, "got wrong return code: %lu, side: %04lx\n", lr, side);
8454 RegCloseKey(hkey);
8455
8456 /* Simulate pre-win7 installers that create interface key on one side */
8457 if (side != 0)
8458 {
8459 WCHAR guidW[40];
8460 REGSAM opposite = side ^ (KEY_WOW64_64KEY | KEY_WOW64_32KEY);
8461
8462 StringFromGUID2(&interfaceguid, guidW, ARRAY_SIZE(guidW));
8463
8464 /* Delete the opposite interface key */
8465 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "Interface", 0, KEY_READ | opposite, &hkey);
8466 ok(lr == ERROR_SUCCESS, "got wrong return code: %lu, side: %04lx\n", lr, side);
8467 lr = myRegDeleteTreeW(hkey, guidW, opposite);
8468 ok(lr == ERROR_SUCCESS, "got wrong return code: %lu, side: %04lx\n", lr, side);
8469 RegCloseKey(hkey);
8470
8471 /* Is our side interface key affected by above operation? */
8472 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "Interface\\{3b9ff02f-9675-4861-b781-ceaea4782acc}", 0, KEY_READ | side, &hkey);
8473 ok(lr == ERROR_SUCCESS || broken(lr == ERROR_FILE_NOT_FOUND), "got wrong return code: %lu, side: %04lx\n", lr, side);
8474 if (lr == ERROR_FILE_NOT_FOUND)
8475 {
8476 /* win2k3, vista, 2008 */
8477 win_skip("Registry reflection is enabled on this platform.\n");
8478 goto next;
8479 }
8480 RegCloseKey(hkey);
8481
8482 /* Opposite side typelib key still exists */
8483 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "TypeLib\\{3b9ff02e-9675-4861-b781-ceaea4782acc}\\0.0\\0\\win32", 0, KEY_READ | opposite, &hkey);
8484 ok(lr == ERROR_SUCCESS, "got wrong return code: %lu, side: %04lx\n", lr, side);
8485 RegCloseKey(hkey);
8486 }
8487
8488 hr = CoGetPSClsid(&interfaceguid, &clsid);
8489 ok(hr == S_OK, "got: %lx, side: %04lx\n", hr, side);
8490
8491 hr = CoGetClassObject(&clsid, CLSCTX_INPROC_SERVER, NULL,
8492 &IID_IPSFactoryBuffer, (void **)&factory);
8493 ok(hr == S_OK, "got: %lx, side: %04lx\n", hr, side);
8494
8495 hr = IPSFactoryBuffer_CreateStub(factory, &interfaceguid, &uk, &base_stub);
8496 ok(hr == S_OK, "got: %lx, side: %04lx\n", hr, side);
8497 IRpcStubBuffer_Release(base_stub);
8498
8499 IPSFactoryBuffer_Release(factory);
8500 next:
8501 hr = UnRegisterTypeLib(&libguid, 0, 0, 0, SYS_WIN32);
8502 ok(hr == S_OK, "got: %lx, side: %04lx\n", hr, side);
8503 }
8504
8505 ITypeLib_Release(tl);
8506 ok(0 == ICreateTypeLib2_Release(ctl), "Typelib still has references\n");
8507
8509
8511}
HRESULT WINAPI CoGetPSClsid(REFIID riid, CLSID *pclsid)
Definition: combase.c:2294
HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(REFCLSID rclsid, DWORD clscontext, COSERVERINFO *server_info, REFIID riid, void **obj)
Definition: combase.c:1925
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(void *reserved, DWORD model)
Definition: combase.c:2803
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
IUnknown uk
Definition: typelib.c:8336
const CLSID * clsid
Definition: msctf.cpp:50
@ COINIT_APARTMENTTHREADED
Definition: objbase.h:279
static unsigned __int64 next
Definition: rand_nt.c:6
Definition: main.c:439

Referenced by START_TEST().

◆ test_TypeComp()

static void test_TypeComp ( void  )
static

Definition at line 386 of file typelib.c.

387{
388 ITypeComp *pTypeComp, *tcomp, *pTypeComp_tmp;
389 ITypeInfo *pTypeInfo, *ti, *pFontTypeInfo;
390 ITypeLib *pTypeLib;
391 HRESULT hr;
392 ULONG ulHash;
393 DESCKIND desckind;
394 BINDPTR bindptr;
395 static WCHAR wszStdFunctions[] = {'S','t','d','F','u','n','c','t','i','o','n','s',0};
396 static WCHAR wszSavePicture[] = {'S','a','v','e','P','i','c','t','u','r','e',0};
397 static WCHAR wszOLE_TRISTATE[] = {'O','L','E','_','T','R','I','S','T','A','T','E',0};
398 static WCHAR wszUnchecked[] = {'U','n','c','h','e','c','k','e','d',0};
399 static WCHAR wszIUnknown[] = {'I','U','n','k','n','o','w','n',0};
400 static WCHAR wszFont[] = {'F','o','n','t',0};
401 static WCHAR wszStdPicture[] = {'S','t','d','P','i','c','t','u','r','e',0};
402 static WCHAR wszOLE_COLOR[] = {'O','L','E','_','C','O','L','O','R',0};
403 static WCHAR wszClone[] = {'C','l','o','n','e',0};
404 static WCHAR wszclone[] = {'c','l','o','n','e',0};
405 static WCHAR wszJunk[] = {'J','u','n','k',0};
406 static WCHAR wszAddRef[] = {'A','d','d','R','e','f',0};
407
408 hr = LoadTypeLib(wszStdOle2, &pTypeLib);
410
411 hr = ITypeLib_GetTypeComp(pTypeLib, &pTypeComp);
412 ok_ole_success(hr, ITypeLib_GetTypeComp);
413
414 /* test getting a TKIND_MODULE */
415 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszStdFunctions);
416 hr = ITypeComp_Bind(pTypeComp, wszStdFunctions, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
417 ok_ole_success(hr, ITypeComp_Bind);
418
419 ok(desckind == DESCKIND_TYPECOMP,
420 "desckind should have been DESCKIND_TYPECOMP instead of %d\n",
421 desckind);
422 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
423
424 ITypeComp_Release(bindptr.lptcomp);
425
426 /* test getting a TKIND_MODULE with INVOKE_PROPERTYGET */
427 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszStdFunctions);
428 hr = ITypeComp_Bind(pTypeComp, wszStdFunctions, ulHash, INVOKE_PROPERTYGET, &pTypeInfo, &desckind, &bindptr);
429 ok_ole_success(hr, ITypeComp_Bind);
430
431 ok(desckind == DESCKIND_TYPECOMP,
432 "desckind should have been DESCKIND_TYPECOMP instead of %d\n",
433 desckind);
434 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
435 ITypeComp_Release(bindptr.lptcomp);
436
437 /* test getting a function within a TKIND_MODULE */
438 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszSavePicture);
439 hr = ITypeComp_Bind(pTypeComp, wszSavePicture, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
440 ok_ole_success(hr, ITypeComp_Bind);
441
442 ok(desckind == DESCKIND_FUNCDESC,
443 "desckind should have been DESCKIND_FUNCDESC instead of %d\n",
444 desckind);
445 ok(bindptr.lpfuncdesc != NULL, "bindptr.lpfuncdesc should not have been set to NULL\n");
446 ITypeInfo_ReleaseFuncDesc(pTypeInfo, bindptr.lpfuncdesc);
447 ITypeInfo_Release(pTypeInfo);
448
449 /* test getting a function within a TKIND_MODULE with INVOKE_PROPERTYGET */
450 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszSavePicture);
451 hr = ITypeComp_Bind(pTypeComp, wszSavePicture, ulHash, INVOKE_PROPERTYGET, &pTypeInfo, &desckind, &bindptr);
453 "ITypeComp_Bind should have failed with TYPE_E_TYPEMISMATCH instead of 0x%08lx\n",
454 hr);
455
456 ok(desckind == DESCKIND_NONE,
457 "desckind should have been DESCKIND_NONE instead of %d\n",
458 desckind);
459 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
460 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
461
462 /* test getting a TKIND_ENUM */
463 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszOLE_TRISTATE);
464 hr = ITypeComp_Bind(pTypeComp, wszOLE_TRISTATE, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
465 ok_ole_success(hr, ITypeComp_Bind);
466
467 ok(desckind == DESCKIND_TYPECOMP,
468 "desckind should have been DESCKIND_TYPECOMP instead of %d\n",
469 desckind);
470 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
471
472 ITypeComp_Release(bindptr.lptcomp);
473
474 /* test getting a value within a TKIND_ENUM */
475 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszUnchecked);
476 hr = ITypeComp_Bind(pTypeComp, wszUnchecked, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
477 ok_ole_success(hr, ITypeComp_Bind);
478
479 ok(desckind == DESCKIND_VARDESC,
480 "desckind should have been DESCKIND_VARDESC instead of %d\n",
481 desckind);
482 ITypeInfo_ReleaseVarDesc(pTypeInfo, bindptr.lpvardesc);
483 ITypeInfo_Release(pTypeInfo);
484
485 /* test getting a TKIND_INTERFACE */
486 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszIUnknown);
487 hr = ITypeComp_Bind(pTypeComp, wszIUnknown, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
488 ok_ole_success(hr, ITypeComp_Bind);
489
490 ok(desckind == DESCKIND_NONE,
491 "desckind should have been DESCKIND_NONE instead of %d\n",
492 desckind);
493 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
494 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
495
496 /* test getting a TKIND_DISPATCH */
497 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszFont);
498 hr = ITypeComp_Bind(pTypeComp, wszFont, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
499 ok_ole_success(hr, ITypeComp_Bind);
500
501 ok(desckind == DESCKIND_NONE,
502 "desckind should have been DESCKIND_NONE instead of %d\n",
503 desckind);
504 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
505 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
506
507 /* test getting a TKIND_RECORD/TKIND_ALIAS */
509 hr = ITypeComp_Bind(pTypeComp, wszGUID, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
510 ok_ole_success(hr, ITypeComp_Bind);
511
512 ok(desckind == DESCKIND_NONE,
513 "desckind should have been DESCKIND_NONE instead of %d\n",
514 desckind);
515 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
516 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
517
518 /* test getting a TKIND_ALIAS */
519 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszOLE_COLOR);
520 hr = ITypeComp_Bind(pTypeComp, wszOLE_COLOR, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
521 ok_ole_success(hr, ITypeComp_Bind);
522
523 ok(desckind == DESCKIND_NONE,
524 "desckind should have been DESCKIND_NONE instead of %d\n",
525 desckind);
526 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
527 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
528
529 /* test getting a TKIND_COCLASS */
530 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszStdPicture);
531 hr = ITypeComp_Bind(pTypeComp, wszStdPicture, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
532 ok_ole_success(hr, ITypeComp_Bind);
533
534 ok(desckind == DESCKIND_NONE,
535 "desckind should have been DESCKIND_NONE instead of %d\n",
536 desckind);
537 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
538 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
539
540 /* test basic BindType argument handling */
542 hr = ITypeComp_BindType(pTypeComp, wszGUID, ulHash, NULL, NULL);
543 ok(hr == E_INVALIDARG, "Got %08lx\n", hr);
544
546 pTypeInfo = (void*)0xdeadbeef;
547 hr = ITypeComp_BindType(pTypeComp, wszGUID, ulHash, &pTypeInfo, NULL);
548 ok(hr == E_INVALIDARG, "Got %08lx\n", hr);
549 ok(pTypeInfo == (void*)0xdeadbeef, "Got %p\n", pTypeInfo);
550
552 pTypeComp_tmp = (void*)0xdeadbeef;
553 hr = ITypeComp_BindType(pTypeComp, wszGUID, ulHash, NULL, &pTypeComp_tmp);
554 ok(hr == E_INVALIDARG, "Got %08lx\n", hr);
555 ok(pTypeComp_tmp == (void*)0xdeadbeef, "Got %p\n", pTypeComp_tmp);
556
558 pTypeComp_tmp = (void*)0xdeadbeef;
559 pTypeInfo = (void*)0xdeadbeef;
560 hr = ITypeComp_BindType(pTypeComp, NULL, ulHash, &pTypeInfo, &pTypeComp_tmp);
561 ok(hr == E_INVALIDARG, "Got %08lx\n", hr);
562 ok(pTypeInfo == (void*)0xdeadbeef, "Got %p\n", pTypeInfo);
563 ok(pTypeComp_tmp == (void*)0xdeadbeef, "Got %p\n", pTypeComp_tmp);
564
566 pTypeComp_tmp = (void*)0xdeadbeef;
567 pTypeInfo = (void*)0xdeadbeef;
568 hr = ITypeComp_BindType(pTypeComp, wszGUID, ulHash, &pTypeInfo, &pTypeComp_tmp);
569 ok_ole_success(hr, ITypeComp_BindType);
570 ok(pTypeInfo != NULL, "Got NULL pTypeInfo\n");
571 todo_wine ok(pTypeComp_tmp == NULL, "Got pTypeComp_tmp %p\n", pTypeComp_tmp);
572 ITypeInfo_Release(pTypeInfo);
573 if(pTypeComp_tmp) ITypeComp_Release(pTypeComp_tmp); /* fixme */
574
575 /* test BindType case-insensitivity */
577 pTypeComp_tmp = (void*)0xdeadbeef;
578 pTypeInfo = (void*)0xdeadbeef;
579 hr = ITypeComp_BindType(pTypeComp, wszguid, ulHash, &pTypeInfo, &pTypeComp_tmp);
580 ok_ole_success(hr, ITypeComp_BindType);
581 ok(pTypeInfo != NULL, "Got NULL pTypeInfo\n");
582 todo_wine ok(pTypeComp_tmp == NULL, "Got pTypeComp_tmp %p\n", pTypeComp_tmp);
583 ITypeInfo_Release(pTypeInfo);
584 if(pTypeComp_tmp) ITypeComp_Release(pTypeComp_tmp); /* fixme */
585
586 ITypeComp_Release(pTypeComp);
587
588 /* tests for ITypeComp on an interface */
589 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IFont, &pFontTypeInfo);
590 ok_ole_success(hr, ITypeLib_GetTypeInfoOfGuid);
591
592 hr = ITypeInfo_GetTypeComp(pFontTypeInfo, &pTypeComp);
593 ok_ole_success(hr, ITypeLib_GetTypeComp);
594
595 hr = ITypeInfo_QueryInterface(pFontTypeInfo, &IID_ITypeComp, (void**)&tcomp);
596 ok(hr == S_OK, "got %08lx\n", hr);
597 ok(tcomp == pTypeComp, "got %p, was %p\n", tcomp, pTypeComp);
598
599 hr = ITypeComp_QueryInterface(tcomp, &IID_ITypeInfo, (void**)&ti);
600 ok(hr == S_OK, "got %08lx\n", hr);
601 ok(ti == pFontTypeInfo, "got %p, was %p\n", ti, pFontTypeInfo);
602 ITypeInfo_Release(ti);
603
604 ITypeComp_Release(tcomp);
605
606 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszClone);
607 hr = ITypeComp_Bind(pTypeComp, wszClone, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
608 ok_ole_success(hr, ITypeComp_Bind);
609
610 ok(desckind == DESCKIND_FUNCDESC,
611 "desckind should have been DESCKIND_FUNCDESC instead of %d\n",
612 desckind);
613 ok(bindptr.lpfuncdesc != NULL, "bindptr.lpfuncdesc should not have been set to NULL\n");
614 ITypeInfo_ReleaseFuncDesc(pTypeInfo, bindptr.lpfuncdesc);
615 ITypeInfo_Release(pTypeInfo);
616
617 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszClone);
618 hr = ITypeComp_Bind(pTypeComp, wszClone, ulHash, INVOKE_PROPERTYGET, &pTypeInfo, &desckind, &bindptr);
619 ok(hr == TYPE_E_TYPEMISMATCH, "ITypeComp_Bind should have failed with TYPE_E_TYPEMISMATCH instead of 0x%08lx\n", hr);
620
621 ok(desckind == DESCKIND_NONE,
622 "desckind should have been DESCKIND_NONE instead of %d\n",
623 desckind);
624 ok(!pTypeInfo, "pTypeInfo should have been set to NULL\n");
625 ok(!bindptr.lptcomp, "bindptr should have been set to NULL\n");
626
627 /* tests that the compare is case-insensitive */
628 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszclone);
629 hr = ITypeComp_Bind(pTypeComp, wszclone, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
630 ok_ole_success(hr, ITypeComp_Bind);
631
632 ok(desckind == DESCKIND_FUNCDESC,
633 "desckind should have been DESCKIND_FUNCDESC instead of %d\n",
634 desckind);
635 ok(bindptr.lpfuncdesc != NULL, "bindptr.lpfuncdesc should not have been set to NULL\n");
636 ITypeInfo_ReleaseFuncDesc(pTypeInfo, bindptr.lpfuncdesc);
637 ITypeInfo_Release(pTypeInfo);
638
639 /* tests nonexistent members */
640 desckind = 0xdeadbeef;
641 bindptr.lptcomp = (ITypeComp*)0xdeadbeef;
642 pTypeInfo = (ITypeInfo*)0xdeadbeef;
643 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszJunk);
644 hr = ITypeComp_Bind(pTypeComp, wszJunk, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
645 ok_ole_success(hr, ITypeComp_Bind);
646 ok(desckind == DESCKIND_NONE, "desckind should have been DESCKIND_NONE, was: %d\n", desckind);
647 ok(pTypeInfo == NULL, "pTypeInfo should have been NULL, was: %p\n", pTypeInfo);
648 ok(bindptr.lptcomp == NULL, "bindptr should have been NULL, was: %p\n", bindptr.lptcomp);
649
650 /* tests inherited members */
651 desckind = 0xdeadbeef;
652 bindptr.lpfuncdesc = NULL;
653 pTypeInfo = NULL;
654 ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszAddRef);
655 hr = ITypeComp_Bind(pTypeComp, wszAddRef, ulHash, 0, &pTypeInfo, &desckind, &bindptr);
656 ok_ole_success(hr, ITypeComp_Bind);
657 ok(desckind == DESCKIND_FUNCDESC, "desckind should have been DESCKIND_FUNCDESC, was: %d\n", desckind);
658 ok(pTypeInfo != NULL, "pTypeInfo should not have been NULL, was: %p\n", pTypeInfo);
659 ok(bindptr.lpfuncdesc != NULL, "bindptr should not have been NULL, was: %p\n", bindptr.lpfuncdesc);
660 ITypeInfo_ReleaseFuncDesc(pTypeInfo, bindptr.lpfuncdesc);
661 ITypeInfo_Release(pTypeInfo);
662
663 ITypeComp_Release(pTypeComp);
664 ITypeInfo_Release(pFontTypeInfo);
665 ITypeLib_Release(pTypeLib);
666}
ULONG WINAPI LHashValOfNameSys(SYSKIND skind, LCID lcid, LPCOLESTR str)
Definition: hash.c:628
#define ok_ole_success(hr, func)
Definition: typelib.c:63
const GUID IID_IFont
#define TYPE_E_TYPEMISMATCH
Definition: winerror.h:3651

Referenced by START_TEST().

◆ test_TypeInfo()

static void test_TypeInfo ( void  )
static

Definition at line 882 of file typelib.c.

883{
884 ITypeLib *pTypeLib;
885 ITypeInfo *pTypeInfo, *ti;
886 ITypeInfo2 *pTypeInfo2;
887 HRESULT hr;
888 static WCHAR wszBogus[] = { 'b','o','g','u','s',0 };
889 static WCHAR wszGetTypeInfo[] = { 'G','e','t','T','y','p','e','I','n','f','o',0 };
890 static WCHAR wszClone[] = {'C','l','o','n','e',0};
891 static WCHAR wszTestDll[] = {'t','e','s','t','.','d','l','l',0};
892 OLECHAR* bogus = wszBogus;
893 OLECHAR* pwszGetTypeInfo = wszGetTypeInfo;
894 OLECHAR* pwszClone = wszClone;
895 DISPID dispidMember;
896 DISPPARAMS dispparams;
897 GUID bogusguid = {0x806afb4f,0x13f7,0x42d2,{0x89,0x2c,0x6c,0x97,0xc3,0x6a,0x36,0xc1}};
898 static const GUID moduleTestGetDllEntryGuid = {0xf073cd92,0xa199,0x11ea,{0xbb,0x37,0x02,0x42,0xac,0x13,0x00,0x02}};
899 VARIANT var, res, args[3];
900 UINT count, i;
901 TYPEKIND kind;
902 const WCHAR *filename;
903 TYPEATTR *attr;
904 LONG l;
905 WORD ordinal;
906 BSTR bstrDllName, bstrName;
907
908 hr = LoadTypeLib(wszStdOle2, &pTypeLib);
910
911 count = ITypeLib_GetTypeInfoCount(pTypeLib);
912 ok(count > 0, "got %d\n", count);
913
914 /* invalid index */
915 hr = ITypeLib_GetTypeInfo(pTypeLib, count, &pTypeInfo);
916 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got 0x%08lx\n", hr);
917
918 hr = ITypeLib_GetTypeInfo(pTypeLib, 0, NULL);
919 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
920
921 hr = ITypeLib_GetLibAttr(pTypeLib, NULL);
922 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
923
924 hr = ITypeLib_GetTypeInfoType(pTypeLib, count, &kind);
925 ok(hr == TYPE_E_ELEMENTNOTFOUND, "got 0x%08lx\n", hr);
926
927 hr = ITypeLib_GetTypeInfoType(pTypeLib, count, NULL);
928 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
929
930 hr = ITypeLib_GetTypeInfoType(pTypeLib, 0, NULL);
931 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
932
933 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IFont, &pTypeInfo);
934 ok_ole_success(hr, ITypeLib_GetTypeInfoOfGuid);
935
936 /* test nonexistent method name */
937 hr = ITypeInfo_GetIDsOfNames(pTypeInfo, &bogus, 1, &dispidMember);
939 "ITypeInfo_GetIDsOfNames should have returned DISP_E_UNKNOWNNAME instead of 0x%08lx\n",
940 hr);
941
942 dispparams.cArgs = 0;
943 dispparams.rgdispidNamedArgs = NULL;
944 dispparams.rgvarg = NULL;
945
946 /* test dispparams not NULL */
947
948 /* invalid member id -- wrong flags -- cNamedArgs not bigger than cArgs */
949 dispparams.cNamedArgs = 0;
950 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, 0xdeadbeef, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
951 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
952 /* invalid member id -- correct flags -- cNamedArgs not bigger than cArgs */
953 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, 0xdeadbeef, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
954 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
955
956 /* invalid member id -- wrong flags -- cNamedArgs bigger than cArgs */
957 dispparams.cNamedArgs = 1;
958 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, 0xdeadbeef, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
959 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
960 /* invalid member id -- correct flags -- cNamedArgs bigger than cArgs */
961 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, 0xdeadbeef, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
962 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
963
964
965 hr = ITypeInfo_GetIDsOfNames(pTypeInfo, &pwszClone, 1, &dispidMember);
966 ok_ole_success(hr, ITypeInfo_GetIDsOfNames);
967
968 /* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
969 dispparams.cNamedArgs = 0;
970 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
971 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
972 /* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
973 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
974 ok(hr == DISP_E_BADPARAMCOUNT, "ITypeInfo_Invoke should have returned DISP_E_BADPARAMCOUNT instead of 0x%08lx\n", hr);
975
976 /* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
977 dispparams.cNamedArgs = 1;
978 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
979 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
980 /* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
981 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
982 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
983
984 /* test NULL dispparams */
985
986 /* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
987 dispparams.cNamedArgs = 0;
988 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL);
989 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
990 /* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
991 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, NULL, NULL, NULL, NULL);
992 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
993
994 /* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
995 dispparams.cNamedArgs = 1;
996 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL);
997 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
998 /* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
999 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, NULL, NULL, NULL, NULL);
1000 ok(hr == E_INVALIDARG, "ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
1001
1002 ITypeInfo_Release(pTypeInfo);
1003
1004 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IDispatch, &pTypeInfo);
1005 ok_ole_success(hr, ITypeLib_GetTypeInfoOfGuid);
1006
1007 hr = ITypeInfo_GetIDsOfNames(pTypeInfo, &pwszGetTypeInfo, 1, &dispidMember);
1008 ok_ole_success(hr, ITypeInfo_GetIDsOfNames);
1009
1010 hr = ITypeInfo_QueryInterface(pTypeInfo, &IID_ITypeInfo2, (void**)&pTypeInfo2);
1011 ok_ole_success(hr, ITypeInfo_QueryInterface);
1012
1013 if (SUCCEEDED(hr))
1014 {
1015 VariantInit(&var);
1016
1017 V_VT(&var) = VT_I4;
1018
1019 /* test unknown guid passed to GetCustData */
1020 hr = ITypeInfo2_GetCustData(pTypeInfo2, &bogusguid, &var);
1021 ok_ole_success(hr, ITypeInfo_GetCustData);
1022 ok(V_VT(&var) == VT_EMPTY, "got %i, expected VT_EMPTY\n", V_VT(&var));
1023
1024 ITypeInfo2_Release(pTypeInfo2);
1025
1026 VariantClear(&var);
1027 }
1028
1029 /* Check instance size for IDispatch, typelib is loaded using system SYS_WIN* kind so it always matches
1030 system bitness. */
1031 hr = ITypeInfo_GetTypeAttr(pTypeInfo, &attr);
1032 ok(hr == S_OK, "got 0x%08lx\n", hr);
1033 ok(attr->cbSizeInstance == sizeof(void*), "got size %ld\n", attr->cbSizeInstance);
1034 ok(attr->typekind == TKIND_INTERFACE, "got typekind %d\n", attr->typekind);
1035 ITypeInfo_ReleaseTypeAttr(pTypeInfo, attr);
1036
1037 /* same size check with some general interface */
1038 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IEnumVARIANT, &ti);
1039 ok(hr == S_OK, "got 0x%08lx\n", hr);
1040 hr = ITypeInfo_GetTypeAttr(ti, &attr);
1041 ok(hr == S_OK, "got 0x%08lx\n", hr);
1042 ok(attr->cbSizeInstance == sizeof(void*), "got size %ld\n", attr->cbSizeInstance);
1043 ITypeInfo_ReleaseTypeAttr(ti, attr);
1044 ITypeInfo_Release(ti);
1045
1046 /* test invoking a method with a [restricted] keyword */
1047
1048 /* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
1049 dispparams.cNamedArgs = 0;
1050 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
1051 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1052 /* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
1053 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
1054 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1055
1056 /* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
1057 dispparams.cNamedArgs = 1;
1058 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, &dispparams, NULL, NULL, NULL);
1059 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1060 /* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
1061 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
1062 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1063
1064 /* test NULL dispparams */
1065
1066 /* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
1067 dispparams.cNamedArgs = 0;
1068 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL);
1069 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1070 /* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
1071 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, NULL, NULL, NULL, NULL);
1072 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1073
1074 /* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
1075 dispparams.cNamedArgs = 1;
1076 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL);
1077 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1078 /* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
1079 hr = ITypeInfo_Invoke(pTypeInfo, (void *)0xdeadbeef, dispidMember, DISPATCH_METHOD, NULL, NULL, NULL, NULL);
1080 ok(hr == DISP_E_MEMBERNOTFOUND, "ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr);
1081
1082 ITypeInfo_Release(pTypeInfo);
1083 ITypeLib_Release(pTypeLib);
1084
1086 hr = LoadTypeLib(filename, &pTypeLib);
1087 ok(hr == S_OK, "got 0x%08lx\n", hr);
1088
1089 /* test GetDllEntry */
1090 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &moduleTestGetDllEntryGuid, &pTypeInfo);
1091 ok_ole_success(hr, ITypeLib_GetTypeInfoOfGuid);
1092 ok(pTypeInfo != NULL, "got NULL typeinfo\n");
1093
1094 /* wrong memberid -- wrong invkind */
1095 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x6000000d, INVOKE_FUNC, &bstrDllName, &bstrName, &ordinal);
1096 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1097
1098 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x6000000d, INVOKE_PROPERTYPUTREF, &bstrDllName, &bstrName, &ordinal);
1099 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1100
1101 /* wrong memberid -- correct invkind */
1102 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x6000000d, INVOKE_PROPERTYGET, &bstrDllName, &bstrName, &ordinal);
1103 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1104
1105 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x6000000d, INVOKE_PROPERTYPUT, &bstrDllName, &bstrName, &ordinal);
1106 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1107
1108 /* correct memberid -- wrong invkind */
1109 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x60000000, INVOKE_FUNC, &bstrDllName, &bstrName, &ordinal);
1110 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1111
1112 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x60000000, INVOKE_PROPERTYPUTREF, &bstrDllName, &bstrName, &ordinal);
1113 ok(hr == TYPE_E_ELEMENTNOTFOUND, "ITypeInfo_GetDllEntry should have returned TYPE_E_ELEMENTNOTFOUND instead of 0x%08lx\n", hr);
1114
1115 /* correct memberid -- correct invkind */
1116 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x60000000, INVOKE_PROPERTYGET, &bstrDllName, &bstrName, &ordinal);
1117 ok_ole_success(hr, ITypeInfo_GetDllEntry);
1118 ok(!lstrcmpW(bstrDllName, wszTestDll), "got %s\n", wine_dbgstr_w(bstrDllName));
1119 ok(bstrName == NULL, "got %s\n", wine_dbgstr_w(bstrName));
1120 ok(ordinal == 1, "got ordinal: %04x\n", ordinal);
1121 SysFreeString(bstrDllName);
1122
1123 hr = ITypeInfo_GetDllEntry(pTypeInfo, 0x60000000, INVOKE_PROPERTYPUT, &bstrDllName, &bstrName, &ordinal);
1124 ok_ole_success(hr, ITypeInfo_GetDllEntry);
1125 ok(!lstrcmpW(bstrDllName, wszTestDll), "got %s\n", wine_dbgstr_w(bstrDllName));
1126 ok(bstrName == NULL, "got %s\n", wine_dbgstr_w(bstrName));
1127 ok(ordinal == 2, "got ordinal: %04x\n", ordinal);
1128 SysFreeString(bstrDllName);
1129
1130 ITypeInfo_Release(pTypeInfo);
1131
1132 hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IInvokeTest, &pTypeInfo);
1133 ok(hr == S_OK, "got 0x%08lx\n", hr);
1134
1135 dispparams.cArgs = 1;
1136 dispparams.cNamedArgs = 0;
1137 dispparams.rgdispidNamedArgs = NULL;
1138 dispparams.rgvarg = args;
1139
1140 V_VT(&args[0]) = VT_I4;
1141 V_I4(&args[0]) = 0;
1142
1143 i = 0;
1144 V_VT(&res) = VT_EMPTY;
1145 V_I4(&res) = 0;
1146 /* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */
1147 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_METHOD|DISPATCH_PROPERTYGET,
1148 &dispparams, &res, NULL, &i);
1149 ok(hr == S_OK, "got 0x%08lx\n", hr);
1150 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
1151 ok(V_I4(&res) == 1, "got %ld\n", V_I4(&res));
1152
1153 i = 0;
1154 /* call propget with DISPATCH_METHOD flags */
1155 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_METHOD,
1156 &dispparams, &res, NULL, &i);
1157 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx, %d\n", hr, i);
1158
1159 i = 0;
1160 V_VT(&res) = VT_EMPTY;
1161 V_I4(&res) = 0;
1162 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_PROPERTYGET,
1163 &dispparams, &res, NULL, &i);
1164 ok(hr == S_OK, "got 0x%08lx, %d\n", hr, i);
1165 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
1166 ok(V_I4(&res) == 1, "got %ld\n", V_I4(&res));
1167
1168 /* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */
1169 V_VT(&args[0]) = VT_I4;
1170 V_I4(&args[0]) = 7;
1171
1172 dispparams.cArgs = 1;
1173 dispparams.rgvarg = args;
1174
1175 i = 0;
1176 V_VT(&res) = VT_EMPTY;
1177 V_I4(&res) = 0;
1178 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 4, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, &res, NULL, &i);
1179 ok(hr == S_OK, "got 0x%08lx, %d\n", hr, i);
1180 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
1181 ok(V_I4(&res) == 15, "got %ld\n", V_I4(&res));
1182
1183
1184 /* DISPATCH_PROPERTYPUTREF */
1185 l = 1;
1186 V_VT(&args[0]) = VT_I4|VT_BYREF;
1187 V_I4REF(&args[0]) = &l;
1188
1189 dispidMember = DISPID_PROPERTYPUT;
1190 dispparams.cArgs = 1;
1191 dispparams.cNamedArgs = 1;
1192 dispparams.rgdispidNamedArgs = &dispidMember;
1193 dispparams.rgvarg = args;
1194
1195 i = 0;
1196 V_VT(&res) = VT_EMPTY;
1197 V_I4(&res) = 0;
1198 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 1, DISPATCH_PROPERTYPUTREF, &dispparams, &res, NULL, &i);
1199 ok(hr == S_OK, "got 0x%08lx, %d\n", hr, i);
1200 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
1201 ok(V_I4(&res) == 3, "got %ld\n", V_I4(&res));
1202
1203 i = 0;
1204 V_VT(&res) = VT_EMPTY;
1205 V_I4(&res) = 0;
1206 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 1, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1207 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx, %d\n", hr, i);
1208
1209 i = 0;
1210 V_VT(&args[0]) = VT_UNKNOWN;
1211 V_UNKNOWN(&args[0]) = NULL;
1212
1213 V_VT(&res) = VT_EMPTY;
1214 V_I4(&res) = 0;
1215 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 2, DISPATCH_PROPERTYPUTREF, &dispparams, &res, NULL, &i);
1216 ok(hr == S_OK, "got 0x%08lx, %d\n", hr, i);
1217 ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res));
1218 ok(V_I4(&res) == 6, "got %ld\n", V_I4(&res));
1219
1220 i = 0;
1221 V_VT(&res) = VT_EMPTY;
1222 V_I4(&res) = 0;
1223 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 2, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1224 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx, %d\n", hr, i);
1225
1226 V_VT(&res) = VT_I4;
1227 V_I4(&res) = 42;
1228 V_VT(&args[0]) = VT_I4;
1229 V_I4(&args[0]) = 1;
1230 V_VT(&args[1]) = VT_I4;
1231 V_I4(&args[1]) = 1;
1232 V_VT(&args[2]) = VT_I4;
1233 V_I4(&args[2]) = 1;
1234 dispparams.cNamedArgs = 0;
1235
1236 /* call propget with DISPATCH_PROPERTYPUT (missing member id) */
1237 dispparams.cArgs = 1;
1238 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 0xdeadbeef, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1239 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1240
1241 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 0 params */
1242 dispparams.cArgs = 0;
1243 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1244 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1245
1246 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 1 param */
1247 dispparams.cArgs = 1;
1248 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1249 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1250
1251 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 0 params - NULL result passed */
1252 dispparams.cArgs = 0;
1253 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1254 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1255
1256 /* call propget with DISPATCH_PROPERTYPUT on on HRESULT func(out int) - 1 params - NULL result passed */
1257 dispparams.cArgs = 1;
1258 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1259 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1260
1261 /* call propget with DISPATCH_PROPERTYPUT on int func() - 0 params */
1262 dispparams.cArgs = 0;
1263 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1264 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1265
1266 /* call propget with DISPATCH_PROPERTYPUT on int func() - 1 params */
1267 dispparams.cArgs = 1;
1268 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
1269 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1270
1271 /* call propget with DISPATCH_PROPERTYPUT on int func() - 0 params - NULL result passed */
1272 dispparams.cArgs = 0;
1273 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1274 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1275
1276 /* call propget with DISPATCH_PROPERTYPUT on int func() - 1 param - NULL result passed */
1277 dispparams.cArgs = 1;
1278 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1279 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1280
1281 /* call propget with DISPATCH_PROPERTYPUT on int func(int) - 0 param - NULL result passed */
1282 dispparams.cArgs = 0;
1283 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1284 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1285
1286 /* call propget with DISPATCH_PROPERTYPUT on int func(int) - 1 param - NULL result passed */
1287 dispparams.cArgs = 1;
1288 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1289 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1290
1291 /* call propget with DISPATCH_PROPERTYPUT on int func(int) - 2 params - NULL result passed */
1292 dispparams.cArgs = 2;
1293 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1294 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1295
1296 /* call propget with DISPATCH_PROPERTYPUT on int func(int) - 3 params - NULL result passed */
1297 dispparams.cArgs = 3;
1298 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1299 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1300
1301 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 0 param - NULL result passed */
1302 dispparams.cArgs = 0;
1303 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1304 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1305
1306 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 1 param - NULL result passed */
1307 dispparams.cArgs = 1;
1308 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1309 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1310
1311 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 2 params - NULL result passed */
1312 dispparams.cArgs = 2;
1313 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1314 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1315
1316 /* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 3 params - NULL result passed */
1317 dispparams.cArgs = 3;
1318 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1319 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1320
1321 /* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 0 params - NULL result passed */
1322 dispparams.cArgs = 0;
1323 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1324 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1325
1326 /* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 1 params - NULL result passed */
1327 dispparams.cArgs = 1;
1328 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1329 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1330
1331 /* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 2 params - NULL result passed */
1332 dispparams.cArgs = 2;
1333 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1334 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1335
1336 /* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 3 params - NULL result passed */
1337 dispparams.cArgs = 3;
1338 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1339 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1340
1341 /* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 0 params - NULL result passed */
1342 dispparams.cArgs = 0;
1343 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1344 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1345
1346 /* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 1 params - NULL result passed */
1347 dispparams.cArgs = 1;
1348 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1349 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1350
1351 /* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 2 params - NULL result passed */
1352 dispparams.cArgs = 2;
1353 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1354 ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
1355
1356 /* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 3 params - NULL result passed */
1357 dispparams.cArgs = 3;
1358 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1359 ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
1360
1361 /* If there's get and put, the put must work */
1362 /* call propput with DISPATCH_PROPERTYPUT on int func(int) */
1363 dispidMember = DISPID_PROPERTYPUT;
1364 dispparams.cArgs = 1;
1365 dispparams.cNamedArgs = 1;
1366 dispparams.rgdispidNamedArgs = &dispidMember;
1367 hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 11, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
1368 ok(hr == S_OK, "got 0x%08lx\n", hr);
1369
1370 test_invoke_func(pTypeInfo);
1371
1372 ITypeInfo_Release(pTypeInfo);
1373 ITypeLib_Release(pTypeLib);
1375}
r l[0]
Definition: byte_order.h:168
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
static void test_invoke_func(ITypeInfo *typeinfo)
Definition: typelib.c:846
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define DISPATCH_PROPERTYPUTREF
Definition: oleauto.h:1009
#define V_I4REF(A)
Definition: oleauto.h:248
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:3615
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618

Referenced by START_TEST().

◆ test_TypeInfo2_GetContainingTypeLib()

static void test_TypeInfo2_GetContainingTypeLib ( void  )
static

Definition at line 7792 of file typelib.c.

7793{
7794 static const WCHAR test[] = {'t','e','s','t','.','t','l','b',0};
7795 static OLECHAR testTI[] = {'t','e','s','t','T','y','p','e','I','n','f','o',0};
7796
7797 ICreateTypeLib2 *ctl2;
7798 ICreateTypeInfo *cti;
7799 ITypeInfo2 *ti2;
7800 ITypeLib *tl;
7801 UINT Index;
7802 HRESULT hr;
7803
7804 hr = CreateTypeLib2(SYS_WIN32, test, &ctl2);
7806
7807 hr = ICreateTypeLib2_CreateTypeInfo(ctl2, testTI, TKIND_DISPATCH, &cti);
7808 ok_ole_success(hr, ICreateTypeLib2_CreateTypeInfo);
7809
7810 hr = ICreateTypeInfo_QueryInterface(cti, &IID_ITypeInfo2, (void**)&ti2);
7811 ok_ole_success(hr, ICreateTypeInfo2_QueryInterface);
7812
7813 tl = NULL;
7814 Index = 888;
7815 hr = ITypeInfo2_GetContainingTypeLib(ti2, &tl, &Index);
7816 ok_ole_success(hr, ITypeInfo2_GetContainingTypeLib);
7817 ok(tl != NULL, "ITypeInfo2_GetContainingTypeLib returned empty TypeLib\n");
7818 ok(Index == 0, "ITypeInfo2_GetContainingTypeLib returned Index = %u, expected 0\n", Index);
7819 if(tl) ITypeLib_Release(tl);
7820
7821 tl = NULL;
7822 hr = ITypeInfo2_GetContainingTypeLib(ti2, &tl, NULL);
7823 ok_ole_success(hr, ITypeInfo2_GetContainingTypeLib);
7824 ok(tl != NULL, "ITypeInfo2_GetContainingTypeLib returned empty TypeLib\n");
7825 if(tl) ITypeLib_Release(tl);
7826
7827 Index = 888;
7828 hr = ITypeInfo2_GetContainingTypeLib(ti2, NULL, &Index);
7829 ok_ole_success(hr, ITypeInfo2_GetContainingTypeLib);
7830 ok(Index == 0, "ITypeInfo2_GetContainingTypeLib returned Index = %u, expected 0\n", Index);
7831
7832 hr = ITypeInfo2_GetContainingTypeLib(ti2, NULL, NULL);
7833 ok_ole_success(hr, ITypeInfo2_GetContainingTypeLib);
7834
7835 ITypeInfo2_Release(ti2);
7836 ICreateTypeInfo_Release(cti);
7837 ICreateTypeLib2_Release(ctl2);
7838}
#define test
Definition: rosglue.h:37
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by START_TEST().

◆ testTDA()

static void testTDA ( ITypeLib tl,
struct _TDATest TDATest,
ULONG  ptr_size,
HREFTYPE  hreftype,
ULONG  href_cbSizeInstance,
WORD  href_cbAlignment,
BOOL  create 
)
static

Definition at line 8100 of file typelib.c.

8103{
8104 TYPEDESC tdesc;
8105 WCHAR nameW[32];
8106 ITypeInfo *ti;
8107 ICreateTypeInfo *cti;
8108 ICreateTypeLib2 *ctl;
8109 ULONG size;
8111 TYPEATTR *typeattr;
8112 HRESULT hr;
8113
8114 static const WCHAR name_fmtW[] = {'a','l','i','a','s','%','0','2','u',0};
8115
8116 wsprintfW(nameW, name_fmtW, TDATest->vt);
8117
8118 if(create){
8119 hr = ITypeLib_QueryInterface(tl, &IID_ICreateTypeLib2, (void**)&ctl);
8120 ok(hr == S_OK, "got %08lx\n", hr);
8121
8122 hr = ICreateTypeLib2_CreateTypeInfo(ctl, nameW, TKIND_ALIAS, &cti);
8123 ok(hr == S_OK, "got %08lx\n", hr);
8124
8125 tdesc.vt = TDATest->vt;
8126 if(TDATest->aux == AUX_TDESC)
8127 tdesc.lptdesc = &TDATest->tdesc;
8128 else if(TDATest->aux == AUX_ADESC)
8129 tdesc.lpadesc = &TDATest->adesc;
8130 else if(TDATest->aux == AUX_HREF)
8131 tdesc.hreftype = hreftype;
8132
8133 hr = ICreateTypeInfo_SetTypeDescAlias(cti, &tdesc);
8134 ok(hr == S_OK, "for VT %u, got %08lx\n", TDATest->vt, hr);
8135
8136 hr = ICreateTypeInfo_QueryInterface(cti, &IID_ITypeInfo, (void**)&ti);
8137 ok(hr == S_OK, "got %08lx\n", hr);
8138
8139 ICreateTypeInfo_Release(cti);
8140 ICreateTypeLib2_Release(ctl);
8141 }else{
8142 USHORT found = 1;
8143 MEMBERID memid;
8144
8145 hr = ITypeLib_FindName(tl, nameW, 0, &ti, &memid, &found);
8146 ok(hr == S_OK, "for VT %u, got %08lx\n", TDATest->vt, hr);
8147 }
8148
8149 hr = ITypeInfo_GetTypeAttr(ti, &typeattr);
8150 ok(hr == S_OK, "got %08lx\n", hr);
8151
8152 if(TDATest->aux == AUX_HREF){
8153 size = href_cbSizeInstance;
8154 alignment = href_cbAlignment;
8155 }else{
8156 size = TDATest->size;
8157 if(size == -1){
8158 if(create)
8159 size = ptr_size;
8160 else
8161 size = sizeof(void*);
8162 }else if(TDATest->vt == VT_VARIANT){
8163 if(create){
8164 size = sizeof(VARIANT);
8165 if(ptr_size != sizeof(void*))
8166 size += (is_win64 ? -8 : 8); /* 32-bit variant is 8 bytes smaller than 64-bit variant */
8167 }else
8168 size = sizeof(VARIANT);
8169 }
8170 alignment = TDATest->align;
8171#ifdef _WIN64
8172 if(!create && ptr_size != sizeof(void*))
8173 alignment = TDATest->align3264;
8174#endif
8175 }
8176
8177 ok(typeattr->cbSizeInstance == size, "got wrong size for VT %u: 0x%lx\n", TDATest->vt, typeattr->cbSizeInstance);
8178 ok(typeattr->cbAlignment == alignment, "got wrong alignment for VT %u: 0x%x\n", TDATest->vt, typeattr->cbAlignment);
8179 ok(typeattr->tdescAlias.vt == TDATest->vt, "got wrong VT for VT %u: 0x%x\n", TDATest->vt, typeattr->tdescAlias.vt);
8180
8181 switch(TDATest->aux){
8182 case AUX_HREF:
8183 ok(typeattr->tdescAlias.hreftype == hreftype, "got wrong hreftype for VT %u: 0x%lx\n", TDATest->vt, typeattr->tdescAlias.hreftype);
8184 break;
8185 case AUX_TDESC:
8186 ok(typeattr->tdescAlias.lptdesc->vt == TDATest->tdesc.vt, "got wrong typedesc VT for VT %u: 0x%x\n", TDATest->vt, typeattr->tdescAlias.lptdesc->vt);
8187 break;
8188 case AUX_ADESC:
8189 ok(typeattr->tdescAlias.lpadesc->tdescElem.vt == TDATest->adesc.tdescElem.vt, "got wrong arraydesc element VT for VT %u: 0x%x\n", TDATest->vt, typeattr->tdescAlias.lpadesc->tdescElem.vt);
8190 ok(typeattr->tdescAlias.lpadesc->cDims == TDATest->adesc.cDims, "got wrong arraydesc dimension count for VT %u: 0x%x\n", TDATest->vt, typeattr->tdescAlias.lpadesc->cDims);
8191 ok(typeattr->tdescAlias.lpadesc->rgbounds[0].cElements == TDATest->adesc.rgbounds[0].cElements, "got wrong arraydesc element count for VT %u: 0x%lx\n", TDATest->vt, typeattr->tdescAlias.lpadesc->rgbounds[0].cElements);
8192 ok(typeattr->tdescAlias.lpadesc->rgbounds[0].lLbound == TDATest->adesc.rgbounds[0].lLbound, "got wrong arraydesc lower bound for VT %u: 0x%lx\n", TDATest->vt, typeattr->tdescAlias.lpadesc->rgbounds[0].lLbound);
8193 break;
8194 }
8195
8196 ITypeInfo_ReleaseTypeAttr(ti, typeattr);
8197 ITypeInfo_Release(ti);
8198}
struct tagVARIANT VARIANT
Definition: compat.h:2377
static const struct access_res create[16]
Definition: package.c:7505
#define AUX_TDESC
Definition: typelib.c:8057
#define AUX_ADESC
Definition: typelib.c:8058
#define AUX_HREF
Definition: typelib.c:8056
ARRAYDESC adesc
Definition: typelib.c:8066
WORD align
Definition: typelib.c:8062
VARTYPE vt
Definition: typelib.c:8060
TYPEDESC tdesc
Definition: typelib.c:8065
ULONG size
Definition: typelib.c:8061
WORD align3264
Definition: typelib.c:8063
DWORD aux
Definition: typelib.c:8064

Referenced by test_SetTypeDescAlias().

◆ uk_AddRef()

static ULONG WINAPI uk_AddRef ( IUnknown obj)
static

Definition at line 8320 of file typelib.c.

8321{
8322 return 2;
8323}

◆ uk_QueryInterface()

static HRESULT WINAPI uk_QueryInterface ( IUnknown obj,
REFIID  iid,
void **  out 
)
static

Definition at line 8315 of file typelib.c.

8316{
8317 return E_NOINTERFACE;
8318}

◆ uk_Release()

static ULONG WINAPI uk_Release ( IUnknown obj)
static

Definition at line 8325 of file typelib.c.

8326{
8327 return 1;
8328}

◆ variant_func()

static VARIANT WINAPI variant_func ( int  a0,
BOOL  a1,
DECIMAL  a2,
VARIANT  a3 
)
static

Definition at line 1407 of file typelib.c.

1408{
1409 VARIANT var;
1410 ok( a0 == 2233, "wrong arg0 %x\n", a0 );
1411 ok( a1 == 1 || broken(a1 == 0x55550001), "wrong arg1 %x\n", a1 );
1412 V_VT(&var) = VT_LPWSTR;
1413 V_UI4(&var) = 0xbabe;
1414 ok( a2.Hi32 == 1122, "wrong arg2.Hi32 %lx\n", a2.Hi32 );
1415 ok( a2.Lo64 == 3344, "wrong arg2.Lo64 %#I64x\n", a2.Lo64 );
1416 ok( V_VT(&a3) == VT_EMPTY, "wrong arg3 type %x\n", V_VT(&a3) );
1417 ok( V_UI4(&a3) == 0xdeadbeef, "wrong arg3 value %lx\n", V_UI4(&a3) );
1418 return var;
1419}

Referenced by test_DispCallFunc().

◆ variant_func2()

static VARIANT WINAPI variant_func2 ( VARIANT  v1,
VARIANT  v2 
)
static

Definition at line 1452 of file typelib.c.

1453{
1454 VARIANT ret;
1455
1456 ok(V_VT(&v1) == VT_I4, "unexpected %d\n", V_VT(&v1));
1457 ok(V_I4(&v1) == 2, "unexpected %ld\n", V_I4(&v1));
1458 ok(V_VT(&v2) == VT_BSTR, "unexpected %d\n", V_VT(&v2));
1459 ok(lstrcmpW(V_BSTR(&v2), testW) == 0, "unexpected %s\n", wine_dbgstr_w(V_BSTR(&v2)));
1460
1461 V_VT(&ret) = VT_UI4;
1462 V_I4(&ret) = 4321;
1463 return ret;
1464}

Referenced by test_DispCallFunc().

◆ void_func()

static int CDECL void_func ( int  a0,
int  a1 
)
static

Definition at line 1421 of file typelib.c.

1422{
1423#ifdef __i386__
1424 ok( a0 == 1111, "wrong arg0 %x\n", a0 );
1425 ok( a1 == 0, "wrong arg1 %x\n", a1 );
1426#else /* VT_EMPTY is passed as real arg on other platforms */
1427 ok( a0 == 0x55555555, "wrong arg0 %x\n", a0 );
1428 ok( a1 == 1111, "wrong arg1 %x\n", a1 );
1429#endif
1430 return 12;
1431}

◆ write_typelib()

static void write_typelib ( int  res_no,
const WCHAR filename 
)
static

Definition at line 828 of file typelib.c.

829{
830 DWORD written;
831 HANDLE file;
832 HRSRC res;
833 void *ptr;
834
836 ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" );
837 if (file == INVALID_HANDLE_VALUE) return;
838 res = FindResourceW( GetModuleHandleA(NULL), (const WCHAR *)MAKEINTRESOURCE(res_no), L"TYPELIB" );
839 ok( res != 0, "couldn't find typelib resource %d\n", res_no );
842 ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" );
843 CloseHandle( file );
844}
#define CreateFileW
Definition: compat.h:741
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
static PVOID ptr
Definition: dispmode.c:27
#define MAKEINTRESOURCE(i)
Definition: ntverrsrc.c:25

Referenced by create_test_typelib(), and test_LoadRegTypeLib().

Variable Documentation

◆ abi_supports_stdcall

const BOOL abi_supports_stdcall = FALSE
static

Definition at line 102 of file typelib.c.

Referenced by test_DispCallFunc().

◆ collection

◆ collectionvtbl

const ICollectionVtbl collectionvtbl
static
Initial value:
= {
}
static ULONG WINAPI collection_Release(ICollection *iface)
Definition: typelib.c:136
static HRESULT WINAPI collection_Invoke(ICollection *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr)
Definition: typelib.c:161
static HRESULT WINAPI collection_Item(ICollection *iface, int i, int *p)
Definition: typelib.c:184
static HRESULT WINAPI collection_GetTypeInfo(ICollection *iface, UINT index, LCID lcid, ITypeInfo **ti)
Definition: typelib.c:148
static HRESULT WINAPI collection_QueryInterface(ICollection *iface, REFIID riid, void **ret)
Definition: typelib.c:118
static HRESULT WINAPI collection_GetTypeInfoCount(ICollection *iface, UINT *cnt)
Definition: typelib.c:141
static ULONG WINAPI collection_AddRef(ICollection *iface)
Definition: typelib.c:131
static HRESULT WINAPI collection_GetIDsOfNames(ICollection *iface, REFIID riid, LPOLESTR *names, UINT cnt, LCID lcid, DISPID *dispid)
Definition: typelib.c:154

Definition at line 190 of file typelib.c.

◆ DWORD

Definition at line 90 of file typelib.c.

◆ info

const type_info info[]
static

Definition at line 4856 of file typelib.c.

◆ info_syskind

const SYSKIND info_syskind = SYS_WIN32
static

Definition at line 4855 of file typelib.c.

Referenced by test_dump_typelib().

◆ invoketest

IInvokeTest invoketest = { &invoketestvtbl }
static

Definition at line 342 of file typelib.c.

Referenced by test_invoke_func(), and test_TypeInfo().

◆ invoketestvtbl

const IInvokeTestVtbl invoketestvtbl
static
Initial value:
= {
}
static ULONG WINAPI invoketest_AddRef(IInvokeTest *iface)
Definition: typelib.c:216
static LONG WINAPI invoketest_get_testget2(IInvokeTest *iface, int *value)
Definition: typelib.c:281
static LONG WINAPI invoketest_putref_testprop2(IInvokeTest *iface, IUnknown *i)
Definition: typelib.c:263
static HRESULT WINAPI invoketest_testfunc(IInvokeTest *iface, int i, int *p)
Definition: typelib.c:268
static HRESULT WINAPI invoketest_GetTypeInfo(IInvokeTest *iface, UINT index, LCID lcid, ITypeInfo **ti)
Definition: typelib.c:233
static ULONG WINAPI invoketest_Release(IInvokeTest *iface)
Definition: typelib.c:221
static HRESULT WINAPI invoketest_GetTypeInfoCount(IInvokeTest *iface, UINT *cnt)
Definition: typelib.c:226
static int WINAPI invoketest_get_testget5(IInvokeTest *iface, int *value1, int value2)
Definition: typelib.c:297
static HRESULT WINAPI invoketest_Invoke(IInvokeTest *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr)
Definition: typelib.c:246
static LONG WINAPI invoketest_get_test(IInvokeTest *iface, LONG i)
Definition: typelib.c:253
static void WINAPI invoketest_get_testget8(IInvokeTest *iface, int *value)
Definition: typelib.c:311
static void WINAPI invoketest_get_testget7(IInvokeTest *iface, int value1, int value2)
Definition: typelib.c:307
static LONG WINAPI invoketest_putref_testprop(IInvokeTest *iface, LONG *i)
Definition: typelib.c:258
static HRESULT WINAPI invoketest_testget(IInvokeTest *iface, ICollection **p)
Definition: typelib.c:274
static void WINAPI invoketest_get_testput8(IInvokeTest *iface, int value)
Definition: typelib.c:315
static int WINAPI invoketest_get_testget3(IInvokeTest *iface)
Definition: typelib.c:287
static HRESULT WINAPI invoketest_GetIDsOfNames(IInvokeTest *iface, REFIID riid, LPOLESTR *names, UINT cnt, LCID lcid, DISPID *dispid)
Definition: typelib.c:239
static int WINAPI invoketest_get_testget6(IInvokeTest *iface, int value1, int value2)
Definition: typelib.c:302
static HRESULT WINAPI invoketest_QueryInterface(IInvokeTest *iface, REFIID riid, void **ret)
Definition: typelib.c:203
static int WINAPI invoketest_get_testget4(IInvokeTest *iface, int value)
Definition: typelib.c:292

Definition at line 319 of file typelib.c.

◆ is_win64

◆ is_wow64

BOOL is_wow64
static

Definition at line 97 of file typelib.c.

◆ LCID

OLECHAR OLECHAR *static LCID

Definition at line 87 of file typelib.c.

◆ LPBOOL

Definition at line 89 of file typelib.c.

◆ LPCWSTR

Definition at line 90 of file typelib.c.

◆ manifest_dep

const char manifest_dep[]
static
Initial value:
=
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
"<assemblyIdentity version=\"1.2.3.4\" name=\"testdep\" type=\"win32\" processorArchitecture=\"" ARCH "\"/>"
"<file name=\"test_actctx_tlb.tlb\">"
" <typelib tlbid=\"{d96d8a3e-78b6-4c8d-8f27-059db959be8a}\" version=\"2.7\" helpdir=\"\" resourceid=\"409\""
" flags=\"Restricted,cONTROL\""
" />"
"</file>"
"<file name=\"test_actctx_tlb2.tlb\">"
" <typelib tlbid=\"{a2cfdbd3-2bbf-4b1c-a414-5a5904e634c9}\" version=\"2.0\" helpdir=\"\" resourceid=\"409\""
" flags=\"RESTRICTED,CONTROL\""
" />"
"</file>"
"</assembly>"
#define ARCH
Definition: typelib.c:74

Definition at line 7880 of file typelib.c.

Referenced by test_LoadRegTypeLib().

◆ manifest_main

const char manifest_main[]
static
Initial value:
=
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
"<assemblyIdentity version=\"1.2.3.4\" name=\"Wine.Test\" type=\"win32\" />"
"<dependency>"
" <dependentAssembly>"
" <assemblyIdentity type=\"win32\" name=\"testdep\" version=\"1.2.3.4\" processorArchitecture=\"" ARCH "\" />"
" </dependentAssembly>"
"</dependency>"
"</assembly>"

Definition at line 7895 of file typelib.c.

Referenced by test_LoadRegTypeLib().

◆ REGSAM

Definition at line 90 of file typelib.c.

◆ SYSKIND

◆ TDATests

struct _TDATest TDATests[]
static

Referenced by test_SetTypeDescAlias().

◆ testW

◆ uk

IUnknown uk = {&vt}

Definition at line 8336 of file typelib.c.

Referenced by test_IsDomainLegalCookieDomainW(), and test_stub().

◆ vt

IUnknownVtbl vt
Initial value:
= {
}
static HRESULT WINAPI uk_QueryInterface(IUnknown *obj, REFIID iid, void **out)
Definition: typelib.c:8315
static ULONG WINAPI uk_Release(IUnknown *obj)
Definition: typelib.c:8325
static ULONG WINAPI uk_AddRef(IUnknown *obj)
Definition: typelib.c:8320

Definition at line 8330 of file typelib.c.

◆ vtable

◆ vtable2

void* vtable2[] = { NULL, NULL, NULL, inst_func2 }
static

Definition at line 1501 of file typelib.c.

Referenced by test_DispCallFunc().

◆ WORD

OLECHAR OLECHAR *static WORD

Definition at line 87 of file typelib.c.

◆ wszGUID

WCHAR wszGUID[] = {'G','U','I','D',0}
static

Definition at line 93 of file typelib.c.

Referenced by test_FindName(), and test_TypeComp().

◆ wszguid

WCHAR wszguid[] = {'g','u','i','d',0}
static

Definition at line 94 of file typelib.c.

Referenced by test_FindName(), and test_TypeComp().

◆ wszStdOle2

const WCHAR wszStdOle2[] = {'s','t','d','o','l','e','2','.','t','l','b',0}
static