2004-08-19 22:29:16 +02:00
/*
* ITypeLib and ITypeInfo test
*
* Copyright 2004 Jacek Caban
2006-10-22 17:01:24 +02:00
* Copyright 2006 Dmitry Timoshkov
2004-08-19 22:29:16 +02:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
2006-05-18 14:49:52 +02:00
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA
2004-08-19 22:29:16 +02:00
*/
# define COBJMACROS
2012-12-14 21:07:50 +01:00
# define CONST_VTABLE
2004-08-19 22:29:16 +02:00
# include <wine/test.h>
# include <stdarg.h>
2007-10-06 00:55:56 +02:00
# include <stdio.h>
2004-08-19 22:29:16 +02:00
# include "windef.h"
# include "winbase.h"
# include "oleauto.h"
2006-07-06 13:54:48 +02:00
# include "ocidl.h"
2006-10-22 17:01:24 +02:00
# include "shlwapi.h"
2007-05-11 16:23:31 +02:00
# include "tmarshal.h"
2004-08-19 22:29:16 +02:00
2010-04-01 14:02:17 +02:00
# include "test_reg.h"
2007-10-06 00:55:56 +02:00
# define expect_eq(expr, value, type, format) { type _ret = (expr); ok((value) == _ret, #expr " expected " format " got " format "\n", value, _ret); }
2009-05-20 20:19:59 +02:00
# 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")
2007-10-06 00:55:56 +02:00
# define expect_null(expr) expect_eq(expr, NULL, const void *, "%p")
2008-09-13 15:13:56 +02:00
# define expect_wstr_acpval(expr, value) \
2007-10-06 00:55:56 +02:00
{ \
CHAR buf [ 260 ] ; \
2008-09-13 15:13:56 +02:00
expect_eq ( ! WideCharToMultiByte ( CP_ACP , 0 , ( expr ) , - 1 , buf , 260 , NULL , NULL ) , 0 , int , " %d " ) ; \
2007-10-06 00:55:56 +02:00
ok ( lstrcmp ( value , buf ) = = 0 , # expr " expected \" %s \" got \" %s \" \n " , value , buf ) ; \
}
# define ole_expect(expr, expect) { \
HRESULT r = expr ; \
ok ( r = = ( expect ) , # expr " returned %x, expected %s (%x) \n " , r , # expect , expect ) ; \
}
# define ole_check(expr) ole_expect(expr, S_OK);
2006-10-12 13:56:01 +02:00
# define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08x\n", hr)
2005-12-06 21:23:19 +01:00
2013-08-22 14:50:34 +02:00
# ifdef __i386__
# define ARCH "x86"
# elif defined __x86_64__
# define ARCH "amd64"
# else
# define ARCH "none"
# endif
2010-07-30 14:44:19 +02:00
static HRESULT WINAPI ( * pRegisterTypeLibForUser ) ( ITypeLib * , OLECHAR * , OLECHAR * ) ;
static HRESULT WINAPI ( * pUnRegisterTypeLibForUser ) ( REFGUID , WORD , WORD , LCID , SYSKIND ) ;
2013-08-22 14:50:34 +02:00
static BOOL ( WINAPI * pActivateActCtx ) ( HANDLE , ULONG_PTR * ) ;
static HANDLE ( WINAPI * pCreateActCtxW ) ( PCACTCTXW ) ;
static BOOL ( WINAPI * pDeactivateActCtx ) ( DWORD , ULONG_PTR ) ;
static VOID ( WINAPI * pReleaseActCtx ) ( HANDLE ) ;
2006-02-16 19:33:08 +01:00
static const WCHAR wszStdOle2 [ ] = { ' s ' , ' t ' , ' d ' , ' o ' , ' l ' , ' e ' , ' 2 ' , ' . ' , ' t ' , ' l ' , ' b ' , 0 } ;
2012-01-26 11:42:35 +01:00
static WCHAR wszGUID [ ] = { ' G ' , ' U ' , ' I ' , ' D ' , 0 } ;
static WCHAR wszguid [ ] = { ' g ' , ' u ' , ' i ' , ' d ' , 0 } ;
2006-02-16 19:33:08 +01:00
2010-08-26 12:22:20 +02:00
static const int is_win64 = sizeof ( void * ) > sizeof ( int ) ;
2012-12-14 21:07:50 +01:00
static HRESULT WINAPI invoketest_QueryInterface ( IInvokeTest * iface , REFIID riid , void * * ret )
{
if ( IsEqualIID ( riid , & IID_IUnknown ) | |
IsEqualIID ( riid , & IID_IDispatch ) | |
IsEqualIID ( riid , & IID_IInvokeTest ) )
{
* ret = iface ;
return S_OK ;
}
return E_NOINTERFACE ;
}
static ULONG WINAPI invoketest_AddRef ( IInvokeTest * iface )
{
return 2 ;
}
static ULONG WINAPI invoketest_Release ( IInvokeTest * iface )
{
return 1 ;
}
static HRESULT WINAPI invoketest_GetTypeInfoCount ( IInvokeTest * iface , UINT * cnt )
{
ok ( 0 , " unexpected call \n " ) ;
* cnt = 0 ;
return E_NOTIMPL ;
}
static HRESULT WINAPI invoketest_GetTypeInfo ( IInvokeTest * iface , UINT index , LCID lcid , ITypeInfo * * ti )
{
ok ( 0 , " unexpected call \n " ) ;
return E_NOTIMPL ;
}
static HRESULT WINAPI invoketest_GetIDsOfNames ( IInvokeTest * iface , REFIID riid , LPOLESTR * names ,
UINT cnt , LCID lcid , DISPID * dispid )
{
ok ( 0 , " unexpected call \n " ) ;
return E_NOTIMPL ;
}
static HRESULT WINAPI invoketest_Invoke ( IInvokeTest * iface , DISPID dispid , REFIID riid ,
LCID lcid , WORD flags , DISPPARAMS * dispparams , VARIANT * res , EXCEPINFO * ei , UINT * argerr )
{
ok ( 0 , " unexpected call \n " ) ;
return E_NOTIMPL ;
}
static LONG WINAPI invoketest_get_test ( IInvokeTest * iface , LONG i )
{
return i + 1 ;
}
static const IInvokeTestVtbl invoketestvtbl = {
invoketest_QueryInterface ,
invoketest_AddRef ,
invoketest_Release ,
invoketest_GetTypeInfoCount ,
invoketest_GetTypeInfo ,
invoketest_GetIDsOfNames ,
invoketest_Invoke ,
invoketest_get_test
} ;
static IInvokeTest invoketest = { & invoketestvtbl } ;
2010-07-30 14:44:19 +02:00
static void init_function_pointers ( void )
{
HMODULE hmod = GetModuleHandleA ( " oleaut32.dll " ) ;
2013-08-22 14:50:34 +02:00
HMODULE hk32 = GetModuleHandleA ( " kernel32.dll " ) ;
2010-07-30 14:44:19 +02:00
pRegisterTypeLibForUser = ( void * ) GetProcAddress ( hmod , " RegisterTypeLibForUser " ) ;
pUnRegisterTypeLibForUser = ( void * ) GetProcAddress ( hmod , " UnRegisterTypeLibForUser " ) ;
2013-08-22 14:50:34 +02:00
pActivateActCtx = ( void * ) GetProcAddress ( hk32 , " ActivateActCtx " ) ;
pCreateActCtxW = ( void * ) GetProcAddress ( hk32 , " CreateActCtxW " ) ;
pDeactivateActCtx = ( void * ) GetProcAddress ( hk32 , " DeactivateActCtx " ) ;
pReleaseActCtx = ( void * ) GetProcAddress ( hk32 , " ReleaseActCtx " ) ;
2010-07-30 14:44:19 +02:00
}
2005-06-16 12:45:25 +02:00
static void ref_count_test ( LPCWSTR type_lib )
2004-08-19 22:29:16 +02:00
{
ITypeLib * iface ;
ITypeInfo * iti1 , * iti2 ;
HRESULT hRes ;
int ref_count ;
trace ( " Loading type library \n " ) ;
hRes = LoadTypeLib ( type_lib , & iface ) ;
ok ( hRes = = S_OK , " Could not load type library \n " ) ;
if ( hRes ! = S_OK )
return ;
hRes = ITypeLib_GetTypeInfo ( iface , 1 , & iti1 ) ;
ok ( hRes = = S_OK , " ITypeLib_GetTypeInfo failed on index = 1 \n " ) ;
ok ( ref_count = ITypeLib_Release ( iface ) > 0 , " ITypeLib destroyed while ITypeInfo has back pointer \n " ) ;
if ( ! ref_count )
return ;
hRes = ITypeLib_GetTypeInfo ( iface , 1 , & iti2 ) ;
ok ( hRes = = S_OK , " ITypeLib_GetTypeInfo failed on index = 1 \n " ) ;
ok ( iti1 = = iti2 , " ITypeLib_GetTypeInfo returned different pointers for same indexes \n " ) ;
ITypeLib_AddRef ( iface ) ;
ITypeInfo_Release ( iti2 ) ;
ITypeInfo_Release ( iti1 ) ;
ok ( ITypeLib_Release ( iface ) = = 0 , " ITypeLib should be destroyed here. \n " ) ;
}
2005-12-06 21:23:19 +01:00
static void test_TypeComp ( void )
{
ITypeLib * pTypeLib ;
ITypeComp * pTypeComp ;
HRESULT hr ;
ULONG ulHash ;
DESCKIND desckind ;
BINDPTR bindptr ;
ITypeInfo * pTypeInfo ;
2006-07-06 13:54:48 +02:00
ITypeInfo * pFontTypeInfo ;
2011-01-11 10:10:00 +01:00
ITypeComp * pTypeComp_tmp ;
2005-12-06 21:23:19 +01:00
static WCHAR wszStdFunctions [ ] = { ' S ' , ' t ' , ' d ' , ' F ' , ' u ' , ' n ' , ' c ' , ' t ' , ' i ' , ' o ' , ' n ' , ' s ' , 0 } ;
static WCHAR wszSavePicture [ ] = { ' S ' , ' a ' , ' v ' , ' e ' , ' P ' , ' i ' , ' c ' , ' t ' , ' u ' , ' r ' , ' e ' , 0 } ;
static WCHAR wszOLE_TRISTATE [ ] = { ' O ' , ' L ' , ' E ' , ' _ ' , ' T ' , ' R ' , ' I ' , ' S ' , ' T ' , ' A ' , ' T ' , ' E ' , 0 } ;
static WCHAR wszUnchecked [ ] = { ' U ' , ' n ' , ' c ' , ' h ' , ' e ' , ' c ' , ' k ' , ' e ' , ' d ' , 0 } ;
static WCHAR wszIUnknown [ ] = { ' I ' , ' U ' , ' n ' , ' k ' , ' n ' , ' o ' , ' w ' , ' n ' , 0 } ;
static WCHAR wszFont [ ] = { ' F ' , ' o ' , ' n ' , ' t ' , 0 } ;
static WCHAR wszStdPicture [ ] = { ' S ' , ' t ' , ' d ' , ' P ' , ' i ' , ' c ' , ' t ' , ' u ' , ' r ' , ' e ' , 0 } ;
static WCHAR wszOLE_COLOR [ ] = { ' O ' , ' L ' , ' E ' , ' _ ' , ' C ' , ' O ' , ' L ' , ' O ' , ' R ' , 0 } ;
2006-07-06 13:54:48 +02:00
static WCHAR wszClone [ ] = { ' C ' , ' l ' , ' o ' , ' n ' , ' e ' , 0 } ;
2006-07-06 13:55:05 +02:00
static WCHAR wszclone [ ] = { ' c ' , ' l ' , ' o ' , ' n ' , ' e ' , 0 } ;
2010-07-16 19:27:27 +02:00
static WCHAR wszJunk [ ] = { ' J ' , ' u ' , ' n ' , ' k ' , 0 } ;
2010-11-09 23:04:10 +01:00
static WCHAR wszAddRef [ ] = { ' A ' , ' d ' , ' d ' , ' R ' , ' e ' , ' f ' , 0 } ;
2005-12-06 21:23:19 +01:00
hr = LoadTypeLib ( wszStdOle2 , & pTypeLib ) ;
ok_ole_success ( hr , LoadTypeLib ) ;
hr = ITypeLib_GetTypeComp ( pTypeLib , & pTypeComp ) ;
ok_ole_success ( hr , ITypeLib_GetTypeComp ) ;
/* test getting a TKIND_MODULE */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszStdFunctions ) ;
hr = ITypeComp_Bind ( pTypeComp , wszStdFunctions , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_TYPECOMP ,
" desckind should have been DESCKIND_TYPECOMP instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ITypeComp_Release ( bindptr . lptcomp ) ;
/* test getting a TKIND_MODULE with INVOKE_PROPERTYGET */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszStdFunctions ) ;
hr = ITypeComp_Bind ( pTypeComp , wszStdFunctions , ulHash , INVOKE_PROPERTYGET , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_TYPECOMP ,
" desckind should have been DESCKIND_TYPECOMP instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
2006-10-24 14:01:23 +02:00
ITypeComp_Release ( bindptr . lptcomp ) ;
2005-12-06 21:23:19 +01:00
/* test getting a function within a TKIND_MODULE */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszSavePicture ) ;
hr = ITypeComp_Bind ( pTypeComp , wszSavePicture , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_FUNCDESC ,
" desckind should have been DESCKIND_FUNCDESC instead of %d \n " ,
desckind ) ;
ok ( bindptr . lpfuncdesc ! = NULL , " bindptr.lpfuncdesc should not have been set to NULL \n " ) ;
ITypeInfo_ReleaseFuncDesc ( pTypeInfo , bindptr . lpfuncdesc ) ;
ITypeInfo_Release ( pTypeInfo ) ;
/* test getting a function within a TKIND_MODULE with INVOKE_PROPERTYGET */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszSavePicture ) ;
hr = ITypeComp_Bind ( pTypeComp , wszSavePicture , ulHash , INVOKE_PROPERTYGET , & pTypeInfo , & desckind , & bindptr ) ;
2010-03-12 21:54:46 +01:00
ok ( hr = = TYPE_E_TYPEMISMATCH ,
2006-10-12 13:56:01 +02:00
" ITypeComp_Bind should have failed with TYPE_E_TYPEMISMATCH instead of 0x%08x \n " ,
2005-12-06 21:23:19 +01:00
hr ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
/* test getting a TKIND_ENUM */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszOLE_TRISTATE ) ;
hr = ITypeComp_Bind ( pTypeComp , wszOLE_TRISTATE , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_TYPECOMP ,
" desckind should have been DESCKIND_TYPECOMP instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ITypeComp_Release ( bindptr . lptcomp ) ;
/* test getting a value within a TKIND_ENUM */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszUnchecked ) ;
hr = ITypeComp_Bind ( pTypeComp , wszUnchecked , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_VARDESC ,
" desckind should have been DESCKIND_VARDESC instead of %d \n " ,
desckind ) ;
ITypeInfo_ReleaseVarDesc ( pTypeInfo , bindptr . lpvardesc ) ;
ITypeInfo_Release ( pTypeInfo ) ;
/* test getting a TKIND_INTERFACE */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszIUnknown ) ;
hr = ITypeComp_Bind ( pTypeComp , wszIUnknown , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
/* test getting a TKIND_DISPATCH */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszFont ) ;
hr = ITypeComp_Bind ( pTypeComp , wszFont , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
/* test getting a TKIND_RECORD/TKIND_ALIAS */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
hr = ITypeComp_Bind ( pTypeComp , wszGUID , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
/* test getting a TKIND_ALIAS */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszOLE_COLOR ) ;
hr = ITypeComp_Bind ( pTypeComp , wszOLE_COLOR , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
/* test getting a TKIND_COCLASS */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszStdPicture ) ;
hr = ITypeComp_Bind ( pTypeComp , wszStdPicture , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
2011-01-11 10:10:00 +01:00
/* test basic BindType argument handling */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
hr = ITypeComp_BindType ( pTypeComp , wszGUID , ulHash , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " Got %08x \n " , hr ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
pTypeInfo = ( void * ) 0xdeadbeef ;
hr = ITypeComp_BindType ( pTypeComp , wszGUID , ulHash , & pTypeInfo , NULL ) ;
ok ( hr = = E_INVALIDARG , " Got %08x \n " , hr ) ;
ok ( pTypeInfo = = ( void * ) 0xdeadbeef , " Got %p \n " , pTypeInfo ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
pTypeComp_tmp = ( void * ) 0xdeadbeef ;
hr = ITypeComp_BindType ( pTypeComp , wszGUID , ulHash , NULL , & pTypeComp_tmp ) ;
ok ( hr = = E_INVALIDARG , " Got %08x \n " , hr ) ;
ok ( pTypeComp_tmp = = ( void * ) 0xdeadbeef , " Got %p \n " , pTypeComp_tmp ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
pTypeComp_tmp = ( void * ) 0xdeadbeef ;
pTypeInfo = ( void * ) 0xdeadbeef ;
hr = ITypeComp_BindType ( pTypeComp , NULL , ulHash , & pTypeInfo , & pTypeComp_tmp ) ;
ok ( hr = = E_INVALIDARG , " Got %08x \n " , hr ) ;
ok ( pTypeInfo = = ( void * ) 0xdeadbeef , " Got %p \n " , pTypeInfo ) ;
ok ( pTypeComp_tmp = = ( void * ) 0xdeadbeef , " Got %p \n " , pTypeComp_tmp ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszGUID ) ;
pTypeComp_tmp = ( void * ) 0xdeadbeef ;
pTypeInfo = ( void * ) 0xdeadbeef ;
hr = ITypeComp_BindType ( pTypeComp , wszGUID , ulHash , & pTypeInfo , & pTypeComp_tmp ) ;
ok_ole_success ( hr , ITypeComp_BindType ) ;
ok ( pTypeInfo ! = NULL , " Got NULL pTypeInfo \n " ) ;
todo_wine ok ( pTypeComp_tmp = = NULL , " Got pTypeComp_tmp %p \n " , pTypeComp_tmp ) ;
ITypeInfo_Release ( pTypeInfo ) ;
2011-01-11 10:10:01 +01:00
if ( pTypeComp_tmp ) ITypeComp_Release ( pTypeComp_tmp ) ; /* fixme */
/* test BindType case-insensitivity */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszguid ) ;
pTypeComp_tmp = ( void * ) 0xdeadbeef ;
pTypeInfo = ( void * ) 0xdeadbeef ;
hr = ITypeComp_BindType ( pTypeComp , wszguid , ulHash , & pTypeInfo , & pTypeComp_tmp ) ;
ok_ole_success ( hr , ITypeComp_BindType ) ;
ok ( pTypeInfo ! = NULL , " Got NULL pTypeInfo \n " ) ;
todo_wine ok ( pTypeComp_tmp = = NULL , " Got pTypeComp_tmp %p \n " , pTypeComp_tmp ) ;
ITypeInfo_Release ( pTypeInfo ) ;
2011-01-11 10:10:00 +01:00
if ( pTypeComp_tmp ) ITypeComp_Release ( pTypeComp_tmp ) ; /* fixme */
2005-12-06 21:23:19 +01:00
ITypeComp_Release ( pTypeComp ) ;
2006-07-06 13:54:48 +02:00
/* tests for ITypeComp on an interface */
hr = ITypeLib_GetTypeInfoOfGuid ( pTypeLib , & IID_IFont , & pFontTypeInfo ) ;
ok_ole_success ( hr , ITypeLib_GetTypeInfoOfGuid ) ;
hr = ITypeInfo_GetTypeComp ( pFontTypeInfo , & pTypeComp ) ;
ok_ole_success ( hr , ITypeLib_GetTypeComp ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszClone ) ;
hr = ITypeComp_Bind ( pTypeComp , wszClone , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_FUNCDESC ,
" desckind should have been DESCKIND_FUNCDESC instead of %d \n " ,
desckind ) ;
ok ( bindptr . lpfuncdesc ! = NULL , " bindptr.lpfuncdesc should not have been set to NULL \n " ) ;
ITypeInfo_ReleaseFuncDesc ( pTypeInfo , bindptr . lpfuncdesc ) ;
ITypeInfo_Release ( pTypeInfo ) ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszClone ) ;
hr = ITypeComp_Bind ( pTypeComp , wszClone , ulHash , INVOKE_PROPERTYGET , & pTypeInfo , & desckind , & bindptr ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = TYPE_E_TYPEMISMATCH , " ITypeComp_Bind should have failed with TYPE_E_TYPEMISMATCH instead of 0x%08x \n " , hr ) ;
2006-07-06 13:54:48 +02:00
ok ( desckind = = DESCKIND_NONE ,
" desckind should have been DESCKIND_NONE instead of %d \n " ,
desckind ) ;
ok ( ! pTypeInfo , " pTypeInfo should have been set to NULL \n " ) ;
ok ( ! bindptr . lptcomp , " bindptr should have been set to NULL \n " ) ;
2006-07-06 13:55:05 +02:00
/* tests that the compare is case-insensitive */
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszclone ) ;
hr = ITypeComp_Bind ( pTypeComp , wszclone , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_FUNCDESC ,
" desckind should have been DESCKIND_FUNCDESC instead of %d \n " ,
desckind ) ;
ok ( bindptr . lpfuncdesc ! = NULL , " bindptr.lpfuncdesc should not have been set to NULL \n " ) ;
ITypeInfo_ReleaseFuncDesc ( pTypeInfo , bindptr . lpfuncdesc ) ;
ITypeInfo_Release ( pTypeInfo ) ;
2010-08-24 09:53:35 +02:00
/* tests nonexistent members */
2010-07-16 19:27:27 +02:00
desckind = 0xdeadbeef ;
bindptr . lptcomp = ( ITypeComp * ) 0xdeadbeef ;
pTypeInfo = ( ITypeInfo * ) 0xdeadbeef ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszJunk ) ;
hr = ITypeComp_Bind ( pTypeComp , wszJunk , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_NONE , " desckind should have been DESCKIND_NONE, was: %d \n " , desckind ) ;
ok ( pTypeInfo = = NULL , " pTypeInfo should have been NULL, was: %p \n " , pTypeInfo ) ;
ok ( bindptr . lptcomp = = NULL , " bindptr should have been NULL, was: %p \n " , bindptr . lptcomp ) ;
2010-11-09 23:04:10 +01:00
/* tests inherited members */
desckind = 0xdeadbeef ;
bindptr . lpfuncdesc = NULL ;
pTypeInfo = NULL ;
ulHash = LHashValOfNameSys ( SYS_WIN32 , LOCALE_NEUTRAL , wszAddRef ) ;
hr = ITypeComp_Bind ( pTypeComp , wszAddRef , ulHash , 0 , & pTypeInfo , & desckind , & bindptr ) ;
ok_ole_success ( hr , ITypeComp_Bind ) ;
ok ( desckind = = DESCKIND_FUNCDESC , " desckind should have been DESCKIND_FUNCDESC, was: %d \n " , desckind ) ;
ok ( pTypeInfo ! = NULL , " pTypeInfo should not have been NULL, was: %p \n " , pTypeInfo ) ;
ok ( bindptr . lpfuncdesc ! = NULL , " bindptr should not have been NULL, was: %p \n " , bindptr . lpfuncdesc ) ;
ITypeInfo_ReleaseFuncDesc ( pTypeInfo , bindptr . lpfuncdesc ) ;
ITypeInfo_Release ( pTypeInfo ) ;
2006-07-06 13:54:48 +02:00
ITypeComp_Release ( pTypeComp ) ;
ITypeInfo_Release ( pFontTypeInfo ) ;
2005-12-06 21:23:19 +01:00
ITypeLib_Release ( pTypeLib ) ;
}
2006-02-06 20:57:09 +01:00
static void test_CreateDispTypeInfo ( void )
{
ITypeInfo * pTypeInfo , * pTI2 ;
HRESULT hr ;
INTERFACEDATA ifdata ;
METHODDATA methdata [ 4 ] ;
PARAMDATA parms1 [ 2 ] ;
PARAMDATA parms3 [ 1 ] ;
TYPEATTR * pTypeAttr ;
HREFTYPE href ;
FUNCDESC * pFuncDesc ;
2006-03-21 14:45:51 +01:00
MEMBERID memid ;
2006-02-06 20:57:09 +01:00
2007-01-23 14:41:12 +01:00
static WCHAR func1 [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , ' 1 ' , 0 } ;
2006-02-06 20:57:09 +01:00
static const WCHAR func2 [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , ' 2 ' , 0 } ;
static const WCHAR func3 [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , ' 3 ' , 0 } ;
static const WCHAR parm1 [ ] = { ' p ' , ' a ' , ' r ' , ' m ' , ' 1 ' , 0 } ;
static const WCHAR parm2 [ ] = { ' p ' , ' a ' , ' r ' , ' m ' , ' 2 ' , 0 } ;
2007-01-23 14:41:12 +01:00
OLECHAR * name = func1 ;
2006-03-21 14:45:51 +01:00
2006-02-06 20:57:09 +01:00
ifdata . pmethdata = methdata ;
ifdata . cMembers = sizeof ( methdata ) / sizeof ( methdata [ 0 ] ) ;
methdata [ 0 ] . szName = SysAllocString ( func1 ) ;
methdata [ 0 ] . ppdata = parms1 ;
methdata [ 0 ] . dispid = 0x123 ;
methdata [ 0 ] . iMeth = 0 ;
methdata [ 0 ] . cc = CC_STDCALL ;
methdata [ 0 ] . cArgs = 2 ;
methdata [ 0 ] . wFlags = DISPATCH_METHOD ;
methdata [ 0 ] . vtReturn = VT_HRESULT ;
parms1 [ 0 ] . szName = SysAllocString ( parm1 ) ;
parms1 [ 0 ] . vt = VT_I4 ;
parms1 [ 1 ] . szName = SysAllocString ( parm2 ) ;
parms1 [ 1 ] . vt = VT_BSTR ;
methdata [ 1 ] . szName = SysAllocString ( func2 ) ;
methdata [ 1 ] . ppdata = NULL ;
methdata [ 1 ] . dispid = 0x124 ;
methdata [ 1 ] . iMeth = 1 ;
methdata [ 1 ] . cc = CC_STDCALL ;
methdata [ 1 ] . cArgs = 0 ;
methdata [ 1 ] . wFlags = DISPATCH_PROPERTYGET ;
methdata [ 1 ] . vtReturn = VT_I4 ;
methdata [ 2 ] . szName = SysAllocString ( func3 ) ;
methdata [ 2 ] . ppdata = parms3 ;
methdata [ 2 ] . dispid = 0x125 ;
methdata [ 2 ] . iMeth = 3 ;
methdata [ 2 ] . cc = CC_STDCALL ;
methdata [ 2 ] . cArgs = 1 ;
methdata [ 2 ] . wFlags = DISPATCH_PROPERTYPUT ;
methdata [ 2 ] . vtReturn = VT_HRESULT ;
parms3 [ 0 ] . szName = SysAllocString ( parm1 ) ;
parms3 [ 0 ] . vt = VT_I4 ;
methdata [ 3 ] . szName = SysAllocString ( func3 ) ;
methdata [ 3 ] . ppdata = NULL ;
methdata [ 3 ] . dispid = 0x125 ;
methdata [ 3 ] . iMeth = 4 ;
methdata [ 3 ] . cc = CC_STDCALL ;
methdata [ 3 ] . cArgs = 0 ;
methdata [ 3 ] . wFlags = DISPATCH_PROPERTYGET ;
methdata [ 3 ] . vtReturn = VT_I4 ;
hr = CreateDispTypeInfo ( & ifdata , LOCALE_NEUTRAL , & pTypeInfo ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
hr = ITypeInfo_GetTypeAttr ( pTypeInfo , & pTypeAttr ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
ok ( pTypeAttr - > typekind = = TKIND_COCLASS , " typekind %0x \n " , pTypeAttr - > typekind ) ;
ok ( pTypeAttr - > cImplTypes = = 1 , " cImplTypes %d \n " , pTypeAttr - > cImplTypes ) ;
ok ( pTypeAttr - > cFuncs = = 0 , " cFuncs %d \n " , pTypeAttr - > cFuncs ) ;
ok ( pTypeAttr - > wTypeFlags = = 0 , " wTypeFlags %04x \n " , pTypeAttr - > cFuncs ) ;
ITypeInfo_ReleaseTypeAttr ( pTypeInfo , pTypeAttr ) ;
hr = ITypeInfo_GetRefTypeOfImplType ( pTypeInfo , 0 , & href ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( href = = 0 , " href = 0x%x \n " , href ) ;
2006-02-06 20:57:09 +01:00
hr = ITypeInfo_GetRefTypeInfo ( pTypeInfo , href , & pTI2 ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
hr = ITypeInfo_GetTypeAttr ( pTI2 , & pTypeAttr ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
ok ( pTypeAttr - > typekind = = TKIND_INTERFACE , " typekind %0x \n " , pTypeAttr - > typekind ) ;
2007-05-18 14:57:05 +02:00
ok ( pTypeAttr - > cFuncs = = 4 , " cFuncs %d \n " , pTypeAttr - > cFuncs ) ;
ok ( IsEqualGUID ( & pTypeAttr - > guid , & GUID_NULL ) , " guid {%08x-...} \n " , pTypeAttr - > guid . Data1 ) ;
ok ( pTypeAttr - > wTypeFlags = = 0 , " typeflags %08x \n " , pTypeAttr - > wTypeFlags ) ;
2006-02-06 20:57:09 +01:00
ITypeInfo_ReleaseTypeAttr ( pTI2 , pTypeAttr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI2 , 0 , & pFuncDesc ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2007-05-18 14:57:05 +02:00
ok ( pFuncDesc - > memid = = 0x123 , " memid %x \n " , pFuncDesc - > memid ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > funckind = = FUNC_VIRTUAL , " funckind %d \n " , pFuncDesc - > funckind ) ;
ok ( pFuncDesc - > invkind = = methdata [ 0 ] . wFlags , " invkind %d \n " , pFuncDesc - > invkind ) ;
ok ( pFuncDesc - > callconv = = methdata [ 0 ] . cc , " callconv %d \n " , pFuncDesc - > callconv ) ;
ok ( pFuncDesc - > cParams = = methdata [ 0 ] . cArgs , " cParams %d \n " , pFuncDesc - > cParams ) ;
ok ( pFuncDesc - > oVft = = 0 , " oVft %d \n " , pFuncDesc - > oVft ) ;
ok ( pFuncDesc - > wFuncFlags = = 0 , " oVft %d \n " , pFuncDesc - > wFuncFlags ) ;
ok ( pFuncDesc - > elemdescFunc . tdesc . vt = = VT_HRESULT , " ret vt %x \n " , pFuncDesc - > elemdescFunc . tdesc . vt ) ;
ok ( pFuncDesc - > lprgelemdescParam [ 0 ] . tdesc . vt = = VT_I4 , " parm 0 vt %x \n " , pFuncDesc - > lprgelemdescParam [ 0 ] . tdesc . vt ) ;
2006-11-07 00:43:24 +01:00
ok ( U ( pFuncDesc - > lprgelemdescParam [ 0 ] ) . paramdesc . wParamFlags = = PARAMFLAG_NONE , " parm 0 flags %x \n " , U ( pFuncDesc - > lprgelemdescParam [ 0 ] ) . paramdesc . wParamFlags ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > lprgelemdescParam [ 1 ] . tdesc . vt = = VT_BSTR , " parm 1 vt %x \n " , pFuncDesc - > lprgelemdescParam [ 1 ] . tdesc . vt ) ;
2006-11-07 00:43:24 +01:00
ok ( U ( pFuncDesc - > lprgelemdescParam [ 1 ] ) . paramdesc . wParamFlags = = PARAMFLAG_NONE , " parm 1 flags %x \n " , U ( pFuncDesc - > lprgelemdescParam [ 1 ] ) . paramdesc . wParamFlags ) ;
2006-02-06 20:57:09 +01:00
ITypeInfo_ReleaseFuncDesc ( pTI2 , pFuncDesc ) ;
hr = ITypeInfo_GetFuncDesc ( pTI2 , 1 , & pFuncDesc ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > funckind = = FUNC_VIRTUAL , " funckind %d \n " , pFuncDesc - > funckind ) ;
ok ( pFuncDesc - > invkind = = methdata [ 1 ] . wFlags , " invkind %d \n " , pFuncDesc - > invkind ) ;
ok ( pFuncDesc - > callconv = = methdata [ 1 ] . cc , " callconv %d \n " , pFuncDesc - > callconv ) ;
ok ( pFuncDesc - > cParams = = methdata [ 1 ] . cArgs , " cParams %d \n " , pFuncDesc - > cParams ) ;
2009-01-29 13:30:05 +01:00
ok ( pFuncDesc - > oVft = = sizeof ( void * ) , " oVft %d \n " , pFuncDesc - > oVft ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > wFuncFlags = = 0 , " oVft %d \n " , pFuncDesc - > wFuncFlags ) ;
ok ( pFuncDesc - > elemdescFunc . tdesc . vt = = VT_I4 , " ret vt %x \n " , pFuncDesc - > elemdescFunc . tdesc . vt ) ;
ITypeInfo_ReleaseFuncDesc ( pTI2 , pFuncDesc ) ;
hr = ITypeInfo_GetFuncDesc ( pTI2 , 2 , & pFuncDesc ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > funckind = = FUNC_VIRTUAL , " funckind %d \n " , pFuncDesc - > funckind ) ;
ok ( pFuncDesc - > invkind = = methdata [ 2 ] . wFlags , " invkind %d \n " , pFuncDesc - > invkind ) ;
ok ( pFuncDesc - > callconv = = methdata [ 2 ] . cc , " callconv %d \n " , pFuncDesc - > callconv ) ;
ok ( pFuncDesc - > cParams = = methdata [ 2 ] . cArgs , " cParams %d \n " , pFuncDesc - > cParams ) ;
2009-01-29 13:30:05 +01:00
ok ( pFuncDesc - > oVft = = 3 * sizeof ( void * ) , " oVft %d \n " , pFuncDesc - > oVft ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > wFuncFlags = = 0 , " oVft %d \n " , pFuncDesc - > wFuncFlags ) ;
ok ( pFuncDesc - > elemdescFunc . tdesc . vt = = VT_HRESULT , " ret vt %x \n " , pFuncDesc - > elemdescFunc . tdesc . vt ) ;
ok ( pFuncDesc - > lprgelemdescParam [ 0 ] . tdesc . vt = = VT_I4 , " parm 0 vt %x \n " , pFuncDesc - > lprgelemdescParam [ 0 ] . tdesc . vt ) ;
2006-11-07 00:43:24 +01:00
ok ( U ( pFuncDesc - > lprgelemdescParam [ 0 ] ) . paramdesc . wParamFlags = = PARAMFLAG_NONE , " parm 0 flags %x \n " , U ( pFuncDesc - > lprgelemdescParam [ 0 ] ) . paramdesc . wParamFlags ) ;
2006-02-06 20:57:09 +01:00
ITypeInfo_ReleaseFuncDesc ( pTI2 , pFuncDesc ) ;
hr = ITypeInfo_GetFuncDesc ( pTI2 , 3 , & pFuncDesc ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > funckind = = FUNC_VIRTUAL , " funckind %d \n " , pFuncDesc - > funckind ) ;
ok ( pFuncDesc - > invkind = = methdata [ 3 ] . wFlags , " invkind %d \n " , pFuncDesc - > invkind ) ;
ok ( pFuncDesc - > callconv = = methdata [ 3 ] . cc , " callconv %d \n " , pFuncDesc - > callconv ) ;
ok ( pFuncDesc - > cParams = = methdata [ 3 ] . cArgs , " cParams %d \n " , pFuncDesc - > cParams ) ;
2009-01-29 13:30:05 +01:00
ok ( pFuncDesc - > oVft = = 4 * sizeof ( void * ) , " oVft %d \n " , pFuncDesc - > oVft ) ;
2006-02-06 20:57:09 +01:00
ok ( pFuncDesc - > wFuncFlags = = 0 , " oVft %d \n " , pFuncDesc - > wFuncFlags ) ;
ok ( pFuncDesc - > elemdescFunc . tdesc . vt = = VT_I4 , " ret vt %x \n " , pFuncDesc - > elemdescFunc . tdesc . vt ) ;
ITypeInfo_ReleaseFuncDesc ( pTI2 , pFuncDesc ) ;
2006-03-21 14:45:51 +01:00
/* test GetIDsOfNames on a coclass to see if it searches its interfaces */
hr = ITypeInfo_GetIDsOfNames ( pTypeInfo , & name , 1 , & memid ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = S_OK , " hr 0x%08x \n " , hr ) ;
ok ( memid = = 0x123 , " memid 0x%08x \n " , memid ) ;
2006-03-21 14:45:51 +01:00
2006-02-06 20:57:09 +01:00
ITypeInfo_Release ( pTI2 ) ;
ITypeInfo_Release ( pTypeInfo ) ;
SysFreeString ( parms1 [ 0 ] . szName ) ;
SysFreeString ( parms1 [ 1 ] . szName ) ;
SysFreeString ( parms3 [ 0 ] . szName ) ;
SysFreeString ( methdata [ 0 ] . szName ) ;
SysFreeString ( methdata [ 1 ] . szName ) ;
SysFreeString ( methdata [ 2 ] . szName ) ;
SysFreeString ( methdata [ 3 ] . szName ) ;
}
2013-08-22 14:50:34 +02:00
static void write_typelib ( int res_no , const char * filename )
2012-12-14 21:07:50 +01:00
{
2013-08-22 14:50:34 +02:00
DWORD written ;
2012-12-14 21:07:50 +01:00
HANDLE file ;
HRSRC res ;
void * ptr ;
file = CreateFile ( filename , GENERIC_READ | GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , 0 , 0 ) ;
ok ( file ! = INVALID_HANDLE_VALUE , " file creation failed \n " ) ;
2013-08-22 14:50:34 +02:00
if ( file = = INVALID_HANDLE_VALUE ) return ;
2012-12-14 21:07:50 +01:00
res = FindResource ( GetModuleHandle ( 0 ) , MAKEINTRESOURCE ( res_no ) , " TYPELIB " ) ;
ok ( res ! = 0 , " couldn't find resource \n " ) ;
ptr = LockResource ( LoadResource ( GetModuleHandle ( 0 ) , res ) ) ;
WriteFile ( file , ptr , SizeofResource ( GetModuleHandle ( 0 ) , res ) , & written , NULL ) ;
ok ( written = = SizeofResource ( GetModuleHandle ( 0 ) , res ) , " couldn't write resource \n " ) ;
CloseHandle ( file ) ;
2013-08-22 14:50:34 +02:00
}
static const char * create_test_typelib ( int res_no )
{
static char filename [ MAX_PATH ] ;
GetTempFileNameA ( " . " , " tlb " , 0 , filename ) ;
write_typelib ( res_no , filename ) ;
2012-12-14 21:07:50 +01:00
return filename ;
}
2006-02-16 19:33:08 +01:00
static void test_TypeInfo ( void )
{
ITypeLib * pTypeLib ;
ITypeInfo * pTypeInfo ;
2009-08-25 22:09:50 +02:00
ITypeInfo2 * pTypeInfo2 ;
2006-02-16 19:33:08 +01:00
HRESULT hr ;
2006-07-14 01:03:18 +02:00
static WCHAR wszBogus [ ] = { ' b ' , ' o ' , ' g ' , ' u ' , ' s ' , 0 } ;
static WCHAR wszGetTypeInfo [ ] = { ' G ' , ' e ' , ' t ' , ' T ' , ' y ' , ' p ' , ' e ' , ' I ' , ' n ' , ' f ' , ' o ' , 0 } ;
static WCHAR wszClone [ ] = { ' C ' , ' l ' , ' o ' , ' n ' , ' e ' , 0 } ;
OLECHAR * bogus = wszBogus ;
OLECHAR * pwszGetTypeInfo = wszGetTypeInfo ;
OLECHAR * pwszClone = wszClone ;
2006-02-16 19:33:08 +01:00
DISPID dispidMember ;
DISPPARAMS dispparams ;
2009-08-25 22:09:50 +02:00
GUID bogusguid = { 0x806afb4f , 0x13f7 , 0x42d2 , { 0x89 , 0x2c , 0x6c , 0x97 , 0xc3 , 0x6a , 0x36 , 0xc1 } } ;
2012-12-14 21:07:50 +01:00
VARIANT var , res , args [ 2 ] ;
UINT count , i ;
2010-12-22 02:02:03 +01:00
TYPEKIND kind ;
2012-12-14 21:07:50 +01:00
const char * filenameA ;
WCHAR filename [ MAX_PATH ] ;
2006-02-16 19:33:08 +01:00
hr = LoadTypeLib ( wszStdOle2 , & pTypeLib ) ;
ok_ole_success ( hr , LoadTypeLib ) ;
2010-12-22 02:02:03 +01:00
count = ITypeLib_GetTypeInfoCount ( pTypeLib ) ;
ok ( count > 0 , " got %d \n " , count ) ;
/* invalid index */
hr = ITypeLib_GetTypeInfo ( pTypeLib , count , & pTypeInfo ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got 0x%08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfo ( pTypeLib , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
2010-12-22 02:10:37 +01:00
hr = ITypeLib_GetLibAttr ( pTypeLib , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
2010-12-22 02:02:03 +01:00
hr = ITypeLib_GetTypeInfoType ( pTypeLib , count , & kind ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got 0x%08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfoType ( pTypeLib , count , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfoType ( pTypeLib , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
2006-07-14 01:03:18 +02:00
hr = ITypeLib_GetTypeInfoOfGuid ( pTypeLib , & IID_IFont , & pTypeInfo ) ;
ok_ole_success ( hr , ITypeLib_GetTypeInfoOfGuid ) ;
2006-02-16 19:33:08 +01:00
/* test nonexistent method name */
hr = ITypeInfo_GetIDsOfNames ( pTypeInfo , & bogus , 1 , & dispidMember ) ;
ok ( hr = = DISP_E_UNKNOWNNAME ,
2006-10-12 13:56:01 +02:00
" ITypeInfo_GetIDsOfNames should have returned DISP_E_UNKNOWNNAME instead of 0x%08x \n " ,
2006-02-16 19:33:08 +01:00
hr ) ;
dispparams . cArgs = 0 ;
dispparams . rgdispidNamedArgs = NULL ;
dispparams . rgvarg = NULL ;
2010-07-18 12:16:16 +02:00
/* test dispparams not NULL */
/* invalid member id -- wrong flags -- cNamedArgs not bigger than cArgs */
dispparams . cNamedArgs = 0 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , 0xdeadbeef , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* invalid member id -- correct flags -- cNamedArgs not bigger than cArgs */
2006-07-14 01:03:18 +02:00
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , 0xdeadbeef , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
2006-07-14 01:03:18 +02:00
2010-07-18 12:16:16 +02:00
/* invalid member id -- wrong flags -- cNamedArgs bigger than cArgs */
dispparams . cNamedArgs = 1 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , 0xdeadbeef , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
/* invalid member id -- correct flags -- cNamedArgs bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , 0xdeadbeef , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
2006-07-14 01:03:18 +02:00
hr = ITypeInfo_GetIDsOfNames ( pTypeInfo , & pwszClone , 1 , & dispidMember ) ;
ok_ole_success ( hr , ITypeInfo_GetIDsOfNames ) ;
2010-07-18 12:16:16 +02:00
/* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
dispparams . cNamedArgs = 0 ;
2006-07-14 01:03:18 +02:00
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
2011-01-02 15:26:44 +01:00
/* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
2010-07-18 12:16:16 +02:00
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
2011-01-02 15:26:44 +01:00
ok ( hr = = DISP_E_BADPARAMCOUNT , " ITypeInfo_Invoke should have returned DISP_E_BADPARAMCOUNT instead of 0x%08x \n " , hr ) ;
2006-07-14 01:03:18 +02:00
2010-07-18 12:16:16 +02:00
/* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
dispparams . cNamedArgs = 1 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
/* test NULL dispparams */
/* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
dispparams . cNamedArgs = 0 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , NULL , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
2006-07-31 17:44:02 +02:00
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , NULL , NULL , NULL , NULL ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
2006-07-31 17:44:02 +02:00
2010-07-18 12:16:16 +02:00
/* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
2006-07-31 17:44:02 +02:00
dispparams . cNamedArgs = 1 ;
2010-07-18 12:16:16 +02:00
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , NULL , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , NULL , NULL , NULL , NULL ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = E_INVALIDARG , " ITypeInfo_Invoke should have returned E_INVALIDARG instead of 0x%08x \n " , hr ) ;
2006-07-31 17:44:02 +02:00
2006-07-14 01:03:18 +02:00
ITypeInfo_Release ( pTypeInfo ) ;
2010-07-18 12:16:16 +02:00
2006-07-14 01:03:18 +02:00
hr = ITypeLib_GetTypeInfoOfGuid ( pTypeLib , & IID_IDispatch , & pTypeInfo ) ;
ok_ole_success ( hr , ITypeLib_GetTypeInfoOfGuid ) ;
hr = ITypeInfo_GetIDsOfNames ( pTypeInfo , & pwszGetTypeInfo , 1 , & dispidMember ) ;
ok_ole_success ( hr , ITypeInfo_GetIDsOfNames ) ;
2009-08-25 22:09:50 +02:00
hr = ITypeInfo_QueryInterface ( pTypeInfo , & IID_ITypeInfo2 , ( void * * ) & pTypeInfo2 ) ;
ok_ole_success ( hr , ITypeInfo_QueryInterface ) ;
if ( SUCCEEDED ( hr ) )
{
VariantInit ( & var ) ;
V_VT ( & var ) = VT_I4 ;
/* test unknown guid passed to GetCustData */
hr = ITypeInfo2_GetCustData ( pTypeInfo2 , & bogusguid , & var ) ;
ok_ole_success ( hr , ITypeInfo_GetCustData ) ;
ok ( V_VT ( & var ) = = VT_EMPTY , " got %i, expected VT_EMPTY \n " , V_VT ( & var ) ) ;
ITypeInfo2_Release ( pTypeInfo2 ) ;
VariantClear ( & var ) ;
}
2010-07-18 12:16:16 +02:00
/* test invoking a method with a [restricted] keyword */
/* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
dispparams . cNamedArgs = 0 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
dispparams . cNamedArgs = 1 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , & dispparams , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* test NULL dispparams */
/* correct member id -- wrong flags -- cNamedArgs not bigger than cArgs */
dispparams . cNamedArgs = 0 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , NULL , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs not bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , NULL , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- wrong flags -- cNamedArgs bigger than cArgs */
dispparams . cNamedArgs = 1 ;
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_PROPERTYGET , NULL , NULL , NULL , NULL ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
/* correct member id -- correct flags -- cNamedArgs bigger than cArgs */
hr = ITypeInfo_Invoke ( pTypeInfo , ( void * ) 0xdeadbeef , dispidMember , DISPATCH_METHOD , NULL , NULL , NULL , NULL ) ;
2006-10-12 13:56:01 +02:00
ok ( hr = = DISP_E_MEMBERNOTFOUND , " ITypeInfo_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08x \n " , hr ) ;
2006-02-16 19:33:08 +01:00
ITypeInfo_Release ( pTypeInfo ) ;
2006-07-14 01:03:18 +02:00
ITypeLib_Release ( pTypeLib ) ;
2012-12-14 21:07:50 +01:00
filenameA = create_test_typelib ( 3 ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filename , MAX_PATH ) ;
hr = LoadTypeLib ( filename , & pTypeLib ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfoOfGuid ( pTypeLib , & IID_IInvokeTest , & pTypeInfo ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
dispparams . cArgs = 1 ;
dispparams . cNamedArgs = 0 ;
dispparams . rgdispidNamedArgs = NULL ;
dispparams . rgvarg = args ;
V_VT ( & args [ 0 ] ) = VT_I4 ;
V_I4 ( & args [ 0 ] ) = 0 ;
V_VT ( & res ) = VT_EMPTY ;
i = 0 ;
V_VT ( & res ) = VT_EMPTY ;
V_I4 ( & res ) = 0 ;
/* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */
hr = ITypeInfo_Invoke ( pTypeInfo , & invoketest , DISPID_VALUE , DISPATCH_METHOD | DISPATCH_PROPERTYGET ,
& dispparams , & res , NULL , & i ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
ok ( V_VT ( & res ) = = VT_I4 , " got %d \n " , V_VT ( & res ) ) ;
ok ( V_I4 ( & res ) = = 1 , " got %d \n " , V_I4 ( & res ) ) ;
i = 0 ;
/* call propget with DISPATCH_METHOD flags */
hr = ITypeInfo_Invoke ( pTypeInfo , & invoketest , DISPID_VALUE , DISPATCH_METHOD ,
& dispparams , & res , NULL , & i ) ;
ok ( hr = = DISP_E_MEMBERNOTFOUND , " got 0x%08x, %d \n " , hr , i ) ;
i = 0 ;
V_VT ( & res ) = VT_EMPTY ;
V_I4 ( & res ) = 0 ;
hr = ITypeInfo_Invoke ( pTypeInfo , & invoketest , DISPID_VALUE , DISPATCH_PROPERTYGET ,
& dispparams , & res , NULL , & i ) ;
ok ( hr = = S_OK , " got 0x%08x, %d \n " , hr , i ) ;
ok ( V_VT ( & res ) = = VT_I4 , " got %d \n " , V_VT ( & res ) ) ;
ok ( V_I4 ( & res ) = = 1 , " got %d \n " , V_I4 ( & res ) ) ;
ITypeInfo_Release ( pTypeInfo ) ;
ITypeLib_Release ( pTypeLib ) ;
DeleteFileA ( filenameA ) ;
2006-02-16 19:33:08 +01:00
}
2010-08-26 12:22:20 +02:00
static int WINAPI int_func ( int a0 , int a1 , int a2 , int a3 , int a4 )
{
ok ( a0 = = 1 , " wrong arg0 %x \n " , a0 ) ;
ok ( a1 = = - 1 , " wrong arg1 %x \n " , a1 ) ;
ok ( a2 = = ( 0x55550000 | 1234 ) , " wrong arg2 %x \n " , a2 ) ;
ok ( a3 = = 0xdeadbeef , " wrong arg3 %x \n " , a3 ) ;
ok ( a4 = = 0x555555fd , " wrong arg4 %x \n " , a4 ) ;
return 4321 ;
}
static double WINAPI double_func ( double a0 , float a1 , double a2 , int a3 )
{
ok ( a0 = = 1.2 , " wrong arg0 %f \n " , ( double ) a0 ) ;
ok ( a1 = = 3.25 , " wrong arg1 %f \n " , ( double ) a1 ) ;
ok ( a2 = = 1.2e12 , " wrong arg2 %f \n " , ( double ) a2 ) ;
ok ( a3 = = - 4433.0 , " wrong arg3 %f \n " , ( double ) a3 ) ;
return 4321 ;
}
static LONGLONG WINAPI longlong_func ( LONGLONG a0 , CY a1 )
{
ok ( a0 = = ( ( ( ULONGLONG ) 0xdead < < 32 ) | 0xbeef ) , " wrong arg0 %08x%08x \n " , ( DWORD ) ( a0 > > 32 ) , ( DWORD ) a0 ) ;
ok ( a1 . int64 = = ( ( ULONGLONG ) 10000 * 12345678 ) , " wrong arg1 %08x%08x \n " ,
( DWORD ) ( a1 . int64 > > 32 ) , ( DWORD ) a1 . int64 ) ;
return ( ( ULONGLONG ) 4321 < < 32 ) | 8765 ;
}
static VARIANT WINAPI variant_func ( int a0 , BOOL a1 , DECIMAL a2 , VARIANT a3 )
{
VARIANT var ;
ok ( a0 = = 2233 , " wrong arg0 %x \n " , a0 ) ;
ok ( a1 = = 1 | | broken ( a1 = = 0x55550001 ) , " wrong arg1 %x \n " , a1 ) ;
V_VT ( & var ) = VT_LPWSTR ;
V_UI4 ( & var ) = 0xbabe ;
ok ( a2 . Hi32 = = 1122 , " wrong arg2.Hi32 %x \n " , a2 . Hi32 ) ;
2010-08-29 23:38:51 +02:00
ok ( U1 ( a2 ) . Lo64 = = 3344 , " wrong arg2.Lo64 %08x%08x \n " , ( DWORD ) ( U1 ( a2 ) . Lo64 > > 32 ) , ( DWORD ) U1 ( a2 ) . Lo64 ) ;
2010-08-26 12:22:20 +02:00
ok ( V_VT ( & a3 ) = = VT_EMPTY , " wrong arg3 type %x \n " , V_VT ( & a3 ) ) ;
ok ( V_UI4 ( & a3 ) = = 0xdeadbeef , " wrong arg3 value %x \n " , V_UI4 ( & a3 ) ) ;
return var ;
}
static int CDECL void_func ( int a0 , int a1 )
{
if ( is_win64 ) /* VT_EMPTY is passed as real arg on win64 */
{
ok ( a0 = = 0x55555555 , " wrong arg0 %x \n " , a0 ) ;
ok ( a1 = = 1111 , " wrong arg1 %x \n " , a1 ) ;
}
else
{
ok ( a0 = = 1111 , " wrong arg0 %x \n " , a0 ) ;
ok ( a1 = = 0 , " wrong arg1 %x \n " , a1 ) ;
}
return 12 ;
}
static int WINAPI stdcall_func ( int a )
{
return 0 ;
}
static int WINAPI inst_func ( void * inst , int a )
{
ok ( ( * ( void * * * ) inst ) [ 3 ] = = inst_func , " wrong ptr %p \n " , inst ) ;
ok ( a = = 3 , " wrong arg %x \n " , a ) ;
return a * 2 ;
}
2013-02-12 14:52:30 +01:00
static HRESULT WINAPI ret_false_func ( void )
{
return S_FALSE ;
}
2010-08-26 12:22:20 +02:00
static const void * vtable [ ] = { NULL , NULL , NULL , inst_func } ;
static void test_DispCallFunc ( void )
{
const void * * inst = vtable ;
HRESULT res ;
VARIANT result , args [ 5 ] ;
VARIANTARG * pargs [ 5 ] ;
VARTYPE types [ 5 ] ;
int i ;
for ( i = 0 ; i < 5 ; i + + ) pargs [ i ] = & args [ i ] ;
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_UI4 ;
V_UI4 ( & args [ 0 ] ) = 1 ;
types [ 1 ] = VT_I4 ;
V_I4 ( & args [ 1 ] ) = - 1 ;
types [ 2 ] = VT_I2 ;
V_I2 ( & args [ 2 ] ) = 1234 ;
types [ 3 ] = VT_UI4 ;
V_UI4 ( & args [ 3 ] ) = 0xdeadbeef ;
types [ 4 ] = VT_UI4 ;
V_I1 ( & args [ 4 ] ) = - 3 ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) int_func , CC_STDCALL , VT_UI4 , 5 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_UI4 , " wrong result type %d \n " , V_VT ( & result ) ) ;
ok ( V_UI4 ( & result ) = = 4321 , " wrong result %u \n " , V_UI4 ( & result ) ) ;
/* the function checks the argument sizes for stdcall */
if ( ! is_win64 ) /* no stdcall on 64-bit */
{
res = DispCallFunc ( NULL , ( ULONG_PTR ) stdcall_func , CC_STDCALL , VT_UI4 , 0 , types , pargs , & result ) ;
ok ( res = = DISP_E_BADCALLEE , " DispCallFunc wrong error %x \n " , res ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) stdcall_func , CC_STDCALL , VT_UI4 , 1 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) stdcall_func , CC_STDCALL , VT_UI4 , 2 , types , pargs , & result ) ;
ok ( res = = DISP_E_BADCALLEE , " DispCallFunc wrong error %x \n " , res ) ;
}
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_R8 ;
V_R8 ( & args [ 0 ] ) = 1.2 ;
types [ 1 ] = VT_R4 ;
V_R4 ( & args [ 1 ] ) = 3.25 ;
types [ 2 ] = VT_R8 ;
V_R8 ( & args [ 2 ] ) = 1.2e12 ;
types [ 3 ] = VT_I4 ;
V_I4 ( & args [ 3 ] ) = - 4433 ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) double_func , CC_STDCALL , VT_R8 , 4 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_R8 , " wrong result type %d \n " , V_VT ( & result ) ) ;
ok ( V_R8 ( & result ) = = 4321 , " wrong result %f \n " , V_R8 ( & result ) ) ;
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_I8 ;
V_I8 ( & args [ 0 ] ) = ( ( ULONGLONG ) 0xdead < < 32 ) | 0xbeef ;
types [ 1 ] = VT_CY ;
V_CY ( & args [ 1 ] ) . int64 = ( ULONGLONG ) 10000 * 12345678 ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) longlong_func , CC_STDCALL , VT_I8 , 2 , types , pargs , & result ) ;
ok ( res = = S_OK | | broken ( res = = E_INVALIDARG ) , /* longlong not supported on <= win2k */
" DispCallFunc failed %x \n " , res ) ;
if ( res = = S_OK )
{
ok ( V_VT ( & result ) = = VT_I8 , " wrong result type %d \n " , V_VT ( & result ) ) ;
ok ( V_I8 ( & result ) = = ( ( ( ULONGLONG ) 4321 < < 32 ) | 8765 ) , " wrong result %08x%08x \n " ,
( DWORD ) ( V_I8 ( & result ) > > 32 ) , ( DWORD ) V_I8 ( & result ) ) ;
}
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_I4 ;
V_I4 ( & args [ 0 ] ) = 2233 ;
types [ 1 ] = VT_BOOL ;
V_BOOL ( & args [ 1 ] ) = 1 ;
types [ 2 ] = VT_DECIMAL ;
V_DECIMAL ( & args [ 2 ] ) . Hi32 = 1122 ;
2010-08-29 23:38:51 +02:00
U1 ( V_DECIMAL ( & args [ 2 ] ) ) . Lo64 = 3344 ;
2010-08-26 12:22:20 +02:00
types [ 3 ] = VT_VARIANT ;
V_VT ( & args [ 3 ] ) = VT_EMPTY ;
V_UI4 ( & args [ 3 ] ) = 0xdeadbeef ;
types [ 4 ] = VT_EMPTY ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) variant_func , CC_STDCALL , VT_VARIANT , 5 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_LPWSTR , " wrong result type %d \n " , V_VT ( & result ) ) ;
ok ( V_UI4 ( & result ) = = 0xbabe , " wrong result %08x \n " , V_UI4 ( & result ) ) ;
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_EMPTY ;
types [ 1 ] = VT_I4 ;
V_I4 ( & args [ 1 ] ) = 1111 ;
types [ 2 ] = VT_EMPTY ;
types [ 3 ] = VT_I4 ;
V_I4 ( & args [ 3 ] ) = 0 ;
types [ 4 ] = VT_EMPTY ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) void_func , CC_CDECL , VT_EMPTY , 5 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_EMPTY , " wrong result type %d \n " , V_VT ( & result ) ) ;
if ( is_win64 )
ok ( V_UI4 ( & result ) = = 12 , " wrong result %08x \n " , V_UI4 ( & result ) ) ;
else
ok ( V_UI4 ( & result ) = = 0xcccccccc , " wrong result %08x \n " , V_UI4 ( & result ) ) ;
memset ( args , 0x55 , sizeof ( args ) ) ;
types [ 0 ] = VT_I4 ;
V_I4 ( & args [ 0 ] ) = 3 ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( & inst , 3 * sizeof ( void * ) , CC_STDCALL , VT_I4 , 1 , types , pargs , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed %x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_I4 , " wrong result type %d \n " , V_VT ( & result ) ) ;
ok ( V_I4 ( & result ) = = 6 , " wrong result %08x \n " , V_I4 ( & result ) ) ;
2013-02-12 14:52:30 +01:00
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) ret_false_func , CC_STDCALL , VT_ERROR , 0 , NULL , NULL , & result ) ;
ok ( res = = S_OK , " DispCallFunc failed: %08x \n " , res ) ;
ok ( V_VT ( & result ) = = VT_ERROR , " V_VT(result) = %u \n " , V_VT ( & result ) ) ;
ok ( V_ERROR ( & result ) = = S_FALSE , " V_ERROR(result) = %08x \n " , V_ERROR ( & result ) ) ;
memset ( & result , 0xcc , sizeof ( result ) ) ;
res = DispCallFunc ( NULL , ( ULONG_PTR ) ret_false_func , CC_STDCALL , VT_HRESULT , 0 , NULL , NULL , & result ) ;
ok ( res = = E_INVALIDARG , " DispCallFunc failed: %08x \n " , res ) ;
ok ( V_VT ( & result ) = = 0xcccc , " V_VT(result) = %u \n " , V_VT ( & result ) ) ;
2010-08-26 12:22:20 +02:00
}
2007-12-18 10:01:39 +01:00
/* RegDeleteTreeW from dlls/advapi32/registry.c */
static LSTATUS myRegDeleteTreeW ( HKEY hKey , LPCWSTR lpszSubKey )
{
LONG ret ;
DWORD dwMaxSubkeyLen , dwMaxValueLen ;
DWORD dwMaxLen , dwSize ;
WCHAR szNameBuf [ MAX_PATH ] , * lpszName = szNameBuf ;
HKEY hSubKey = hKey ;
if ( lpszSubKey )
{
ret = RegOpenKeyExW ( hKey , lpszSubKey , 0 , KEY_READ , & hSubKey ) ;
if ( ret ) return ret ;
}
ret = RegQueryInfoKeyW ( hSubKey , NULL , NULL , NULL , NULL ,
& dwMaxSubkeyLen , NULL , NULL , & dwMaxValueLen , NULL , NULL , NULL ) ;
if ( ret ) goto cleanup ;
dwMaxSubkeyLen + + ;
dwMaxValueLen + + ;
dwMaxLen = max ( dwMaxSubkeyLen , dwMaxValueLen ) ;
if ( dwMaxLen > sizeof ( szNameBuf ) / sizeof ( WCHAR ) )
{
/* Name too big: alloc a buffer for it */
if ( ! ( lpszName = HeapAlloc ( GetProcessHeap ( ) , 0 , dwMaxLen * sizeof ( WCHAR ) ) ) )
{
ret = ERROR_NOT_ENOUGH_MEMORY ;
goto cleanup ;
}
}
/* Recursively delete all the subkeys */
while ( TRUE )
{
dwSize = dwMaxLen ;
if ( RegEnumKeyExW ( hSubKey , 0 , lpszName , & dwSize , NULL ,
NULL , NULL , NULL ) ) break ;
ret = myRegDeleteTreeW ( hSubKey , lpszName ) ;
if ( ret ) goto cleanup ;
}
if ( lpszSubKey )
ret = RegDeleteKeyW ( hKey , lpszSubKey ) ;
else
while ( TRUE )
{
dwSize = dwMaxLen ;
if ( RegEnumValueW ( hKey , 0 , lpszName , & dwSize ,
NULL , NULL , NULL , NULL ) ) break ;
ret = RegDeleteValueW ( hKey , lpszName ) ;
if ( ret ) goto cleanup ;
}
cleanup :
if ( lpszName ! = szNameBuf )
HeapFree ( GetProcessHeap ( ) , 0 , lpszName ) ;
if ( lpszSubKey )
RegCloseKey ( hSubKey ) ;
return ret ;
}
2010-08-19 18:13:43 +02:00
static BOOL do_typelib_reg_key ( GUID * uid , WORD maj , WORD min , DWORD arch , LPCWSTR base , BOOL remove )
2006-10-22 17:01:24 +02:00
{
static const WCHAR typelibW [ ] = { ' T ' , ' y ' , ' p ' , ' e ' , ' l ' , ' i ' , ' b ' , ' \\ ' , 0 } ;
2010-08-19 18:13:43 +02:00
static const WCHAR formatW [ ] = { ' \\ ' , ' % ' , ' u ' , ' . ' , ' % ' , ' u ' , ' \\ ' , ' 0 ' , ' \\ ' , ' w ' , ' i ' , ' n ' , ' % ' , ' u ' , 0 } ;
2006-10-22 17:01:24 +02:00
static const WCHAR format2W [ ] = { ' % ' , ' s ' , ' _ ' , ' % ' , ' u ' , ' _ ' , ' % ' , ' u ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } ;
WCHAR buf [ 128 ] ;
HKEY hkey ;
BOOL ret = TRUE ;
2008-08-27 21:23:21 +02:00
DWORD res ;
2006-10-22 17:01:24 +02:00
memcpy ( buf , typelibW , sizeof ( typelibW ) ) ;
StringFromGUID2 ( uid , buf + lstrlenW ( buf ) , 40 ) ;
if ( remove )
{
2007-12-18 10:01:39 +01:00
ok ( myRegDeleteTreeW ( HKEY_CLASSES_ROOT , buf ) = = ERROR_SUCCESS , " SHDeleteKey failed \n " ) ;
2006-10-22 17:01:24 +02:00
return TRUE ;
}
2010-08-19 18:13:43 +02:00
wsprintfW ( buf + lstrlenW ( buf ) , formatW , maj , min , arch ) ;
2006-10-22 17:01:24 +02:00
2008-08-27 21:23:21 +02:00
SetLastError ( 0xdeadbeef ) ;
res = RegCreateKeyExW ( HKEY_CLASSES_ROOT , buf , 0 , NULL , 0 ,
KEY_WRITE , NULL , & hkey , NULL ) ;
if ( GetLastError ( ) = = ERROR_CALL_NOT_IMPLEMENTED )
{
win_skip ( " W-calls are not implemented \n " ) ;
return FALSE ;
}
if ( res ! = ERROR_SUCCESS )
2006-10-22 17:01:24 +02:00
{
2010-08-19 18:13:43 +02:00
trace ( " RegCreateKeyExW failed: %u \n " , res ) ;
2006-10-22 17:01:24 +02:00
return FALSE ;
}
wsprintfW ( buf , format2W , base , maj , min ) ;
if ( RegSetValueExW ( hkey , NULL , 0 , REG_SZ ,
( BYTE * ) buf , ( lstrlenW ( buf ) + 1 ) * sizeof ( WCHAR ) ) ! = ERROR_SUCCESS )
{
trace ( " RegSetValueExW failed \n " ) ;
ret = FALSE ;
}
RegCloseKey ( hkey ) ;
return ret ;
}
2010-08-19 18:13:43 +02:00
static void test_QueryPathOfRegTypeLib ( DWORD arch )
2006-10-22 17:01:24 +02:00
{
static const struct test_data
{
WORD maj , min ;
HRESULT ret ;
const WCHAR path [ 16 ] ;
} td [ ] = {
{ 1 , 0 , TYPE_E_LIBNOTREGISTERED , { 0 } } ,
{ 3 , 0 , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 3 ' , ' _ ' , ' 0 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
{ 3 , 1 , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 3 ' , ' _ ' , ' 1 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
{ 3 , 22 , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 3 ' , ' _ ' , ' 3 ' , ' 7 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
{ 3 , 37 , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 3 ' , ' _ ' , ' 3 ' , ' 7 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
{ 3 , 40 , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 3 ' , ' _ ' , ' 3 ' , ' 7 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
2009-04-13 08:14:08 +02:00
{ 0xffff , 0xffff , S_OK , { ' f ' , ' a ' , ' k ' , ' e ' , ' _ ' , ' 5 ' , ' _ ' , ' 3 ' , ' 7 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } } ,
{ 0xffff , 0 , TYPE_E_LIBNOTREGISTERED , { 0 } } ,
{ 3 , 0xffff , TYPE_E_LIBNOTREGISTERED , { 0 } } ,
{ 5 , 0xffff , TYPE_E_LIBNOTREGISTERED , { 0 } } ,
2006-10-22 17:01:24 +02:00
{ 4 , 0 , TYPE_E_LIBNOTREGISTERED , { 0 } }
} ;
static const WCHAR base [ ] = { ' f ' , ' a ' , ' k ' , ' e ' , 0 } ;
2010-08-19 18:13:43 +02:00
static const WCHAR wrongW [ ] = { ' w ' , ' r ' , ' o ' , ' n ' , ' g ' , 0 } ;
2006-10-22 17:01:24 +02:00
UINT i ;
RPC_STATUS status ;
GUID uid ;
WCHAR uid_str [ 40 ] ;
HRESULT ret ;
BSTR path ;
status = UuidCreate ( & uid ) ;
2009-01-04 01:49:14 +01:00
ok ( ! status | | status = = RPC_S_UUID_LOCAL_ONLY , " UuidCreate error %08x \n " , status ) ;
2006-10-22 17:01:24 +02:00
StringFromGUID2 ( & uid , uid_str , 40 ) ;
/*trace("GUID: %s\n", wine_dbgstr_w(uid_str));*/
2010-08-19 18:13:43 +02:00
if ( ! do_typelib_reg_key ( & uid , 3 , 0 , arch , base , 0 ) ) return ;
if ( ! do_typelib_reg_key ( & uid , 3 , 1 , arch , base , 0 ) ) return ;
if ( ! do_typelib_reg_key ( & uid , 3 , 37 , arch , base , 0 ) ) return ;
if ( ! do_typelib_reg_key ( & uid , 5 , 37 , arch , base , 0 ) ) return ;
if ( arch = = 64 & & ! do_typelib_reg_key ( & uid , 5 , 37 , 32 , wrongW , 0 ) ) return ;
2006-10-22 17:01:24 +02:00
for ( i = 0 ; i < sizeof ( td ) / sizeof ( td [ 0 ] ) ; i + + )
{
2013-08-23 08:30:44 +02:00
ret = QueryPathOfRegTypeLib ( & uid , td [ i ] . maj , td [ i ] . min , LOCALE_NEUTRAL , & path ) ;
2006-10-22 17:01:24 +02:00
ok ( ret = = td [ i ] . ret , " QueryPathOfRegTypeLib(%u.%u) returned %08x \n " , td [ i ] . maj , td [ i ] . min , ret ) ;
if ( ret = = S_OK )
{
ok ( ! lstrcmpW ( td [ i ] . path , path ) , " typelib %u.%u path doesn't match \n " , td [ i ] . maj , td [ i ] . min ) ;
SysFreeString ( path ) ;
}
}
2010-08-19 18:13:43 +02:00
do_typelib_reg_key ( & uid , 0 , 0 , arch , NULL , 1 ) ;
2006-10-22 17:01:24 +02:00
}
2007-05-11 16:23:31 +02:00
static void test_inheritance ( void )
{
HRESULT hr ;
ITypeLib * pTL ;
ITypeInfo * pTI , * pTI_p ;
TYPEATTR * pTA ;
HREFTYPE href ;
FUNCDESC * pFD ;
WCHAR path [ MAX_PATH ] ;
2008-07-21 00:17:55 +02:00
CHAR pathA [ MAX_PATH ] ;
2007-05-11 16:23:31 +02:00
static const WCHAR tl_path [ ] = { ' . ' , ' \\ ' , ' m ' , ' i ' , ' d ' , ' l ' , ' _ ' , ' t ' , ' m ' , ' a ' , ' r ' , ' s ' , ' h ' , ' a ' , ' l ' , ' . ' , ' t ' , ' l ' , ' b ' , 0 } ;
BOOL use_midl_tlb = 0 ;
2008-07-21 00:17:55 +02:00
GetModuleFileNameA ( NULL , pathA , MAX_PATH ) ;
MultiByteToWideChar ( CP_ACP , 0 , pathA , - 1 , path , MAX_PATH ) ;
2007-05-11 16:23:31 +02:00
if ( use_midl_tlb )
memcpy ( path , tl_path , sizeof ( tl_path ) ) ;
hr = LoadTypeLib ( path , & pTL ) ;
if ( FAILED ( hr ) ) return ;
/* ItestIF3 is a syntax 2 dispinterface */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & DIID_ItestIF3 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-11 16:23:31 +02:00
ok ( pTA - > wTypeFlags = = TYPEFLAG_FDISPATCHABLE , " typeflags %x \n " , pTA - > wTypeFlags ) ;
if ( use_midl_tlb ) {
ok ( pTA - > cFuncs = = 6 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
2009-12-17 21:55:00 +01:00
}
2007-05-11 16:23:31 +02:00
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
2009-12-17 21:55:00 +01:00
if ( use_midl_tlb ) {
2007-05-11 16:23:31 +02:00
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-11 16:23:31 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
/* Should have six methods */
hr = ITypeInfo_GetFuncDesc ( pTI , 6 , & pFD ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 5 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2007-05-14 15:19:50 +02:00
ok ( pFD - > memid = = 0x60020000 , " memid %08x \n " , pFD - > memid ) ;
2009-01-29 13:30:05 +01:00
ok ( pFD - > oVft = = 5 * sizeof ( void * ) , " oVft %d \n " , pFD - > oVft ) ;
2007-05-14 15:19:50 +02:00
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
2007-05-11 16:23:31 +02:00
}
ITypeInfo_Release ( pTI ) ;
/* ItestIF4 is a syntax 1 dispinterface */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & DIID_ItestIF4 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-11 16:23:31 +02:00
ok ( pTA - > wTypeFlags = = TYPEFLAG_FDISPATCHABLE , " typeflags %x \n " , pTA - > wTypeFlags ) ;
ok ( pTA - > cFuncs = = 1 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-11 16:23:31 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 1 , & pFD ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 0 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x1c , " memid %08x \n " , pFD - > memid ) ;
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
ITypeInfo_Release ( pTI ) ;
/* ItestIF5 is dual with inherited ifaces which derive from IUnknown but not IDispatch */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & IID_ItestIF5 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2009-05-08 14:27:11 +02:00
if ( hr = = S_OK )
{
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
if ( use_midl_tlb ) {
ok ( pTA - > wTypeFlags = = TYPEFLAG_FDUAL , " typeflags %x \n " , pTA - > wTypeFlags ) ;
}
ok ( pTA - > cFuncs = = 8 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
}
2007-05-11 16:23:31 +02:00
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-11 16:23:31 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
if ( use_midl_tlb ) {
hr = ITypeInfo_GetFuncDesc ( pTI , 6 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x1234 , " memid %08x \n " , pFD - > memid ) ;
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
}
ITypeInfo_Release ( pTI ) ;
/* ItestIF7 is dual with inherited ifaces which derive from Dispatch */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & IID_ItestIF7 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-11 16:23:31 +02:00
ok ( pTA - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL ) , " typeflags %x \n " , pTA - > wTypeFlags ) ;
ok ( pTA - > cFuncs = = 10 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-11 16:23:31 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 9 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x1236 , " memid %08x \n " , pFD - > memid ) ;
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
ITypeInfo_Release ( pTI ) ;
2007-05-17 12:47:16 +02:00
/* ItestIF10 is a syntax 2 dispinterface which doesn't derive from IUnknown */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & DIID_ItestIF10 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-17 12:47:16 +02:00
ok ( pTA - > wTypeFlags = = TYPEFLAG_FDISPATCHABLE , " typeflags %x \n " , pTA - > wTypeFlags ) ;
if ( use_midl_tlb ) {
ok ( pTA - > cFuncs = = 3 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
2009-12-17 21:55:00 +01:00
}
2007-05-17 12:47:16 +02:00
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
2009-12-17 21:55:00 +01:00
if ( use_midl_tlb ) {
2007-05-17 12:47:16 +02:00
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , - 1 , & href ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-17 12:47:16 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
/* Should have three methods */
hr = ITypeInfo_GetFuncDesc ( pTI , 3 , & pFD ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 2 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x60010000 , " memid %08x \n " , pFD - > memid ) ;
2009-01-29 13:30:05 +01:00
ok ( pFD - > oVft = = 2 * sizeof ( void * ) , " oVft %d \n " , pFD - > oVft ) ;
2007-05-17 12:47:16 +02:00
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
}
ITypeInfo_Release ( pTI ) ;
/* ItestIF11 is a syntax 2 dispinterface which derives from IDispatch */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & DIID_ItestIF11 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_DISPATCH , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 7 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-17 12:47:16 +02:00
ok ( pTA - > wTypeFlags = = TYPEFLAG_FDISPATCHABLE , " typeflags %x \n " , pTA - > wTypeFlags ) ;
if ( use_midl_tlb ) {
ok ( pTA - > cFuncs = = 10 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
2009-12-17 21:55:00 +01:00
}
2007-05-17 12:47:16 +02:00
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
2009-12-17 21:55:00 +01:00
if ( use_midl_tlb ) {
2007-05-17 12:47:16 +02:00
hr = ITypeInfo_GetRefTypeOfImplType ( pTI , 0 , & href ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI_p , & pTA ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2007-05-17 12:47:16 +02:00
ok ( IsEqualGUID ( & pTA - > guid , & IID_IDispatch ) , " guid {%08x-.... \n " , pTA - > guid . Data1 ) ;
ITypeInfo_ReleaseTypeAttr ( pTI_p , pTA ) ;
ITypeInfo_Release ( pTI_p ) ;
/* Should have ten methods */
hr = ITypeInfo_GetFuncDesc ( pTI , 10 , & pFD ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 9 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x1236 , " memid %08x \n " , pFD - > memid ) ;
2009-01-29 13:30:05 +01:00
ok ( pFD - > oVft = = 9 * sizeof ( void * ) , " oVft %d \n " , pFD - > oVft ) ;
2009-09-16 18:23:47 +02:00
/* first argument to 10th function is an HREFTYPE from the impl type */
ok ( pFD - > cParams = = 1 , " cParams %i \n " , pFD - > cParams ) ;
ok ( pFD - > lprgelemdescParam [ 0 ] . tdesc . vt = = VT_USERDEFINED ,
" vt 0x%x \n " , pFD - > lprgelemdescParam [ 0 ] . tdesc . vt ) ;
href = U ( pFD - > lprgelemdescParam [ 0 ] . tdesc ) . hreftype ;
ok ( ( href & 0xff000000 ) = = 0x04000000 , " href 0x%08x \n " , href ) ;
hr = ITypeInfo_GetRefTypeInfo ( pTI , href , & pTI_p ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
2009-09-16 18:23:47 +02:00
if ( SUCCEEDED ( hr ) ) ITypeInfo_Release ( pTI_p ) ;
2007-05-17 12:47:16 +02:00
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
}
ITypeInfo_Release ( pTI ) ;
2007-05-17 16:14:35 +02:00
/* ItestIF2 is an interface which derives from IUnknown */
hr = ITypeLib_GetTypeInfoOfGuid ( pTL , & IID_ItestIF2 , & pTI ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( pTI , & pTA ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pTA - > typekind = = TKIND_INTERFACE , " kind %04x \n " , pTA - > typekind ) ;
2009-01-29 13:30:05 +01:00
ok ( pTA - > cbSizeVft = = 6 * sizeof ( void * ) , " sizevft %d \n " , pTA - > cbSizeVft ) ;
2007-05-17 16:14:35 +02:00
ok ( pTA - > wTypeFlags = = 0 , " typeflags %x \n " , pTA - > wTypeFlags ) ;
if ( use_midl_tlb ) {
ok ( pTA - > cFuncs = = 1 , " cfuncs %d \n " , pTA - > cFuncs ) ;
ok ( pTA - > cImplTypes = = 1 , " cimpltypes %d \n " , pTA - > cImplTypes ) ;
2009-12-17 21:55:00 +01:00
}
2007-05-17 16:14:35 +02:00
ITypeInfo_ReleaseTypeAttr ( pTI , pTA ) ;
2009-12-17 21:55:00 +01:00
if ( use_midl_tlb ) {
2007-05-17 16:14:35 +02:00
/* Should have one method */
hr = ITypeInfo_GetFuncDesc ( pTI , 1 , & pFD ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " hr %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( pTI , 0 , & pFD ) ;
ok ( hr = = S_OK , " hr %08x \n " , hr ) ;
ok ( pFD - > memid = = 0x60020000 , " memid %08x \n " , pFD - > memid ) ;
2009-01-29 13:30:05 +01:00
ok ( pFD - > oVft = = 5 * sizeof ( void * ) , " oVft %d \n " , pFD - > oVft ) ;
2007-05-17 16:14:35 +02:00
ITypeInfo_ReleaseFuncDesc ( pTI , pFD ) ;
}
ITypeInfo_Release ( pTI ) ;
2007-05-11 16:23:31 +02:00
ITypeLib_Release ( pTL ) ;
return ;
}
2013-08-13 00:56:36 +02:00
static void test_CreateTypeLib ( SYSKIND sys ) {
2010-02-22 23:14:40 +01:00
static const WCHAR stdoleW [ ] = { ' s ' , ' t ' , ' d ' , ' o ' , ' l ' , ' e ' , ' 2 ' , ' . ' , ' t ' , ' l ' , ' b ' , 0 } ;
2010-02-25 15:22:52 +01:00
static OLECHAR typelibW [ ] = { ' t ' , ' y ' , ' p ' , ' e ' , ' l ' , ' i ' , ' b ' , 0 } ;
2010-05-17 00:27:14 +02:00
static OLECHAR helpfileW [ ] = { ' C ' , ' : ' , ' \\ ' , ' b ' , ' o ' , ' g ' , ' u ' , ' s ' , ' . ' , ' h ' , ' l ' , ' p ' , 0 } ;
2010-02-17 13:02:06 +01:00
static OLECHAR interface1W [ ] = { ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' f ' , ' a ' , ' c ' , ' e ' , ' 1 ' , 0 } ;
2010-02-22 23:16:19 +01:00
static OLECHAR interface2W [ ] = { ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' f ' , ' a ' , ' c ' , ' e ' , ' 2 ' , 0 } ;
2010-05-09 21:33:24 +02:00
static OLECHAR interface3W [ ] = { ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' f ' , ' a ' , ' c ' , ' e ' , ' 3 ' , 0 } ;
2010-02-25 15:08:11 +01:00
static OLECHAR dualW [ ] = { ' d ' , ' u ' , ' a ' , ' l ' , 0 } ;
2010-02-24 14:26:32 +01:00
static OLECHAR coclassW [ ] = { ' c ' , ' o ' , ' c ' , ' l ' , ' a ' , ' s ' , ' s ' , 0 } ;
2010-02-22 23:13:14 +01:00
static WCHAR defaultW [ ] = { ' d ' , ' e ' , ' f ' , ' a ' , ' u ' , ' l ' , ' t ' , 0x3213 , 0 } ;
2010-08-20 21:59:25 +02:00
static WCHAR defaultQW [ ] = { ' d ' , ' e ' , ' f ' , ' a ' , ' u ' , ' l ' , ' t ' , ' ? ' , 0 } ;
2010-02-22 23:13:42 +01:00
static OLECHAR func1W [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , ' 1 ' , 0 } ;
static OLECHAR func2W [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , ' 2 ' , 0 } ;
2010-05-17 00:27:34 +02:00
static OLECHAR prop1W [ ] = { ' P ' , ' r ' , ' o ' , ' p ' , ' 1 ' , 0 } ;
2010-02-22 23:13:42 +01:00
static OLECHAR param1W [ ] = { ' p ' , ' a ' , ' r ' , ' a ' , ' m ' , ' 1 ' , 0 } ;
static OLECHAR param2W [ ] = { ' p ' , ' a ' , ' r ' , ' a ' , ' m ' , ' 2 ' , 0 } ;
2010-08-18 19:21:52 +02:00
static OLECHAR asdfW [ ] = { ' A ' , ' s ' , ' d ' , ' f ' , 0 } ;
2013-08-26 19:40:08 +02:00
static OLECHAR aliasW [ ] = { ' a ' , ' l ' , ' i ' , ' a ' , ' s ' , 0 } ;
2013-09-06 14:13:17 +02:00
static OLECHAR invokeW [ ] = { ' I ' , ' n ' , ' v ' , ' o ' , ' k ' , ' e ' , 0 } ;
2010-02-22 23:13:42 +01:00
static OLECHAR * names1 [ ] = { func1W , param1W , param2W } ;
static OLECHAR * names2 [ ] = { func2W , param1W , param2W } ;
2010-05-17 00:27:34 +02:00
static OLECHAR * propname [ ] = { prop1W , param1W } ;
2010-05-09 21:33:24 +02:00
static const GUID custguid = { 0xbf611abe , 0x5b38 , 0x11df , { 0x91 , 0x5c , 0x08 , 0x02 , 0x79 , 0x79 , 0x94 , 0x70 } } ;
2010-08-18 19:21:52 +02:00
static const GUID bogusguid = { 0xbf611abe , 0x5b38 , 0x11df , { 0x91 , 0x5c , 0x08 , 0x02 , 0x79 , 0x79 , 0x94 , 0x71 } } ;
2013-07-31 18:11:11 +02:00
static const GUID interfaceguid = { 0x3b9ff02f , 0x9675 , 0x4861 , { 0xb7 , 0x81 , 0xce , 0xae , 0xa4 , 0x78 , 0x2a , 0xcc } } ;
static const GUID interface2guid = { 0x3b9ff02f , 0x9675 , 0x4861 , { 0xb7 , 0x81 , 0xce , 0xae , 0xa4 , 0x78 , 0x2a , 0xcd } } ;
2010-02-17 13:02:06 +01:00
2010-02-17 13:01:33 +01:00
char filename [ MAX_PATH ] ;
WCHAR filenameW [ MAX_PATH ] ;
ICreateTypeLib2 * createtl ;
2010-02-24 14:26:32 +01:00
ICreateTypeInfo * createti ;
2010-05-09 21:33:24 +02:00
ICreateTypeInfo2 * createti2 ;
2010-02-22 23:14:40 +01:00
ITypeLib * tl , * stdole ;
2010-03-15 23:38:40 +01:00
ITypeInfo * interface1 , * interface2 , * dual , * unknown , * dispatch , * ti ;
2010-05-09 21:33:24 +02:00
ITypeInfo2 * ti2 ;
2013-09-06 14:13:17 +02:00
ITypeComp * tcomp ;
2010-08-20 21:59:25 +02:00
FUNCDESC funcdesc , * pfuncdesc ;
ELEMDESC elemdesc [ 5 ] , * edesc ;
2010-02-22 23:11:57 +01:00
PARAMDESCEX paramdescex ;
2010-02-22 23:14:12 +01:00
TYPEDESC typedesc1 , typedesc2 ;
2010-02-24 14:24:12 +01:00
TYPEATTR * typeattr ;
2010-02-25 15:07:13 +01:00
TLIBATTR * libattr ;
2010-02-22 23:14:40 +01:00
HREFTYPE hreftype ;
2013-08-13 00:56:33 +02:00
BSTR name , docstring , helpfile , names [ 3 ] ;
2013-08-13 00:56:36 +02:00
DWORD helpcontext , ptr_size , alignment ;
2010-02-24 14:27:46 +01:00
int impltypeflags ;
2013-08-13 00:56:33 +02:00
unsigned int cnames ;
2010-05-09 21:33:24 +02:00
VARIANT cust_data ;
2010-02-17 13:01:33 +01:00
HRESULT hres ;
2010-12-22 02:02:03 +01:00
TYPEKIND kind ;
2013-09-06 14:13:17 +02:00
DESCKIND desckind ;
BINDPTR bindptr ;
2010-02-17 13:01:33 +01:00
2013-08-13 00:56:36 +02:00
switch ( sys ) {
case SYS_WIN32 :
trace ( " testing SYS_WIN32 \n " ) ;
ptr_size = 4 ;
alignment = sizeof ( void * ) ;
break ;
case SYS_WIN64 :
trace ( " testing SYS_WIN64 \n " ) ;
ptr_size = 8 ;
alignment = 4 ;
break ;
default :
return ;
}
2010-02-17 13:01:33 +01:00
trace ( " CreateTypeLib tests \n " ) ;
2010-02-22 23:14:40 +01:00
hres = LoadTypeLib ( stdoleW , & stdole ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeLib_GetTypeInfoOfGuid ( stdole , & IID_IUnknown , & unknown ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-06-21 21:27:16 +02:00
hres = ITypeInfo_GetTypeAttr ( unknown , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeVft = = 3 * sizeof ( void * ) , " Got wrong cbSizeVft: %u \n " , typeattr - > cbSizeVft ) ;
ITypeInfo_ReleaseTypeAttr ( unknown , typeattr ) ;
2010-02-25 15:08:11 +01:00
hres = ITypeLib_GetTypeInfoOfGuid ( stdole , & IID_IDispatch , & dispatch ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-17 13:01:33 +01:00
GetTempFileNameA ( " . " , " tlb " , 0 , filename ) ;
MultiByteToWideChar ( CP_ACP , 0 , filename , - 1 , filenameW , MAX_PATH ) ;
2013-08-13 00:56:36 +02:00
hres = CreateTypeLib2 ( sys , filenameW , & createtl ) ;
2010-02-17 13:01:33 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_QueryInterface ( createtl , & IID_ITypeLib , ( void * * ) & tl ) ;
2010-02-25 15:07:13 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-12-22 02:02:03 +01:00
hres = ITypeLib_GetTypeInfo ( tl , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got 0x%08x \n " , hres ) ;
hres = ITypeLib_GetTypeInfoType ( tl , 0 , & kind ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got 0x%08x \n " , hres ) ;
hres = ITypeLib_GetTypeInfoType ( tl , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got 0x%08x \n " , hres ) ;
hres = ITypeLib_GetTypeInfoType ( tl , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got 0x%08x \n " , hres ) ;
2010-12-22 02:10:37 +01:00
hres = ITypeLib_GetLibAttr ( tl , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2010-02-25 15:07:13 +01:00
hres = ITypeLib_GetLibAttr ( tl , & libattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( libattr - > syskind = = sys , " syskind = %d \n " , libattr - > syskind ) ;
2010-02-25 15:07:13 +01:00
ok ( libattr - > wMajorVerNum = = 0 , " wMajorVer = %d \n " , libattr - > wMajorVerNum ) ;
ok ( libattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , libattr - > wMinorVerNum ) ;
ok ( libattr - > wLibFlags = = 0 , " wLibFlags = %d \n " , libattr - > wLibFlags ) ;
ITypeLib_ReleaseTLibAttr ( tl , libattr ) ;
2010-02-25 15:22:52 +01:00
name = ( BSTR ) 0xdeadbeef ;
hres = ITypeLib_GetDocumentation ( tl , - 1 , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( name = = NULL , " name != NULL \n " ) ;
ok ( docstring = = NULL , " docstring != NULL \n " ) ;
ok ( helpcontext = = 0 , " helpcontext != 0 \n " ) ;
ok ( helpfile = = NULL , " helpfile != NULL \n " ) ;
hres = ITypeLib_GetDocumentation ( tl , 0 , & name , NULL , NULL , NULL ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_SetName ( createtl , typelibW ) ;
2010-02-25 15:22:52 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_SetHelpFileName ( createtl , helpfileW ) ;
2010-05-17 00:27:14 +02:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-25 15:22:52 +01:00
hres = ITypeLib_GetDocumentation ( tl , - 1 , NULL , NULL , NULL , NULL ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-05-17 00:27:14 +02:00
hres = ITypeLib_GetDocumentation ( tl , - 1 , & name , NULL , NULL , & helpfile ) ;
2010-02-25 15:22:52 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( ! memcmp ( name , typelibW , sizeof ( typelibW ) ) , " name = %s \n " , wine_dbgstr_w ( name ) ) ;
2010-05-17 00:27:14 +02:00
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " helpfile = %s \n " , wine_dbgstr_w ( helpfile ) ) ;
2010-02-25 15:22:52 +01:00
SysFreeString ( name ) ;
2010-05-17 00:27:14 +02:00
SysFreeString ( helpfile ) ;
2010-02-25 15:07:13 +01:00
2010-12-22 21:50:51 +01:00
/* invalid parameters */
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , NULL , TKIND_INTERFACE , & createti ) ;
2010-12-22 21:50:51 +01:00
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , interface1W , TKIND_INTERFACE , NULL ) ;
2010-12-22 21:50:51 +01:00
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , NULL , TKIND_INTERFACE , NULL ) ;
2010-12-22 21:50:51 +01:00
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , interface1W , TKIND_INTERFACE , & createti ) ;
2010-02-17 13:02:06 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 10:24:17 +01:00
2010-02-22 23:16:19 +01:00
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & interface1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-05-17 00:27:14 +02:00
hres = ITypeLib_GetDocumentation ( tl , 0 , & name , NULL , NULL , NULL ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( ! memcmp ( name , interface1W , sizeof ( interface1W ) ) , " name = %s \n " , wine_dbgstr_w ( name ) ) ;
SysFreeString ( name ) ;
ITypeLib_Release ( tl ) ;
name = ( BSTR ) 0xdeadbeef ;
helpfile = ( BSTR ) 0xdeadbeef ;
hres = ITypeInfo_GetDocumentation ( interface1 , - 1 , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( ! memcmp ( name , interface1W , sizeof ( interface1W ) ) , " name = %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " docstring != NULL \n " ) ;
ok ( helpcontext = = 0 , " helpcontext != 0 \n " ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " helpfile = %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeInfo_GetDocumentation ( interface1 , 0 , & name , NULL , NULL , NULL ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-02-22 23:16:19 +01:00
hres = ITypeInfo_GetRefTypeInfo ( interface1 , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2010-05-17 00:27:14 +02:00
2010-02-22 10:24:17 +01:00
hres = ICreateTypeInfo_LayOut ( createti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-07-31 18:11:11 +02:00
hres = ICreateTypeInfo_SetGuid ( createti , & interfaceguid ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 23:14:40 +01:00
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , NULL , & hreftype ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , unknown , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , unknown , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-17 22:05:20 +01:00
if ( hres ! = S_OK ) {
skip ( " Skipping some tests \n " ) ;
return ;
}
2010-02-22 23:14:40 +01:00
2010-02-22 23:16:19 +01:00
hres = ICreateTypeInfo_AddImplType ( createti , 1 , hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 0 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:28:09 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( interface1 , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 3 , " hreftype = %d \n " , hreftype ) ;
2013-06-21 21:27:16 +02:00
hres = ITypeInfo_GetRefTypeInfo ( interface1 , hreftype , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 3 * ptr_size | | broken ( sys = = SYS_WIN32 & & typeattr - > cbSizeVft = = 24 ) /* xp64 */ ,
2013-06-21 21:27:16 +02:00
" retrieved IUnknown gave wrong cbSizeVft: %u \n " , typeattr - > cbSizeVft ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
ITypeInfo_Release ( ti ) ;
2010-03-15 23:38:24 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( interface1 , - 1 , & hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo2 , ( void * * ) & ti2 ) ;
2010-02-22 10:24:17 +01:00
memset ( & funcdesc , 0 , sizeof ( FUNCDESC ) ) ;
funcdesc . funckind = FUNC_PUREVIRTUAL ;
funcdesc . invkind = INVOKE_PROPERTYGET ;
funcdesc . callconv = CC_STDCALL ;
funcdesc . elemdescFunc . tdesc . vt = VT_BSTR ;
2010-03-27 16:55:34 +01:00
U ( funcdesc . elemdescFunc ) . idldesc . wIDLFlags = IDLFLAG_NONE ;
2010-02-22 10:24:17 +01:00
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetFuncDesc ( ti2 , 1 , & pfuncdesc ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetFuncDesc ( ti2 , 0 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam = = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_PROPERTYGET , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 0 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 3 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 24 ) /* xp64 */ ,
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_BSTR , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-03-15 23:38:57 +01:00
hres = ICreateTypeInfo_SetFuncHelpContext ( createti , 0 , 0xabcdefab ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 10:24:17 +01:00
funcdesc . invkind = INVOKE_PROPERTYPUT ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = TYPE_E_INCONSISTENTPROPFUNCS , " got %08x \n " , hres ) ;
funcdesc . invkind = INVOKE_PROPERTYPUTREF ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = TYPE_E_INCONSISTENTPROPFUNCS , " got %08x \n " , hres ) ;
2010-02-22 23:11:57 +01:00
elemdesc [ 0 ] . tdesc . vt = VT_BSTR ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] ) . idldesc . dwReserved = 0 ;
U ( elemdesc [ 0 ] ) . idldesc . wIDLFlags = IDLFLAG_FIN ;
2010-02-22 10:24:17 +01:00
2010-02-22 23:11:57 +01:00
funcdesc . lprgelemdescParam = elemdesc ;
2010-02-22 10:24:17 +01:00
funcdesc . invkind = INVOKE_PROPERTYPUT ;
funcdesc . cParams = 1 ;
funcdesc . elemdescFunc . tdesc . vt = VT_VOID ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:38:57 +01:00
hres = ICreateTypeInfo_SetFuncHelpContext ( createti , 1 , 0xabcdefab ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-12-24 00:51:04 +01:00
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , propname , 0 ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , NULL , 1 ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
2010-05-17 00:27:34 +02:00
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , propname , 1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 1 , propname , 1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 1 , propname , 2 ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 1 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_PROPERTYPUT , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 4 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 28 ) /* xp64 */ ,
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . idldesc . wIDLFlags = = IDLFLAG_FIN , " got: %x \n " , U ( * edesc ) . idldesc . wIDLFlags ) ;
2010-08-20 21:59:25 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-05-17 00:27:34 +02:00
2010-02-22 10:24:17 +01:00
funcdesc . invkind = INVOKE_PROPERTYPUTREF ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:38:57 +01:00
hres = ICreateTypeInfo_SetFuncHelpContext ( createti , 0 , 0xabcdefab ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncHelpContext ( createti , 0 , 0x201 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 10:24:17 +01:00
funcdesc . memid = 1 ;
funcdesc . lprgelemdescParam = NULL ;
funcdesc . invkind = INVOKE_FUNC ;
funcdesc . cParams = 0 ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 1 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 1 , " got %d \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam = = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 0 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 4 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 28 ) , /* xp64 */
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-02-22 01:58:39 +01:00
funcdesc . memid = MEMBERID_NIL ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 1 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 23:14:12 +01:00
elemdesc [ 0 ] . tdesc . vt = VT_PTR ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] . tdesc ) . lptdesc = & typedesc1 ;
2010-02-22 23:14:12 +01:00
typedesc1 . vt = VT_BSTR ;
funcdesc . cParams = 1 ;
funcdesc . lprgelemdescParam = elemdesc ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 4 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:33 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 4 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010004 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 7 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 40 ) /* xp64 */ ,
2010-08-20 21:59:33 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_PTR , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
2010-08-20 21:59:33 +02:00
ok ( U ( edesc - > tdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . lptdesc - > vt = = VT_BSTR , " got: %d \n " , U ( edesc - > tdesc ) . lptdesc - > vt ) ;
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] . tdesc ) . lptdesc = & typedesc2 ;
2010-02-22 23:14:12 +01:00
typedesc2 . vt = VT_PTR ;
2010-03-27 16:55:34 +01:00
U ( typedesc2 ) . lptdesc = & typedesc1 ;
2010-02-22 23:14:12 +01:00
hres = ICreateTypeInfo_AddFuncDesc ( createti , 4 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:33 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 4 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010007 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 7 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 40 ) /* xp64 */ ,
2010-08-20 21:59:33 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_PTR , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
2010-08-20 21:59:33 +02:00
ok ( U ( edesc - > tdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . lptdesc - > vt = = VT_PTR , " got: %d \n " , U ( edesc - > tdesc ) . lptdesc - > vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc ) ;
ok ( U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc - > vt = = VT_BSTR , " got: %d \n " , U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc - > vt ) ;
2010-08-20 21:59:33 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-02-22 23:11:57 +01:00
elemdesc [ 0 ] . tdesc . vt = VT_INT ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] ) . paramdesc . wParamFlags = PARAMFLAG_FHASDEFAULT ;
U ( elemdesc [ 0 ] ) . paramdesc . pparamdescex = & paramdescex ;
2010-02-22 23:11:57 +01:00
V_VT ( & paramdescex . varDefaultValue ) = VT_INT ;
V_INT ( & paramdescex . varDefaultValue ) = 0x123 ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 3 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 3 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010003 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 6 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 36 ) /* xp64 */ ,
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_I4 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x123 , " got: 0x%x \n " ,
V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
2010-08-20 21:59:25 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] ) . idldesc . dwReserved = 0 ;
U ( elemdesc [ 0 ] ) . idldesc . wIDLFlags = IDLFLAG_FIN ;
2010-02-22 23:11:57 +01:00
elemdesc [ 1 ] . tdesc . vt = VT_UI2 ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 1 ] ) . paramdesc . wParamFlags = PARAMFLAG_FHASDEFAULT ;
U ( elemdesc [ 1 ] ) . paramdesc . pparamdescex = & paramdescex ;
2010-02-22 23:11:57 +01:00
V_VT ( & paramdescex . varDefaultValue ) = VT_UI2 ;
V_UI2 ( & paramdescex . varDefaultValue ) = 0xffff ;
funcdesc . cParams = 2 ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 3 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 3 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010009 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 2 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 6 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 36 ) /* xp64 */ ,
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
2010-08-20 21:59:25 +02:00
edesc = pfuncdesc - > lprgelemdescParam + 1 ;
ok ( edesc - > tdesc . vt = = VT_UI2 , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_UI2 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0xFFFF , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
2010-08-20 21:59:25 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-03-27 16:55:34 +01:00
U ( elemdesc [ 0 ] ) . paramdesc . wParamFlags = PARAMFLAG_FHASDEFAULT ;
U ( elemdesc [ 0 ] ) . paramdesc . pparamdescex = & paramdescex ;
2010-02-22 23:12:45 +01:00
elemdesc [ 1 ] . tdesc . vt = VT_INT ;
V_VT ( & paramdescex . varDefaultValue ) = VT_INT ;
V_INT ( & paramdescex . varDefaultValue ) = 0xffffffff ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 3 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-22 23:13:14 +01:00
elemdesc [ 0 ] . tdesc . vt = VT_BSTR ;
elemdesc [ 1 ] . tdesc . vt = VT_BSTR ;
V_VT ( & paramdescex . varDefaultValue ) = VT_BSTR ;
V_BSTR ( & paramdescex . varDefaultValue ) = SysAllocString ( defaultW ) ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 3 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2011-01-14 22:54:18 +01:00
SysFreeString ( V_BSTR ( & paramdescex . varDefaultValue ) ) ;
2010-02-22 23:13:14 +01:00
2010-08-20 21:59:25 +02:00
hres = ITypeInfo2_GetFuncDesc ( ti2 , 3 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x6001000b , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 2 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 6 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 36 ) /* xp64 */ ,
2010-08-20 21:59:25 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_BSTR , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) , defaultQW ) ,
2010-08-20 21:59:25 +02:00
" got: %s \n " ,
2010-08-29 23:38:51 +02:00
wine_dbgstr_w ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ) ;
2010-08-20 21:59:25 +02:00
edesc = pfuncdesc - > lprgelemdescParam + 1 ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_BSTR , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) , defaultQW ) ,
2010-08-20 21:59:25 +02:00
" got: %s \n " ,
2010-08-29 23:38:51 +02:00
wine_dbgstr_w ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ) ;
2010-08-20 21:59:25 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-08-20 21:59:33 +02:00
elemdesc [ 0 ] . tdesc . vt = VT_USERDEFINED ;
2010-08-29 23:38:51 +02:00
U ( elemdesc [ 0 ] . tdesc ) . hreftype = hreftype ;
2013-04-09 12:13:13 +02:00
U ( elemdesc [ 0 ] ) . paramdesc . pparamdescex = & paramdescex ;
U ( elemdesc [ 0 ] ) . paramdesc . wParamFlags = PARAMFLAG_FHASDEFAULT ;
V_VT ( & paramdescex . varDefaultValue ) = VT_INT ;
V_INT ( & paramdescex . varDefaultValue ) = 0x789 ;
2010-08-20 21:59:33 +02:00
funcdesc . lprgelemdescParam = elemdesc ;
funcdesc . invkind = INVOKE_FUNC ;
funcdesc . cParams = 1 ;
funcdesc . elemdescFunc . tdesc . vt = VT_VOID ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 5 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetFuncDesc ( ti2 , 5 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010005 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 8 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 44 ) , /* xp64 */
2010-08-20 21:59:33 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
2013-04-09 12:13:13 +02:00
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
2010-08-20 21:59:33 +02:00
ok ( edesc - > tdesc . vt = = VT_USERDEFINED , " got: %d \n " , edesc - > tdesc . vt ) ;
2010-08-29 23:38:51 +02:00
ok ( U ( edesc - > tdesc ) . hreftype = = hreftype , " got: 0x%x \n " , U ( edesc - > tdesc ) . hreftype ) ;
2013-04-09 12:13:13 +02:00
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_INT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x789 , " got: %d \n " ,
V_INT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
2010-08-20 21:59:33 +02:00
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2013-04-09 12:12:51 +02:00
elemdesc [ 0 ] . tdesc . vt = VT_VARIANT ;
U ( elemdesc [ 0 ] ) . paramdesc . pparamdescex = & paramdescex ;
U ( elemdesc [ 0 ] ) . paramdesc . wParamFlags = PARAMFLAG_FHASDEFAULT ;
V_VT ( & paramdescex . varDefaultValue ) = VT_INT ;
V_INT ( & paramdescex . varDefaultValue ) = 3 ;
funcdesc . lprgelemdescParam = elemdesc ;
funcdesc . invkind = INVOKE_FUNC ;
funcdesc . cParams = 1 ;
funcdesc . elemdescFunc . tdesc . vt = VT_VARIANT ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 6 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetFuncDesc ( ti2 , 6 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010006 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 9 * ptr_size | | broken ( sys = = SYS_WIN32 & & pfuncdesc - > oVft = = 48 ) , /* xp64 */
2013-04-09 12:12:51 +02:00
" got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VARIANT , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( edesc - > tdesc . vt = = VT_VARIANT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_INT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 3 , " got: %d \n " ,
V_INT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
2010-05-17 00:27:14 +02:00
hres = ITypeInfo_GetDocumentation ( interface1 , 0 , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( name = = NULL , " name != NULL \n " ) ;
ok ( docstring = = NULL , " docstring != NULL \n " ) ;
ok ( helpcontext = = 0x201 , " helpcontext != 0x201 \n " ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " helpfile = %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
2010-02-22 23:13:42 +01:00
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 1000 , NULL , 1 ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 1000 , names1 , 1 ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , names1 , 2 ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , names2 , 1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 0 , names1 , 1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-05-17 00:27:14 +02:00
hres = ITypeInfo_GetDocumentation ( interface1 , 0 , & name , NULL , NULL , NULL ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( ! memcmp ( name , func1W , sizeof ( func1W ) ) , " name = %s \n " , wine_dbgstr_w ( name ) ) ;
SysFreeString ( name ) ;
2010-02-22 23:13:42 +01:00
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 3 , names2 , 3 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetFuncAndParamNames ( createti , 3 , names1 , 3 ) ;
ok ( hres = = TYPE_E_AMBIGUOUSNAME , " got %08x \n " , hres ) ;
2010-08-20 21:59:25 +02:00
ITypeInfo2_Release ( ti2 ) ;
2010-02-17 13:02:06 +01:00
ICreateTypeInfo_Release ( createti ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , interface1W , TKIND_INTERFACE , & createti ) ;
2010-02-17 13:02:06 +01:00
ok ( hres = = TYPE_E_NAMECONFLICT , " got %08x \n " , hres ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , interface2W , TKIND_INTERFACE , & createti ) ;
2010-02-22 23:16:19 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-07-31 18:11:11 +02:00
hres = ICreateTypeInfo_SetGuid ( createti , & interface2guid ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:26:32 +01:00
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & interface2 ) ;
2010-02-22 23:16:19 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:28:09 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( interface2 , 0 , & hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-02-24 14:26:32 +01:00
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , interface1 , & hreftype ) ;
2010-02-22 23:16:19 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetRefTypeInfo ( interface2 , 0 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( ti = = interface1 , " Received and added interfaces are different \n " ) ;
ITypeInfo_Release ( ti ) ;
2010-02-24 14:26:32 +01:00
hres = ICreateTypeInfo_AddImplType ( createti , 0 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:28:09 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( interface2 , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 2 , " hreftype = %d \n " , hreftype ) ;
2010-03-15 23:38:24 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( interface2 , - 1 , & hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-02-24 14:27:46 +01:00
hres = ICreateTypeInfo_SetImplTypeFlags ( createti , 0 , IMPLTYPEFLAG_FDEFAULT ) ;
ok ( hres = = TYPE_E_BADMODULEKIND , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetImplTypeFlags ( interface2 , 0 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = 0 , " impltypeflags = %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetImplTypeFlags ( interface2 , 1 , & impltypeflags ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2013-04-09 12:12:51 +02:00
funcdesc . elemdescFunc . tdesc . vt = VT_VOID ;
2010-03-15 23:40:15 +01:00
funcdesc . oVft = 0xaaac ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN64 ) {
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
funcdesc . oVft = 0xaab0 ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
}
2010-03-15 23:40:15 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
funcdesc . oVft = 0xaaa8 ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-04-09 12:12:20 +02:00
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & ti2 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetFuncDesc ( ti2 , 0 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60020000 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
ok ( pfuncdesc - > oVft = = ( short ) 0xaaa8 , " got %d \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
ITypeInfo2_ReleaseFuncDesc ( ti2 , pfuncdesc ) ;
ITypeInfo2_Release ( ti2 ) ;
2010-03-15 23:40:15 +01:00
funcdesc . oVft = 0 ;
2010-02-24 14:26:32 +01:00
ICreateTypeInfo_Release ( createti ) ;
2010-05-09 21:33:24 +02:00
VariantInit ( & cust_data ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , interface3W , TKIND_INTERFACE , & createti ) ;
2010-05-09 21:33:24 +02:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ICreateTypeInfo2 , ( void * * ) & createti2 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo2_QueryInterface ( createti2 , & IID_ITypeInfo2 , ( void * * ) & ti2 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetCustData ( ti2 , NULL , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , NULL , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , & custguid , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , & custguid , & cust_data ) ;
ok ( hres = = DISP_E_BADVARTYPE , " got %08x \n " , hres ) ;
V_VT ( & cust_data ) = VT_UI4 ;
V_I4 ( & cust_data ) = 0xdeadbeef ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
V_I4 ( & cust_data ) = 0 ;
V_VT ( & cust_data ) = VT_EMPTY ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( V_VT ( & cust_data ) = = VT_UI4 , " got %d \n " , V_VT ( & cust_data ) ) ;
ok ( V_I4 ( & cust_data ) = = 0xdeadbeef , " got 0x%08x \n " , V_I4 ( & cust_data ) ) ;
V_VT ( & cust_data ) = VT_UI4 ;
V_I4 ( & cust_data ) = 12345678 ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
V_I4 ( & cust_data ) = 0 ;
V_VT ( & cust_data ) = VT_EMPTY ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( V_VT ( & cust_data ) = = VT_UI4 , " got %d \n " , V_VT ( & cust_data ) ) ;
ok ( V_I4 ( & cust_data ) = = 12345678 , " got 0x%08x \n " , V_I4 ( & cust_data ) ) ;
2010-08-18 19:21:52 +02:00
V_VT ( & cust_data ) = VT_BSTR ;
V_BSTR ( & cust_data ) = SysAllocString ( asdfW ) ;
hres = ICreateTypeInfo2_SetCustData ( createti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
SysFreeString ( V_BSTR ( & cust_data ) ) ;
V_I4 ( & cust_data ) = 0 ;
V_VT ( & cust_data ) = VT_EMPTY ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( V_VT ( & cust_data ) = = VT_BSTR , " got %d \n " , V_VT ( & cust_data ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & cust_data ) , asdfW ) , " got %s \n " , wine_dbgstr_w ( V_BSTR ( & cust_data ) ) ) ;
SysFreeString ( V_BSTR ( & cust_data ) ) ;
V_VT ( & cust_data ) = VT_UI4 ;
V_UI4 ( & cust_data ) = 17 ;
hres = ITypeInfo2_GetCustData ( ti2 , & bogusguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( V_VT ( & cust_data ) = = VT_EMPTY , " got: %d \n " , V_VT ( & cust_data ) ) ;
2010-05-09 21:33:24 +02:00
ITypeInfo2_Release ( ti2 ) ;
ICreateTypeInfo2_Release ( createti2 ) ;
ICreateTypeInfo_Release ( createti ) ;
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , coclassW , TKIND_COCLASS , & createti ) ;
2010-02-24 14:26:32 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , interface1 , & hreftype ) ;
2010-02-22 23:16:19 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:26:32 +01:00
hres = ICreateTypeInfo_AddImplType ( createti , 0 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 0 , hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , unknown , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 1 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 1 , hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 2 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-24 14:27:46 +01:00
hres = ICreateTypeInfo_SetImplTypeFlags ( createti , 0 , IMPLTYPEFLAG_FDEFAULT ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_SetImplTypeFlags ( createti , 1 , IMPLTYPEFLAG_FRESTRICTED ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 0 , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 0 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = IMPLTYPEFLAG_FDEFAULT , " impltypeflags = %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 1 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = IMPLTYPEFLAG_FRESTRICTED , " impltypeflags = %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 2 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = 0 , " impltypeflags = %x \n " , impltypeflags ) ;
2010-02-24 14:28:09 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 0 , " hreftype = %d \n " , hreftype ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 1 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 1 , " hreftype = %d \n " , hreftype ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 2 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 1 , " hreftype = %d \n " , hreftype ) ;
2010-03-15 23:38:24 +01:00
hres = ITypeInfo_GetRefTypeOfImplType ( ti , - 1 , & hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
2010-02-24 14:27:46 +01:00
ITypeInfo_Release ( ti ) ;
2010-02-24 14:26:32 +01:00
ICreateTypeInfo_Release ( createti ) ;
2010-02-22 23:16:19 +01:00
2012-08-13 11:12:24 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , dualW , TKIND_INTERFACE , & createti ) ;
2010-02-25 15:08:11 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:38:24 +01:00
hres = ICreateTypeInfo_SetTypeFlags ( createti , TYPEFLAG_FDUAL ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddFuncDesc ( createti , 0 , & funcdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-02-25 15:08:11 +01:00
hres = ICreateTypeInfo_AddRefTypeInfo ( createti , dispatch , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_AddImplType ( createti , 0 , hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:38:40 +01:00
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & dual ) ;
2010-02-25 15:08:11 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:38:40 +01:00
hres = ITypeInfo_GetTypeAttr ( dual , & typeattr ) ;
2010-02-25 15:08:11 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeInstance = = ptr_size , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
2010-02-25 15:08:11 +01:00
ok ( typeattr - > typekind = = 3 , " typekind = %d \n " , typeattr - > typekind ) ;
2010-03-15 23:38:24 +01:00
ok ( typeattr - > cFuncs = = 1 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
2010-02-25 15:08:11 +01:00
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 8 * ptr_size | | broken ( sys = = SYS_WIN32 & & typeattr - > cbSizeVft = = 7 * sizeof ( void * ) + 4 ) , /* xp64 */
2010-04-07 11:35:05 +02:00
" cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2010-02-25 15:08:11 +01:00
ok ( typeattr - > cbAlignment = = 4 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2010-03-15 23:38:24 +01:00
ok ( typeattr - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL ) , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
2010-02-25 15:08:11 +01:00
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
2010-03-15 23:38:40 +01:00
ITypeInfo_ReleaseTypeAttr ( dual , typeattr ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( dual , - 1 , & hreftype ) ;
2010-03-15 23:38:24 +01:00
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = - 2 , " got %08x \n " , hreftype ) ;
2010-03-15 23:38:40 +01:00
hres = ITypeInfo_GetRefTypeInfo ( dual , - 2 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeInstance = = ptr_size , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
2010-03-15 23:38:40 +01:00
ok ( typeattr - > typekind = = 4 , " typekind = %d \n " , typeattr - > typekind ) ;
2010-03-17 22:04:53 +01:00
ok ( typeattr - > cFuncs = = 8 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
2010-03-15 23:38:40 +01:00
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
2010-04-07 11:35:05 +02:00
ok ( typeattr - > cbSizeVft = = 7 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2010-03-15 23:38:40 +01:00
ok ( typeattr - > cbAlignment = = 4 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL ) , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
2010-02-25 15:08:11 +01:00
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
ITypeInfo_Release ( ti ) ;
2013-08-26 19:40:08 +02:00
hres = ICreateTypeInfo_SetTypeDescAlias ( createti , & typedesc1 ) ;
ok ( hres = = TYPE_E_BADMODULEKIND , " got %08x \n " , hres ) ;
2010-02-25 15:08:11 +01:00
ICreateTypeInfo_Release ( createti ) ;
2010-02-24 14:24:12 +01:00
hres = ITypeInfo_GetTypeAttr ( interface1 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeInstance = = ptr_size , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > typekind = = 3 , " typekind = %d \n " , typeattr - > typekind ) ;
2013-04-09 12:12:51 +02:00
ok ( typeattr - > cFuncs = = 13 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 16 * ptr_size | | broken ( sys = = SYS_WIN32 & & typeattr - > cbSizeVft = = 3 * sizeof ( void * ) + 52 ) , /* xp64 */
2010-04-07 11:35:05 +02:00
" cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > cbAlignment = = 4 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( interface1 , typeattr ) ;
hres = ITypeInfo_GetTypeAttr ( interface2 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeInstance = = ptr_size , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > typekind = = 3 , " typekind = %d \n " , typeattr - > typekind ) ;
2010-03-15 23:40:15 +01:00
ok ( typeattr - > cFuncs = = 2 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
2013-08-13 00:56:36 +02:00
ok ( ( sys = = SYS_WIN32 & & typeattr - > cbSizeVft = = 0xaab0 ) | |
( sys = = SYS_WIN64 & & typeattr - > cbSizeVft = = 0xaab8 ) ,
" cbSizeVft = 0x%x \n " , typeattr - > cbSizeVft ) ;
2010-02-24 14:24:12 +01:00
ok ( typeattr - > cbAlignment = = 4 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( interface2 , typeattr ) ;
2010-03-15 23:39:15 +01:00
ok ( ITypeInfo_Release ( interface2 ) = = 0 , " Object should be freed \n " ) ;
ok ( ITypeInfo_Release ( interface1 ) = = 0 , " Object should be freed \n " ) ;
ok ( ITypeInfo_Release ( dual ) = = 0 , " Object should be freed \n " ) ;
2013-08-26 19:40:08 +02:00
hres = ICreateTypeLib2_CreateTypeInfo ( createtl , aliasW , TKIND_ALIAS , & createti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ICreateTypeInfo_QueryInterface ( createti , & IID_ITypeInfo , ( void * * ) & interface1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
if ( 0 ) {
/* windows gives invalid values here, and even breaks the typeinfo permanently
* on winxp . only call GetTypeAttr ( ) on a TKIND_ALIAS after SetTypeDescAlias . */
hres = ITypeInfo_GetTypeAttr ( interface1 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = 0xffffffb4 , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_ALIAS , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 0 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = 0 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ok ( typeattr - > tdescAlias . vt = = VT_EMPTY , " Got wrong tdescAlias.vt: %u \n " , typeattr - > tdescAlias . vt ) ;
ITypeInfo_ReleaseTypeAttr ( interface1 , typeattr ) ;
}
hres = ICreateTypeInfo_SetTypeDescAlias ( createti , NULL ) ;
ok ( hres = = E_INVALIDARG , " got %08x \n " , hres ) ;
typedesc1 . vt = VT_I1 ;
hres = ICreateTypeInfo_SetTypeDescAlias ( createti , & typedesc1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( interface1 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = 1 , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_ALIAS , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 0 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = 1 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ok ( typeattr - > tdescAlias . vt = = VT_I1 , " Got wrong tdescAlias.vt: %u \n " , typeattr - > tdescAlias . vt ) ;
ITypeInfo_ReleaseTypeAttr ( interface1 , typeattr ) ;
typedesc1 . vt = VT_R8 ;
hres = ICreateTypeInfo_SetTypeDescAlias ( createti , & typedesc1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( interface1 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = 8 , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_ALIAS , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 0 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = 4 , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ok ( typeattr - > tdescAlias . vt = = VT_R8 , " Got wrong tdescAlias.vt: %u \n " , typeattr - > tdescAlias . vt ) ;
ITypeInfo_ReleaseTypeAttr ( interface1 , typeattr ) ;
ITypeInfo_Release ( interface1 ) ;
ICreateTypeInfo_Release ( createti ) ;
hres = ICreateTypeLib2_SaveAllChanges ( createtl ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2010-03-15 23:39:15 +01:00
ok ( ICreateTypeLib2_Release ( createtl ) = = 0 , " Object should be freed \n " ) ;
2010-03-17 22:05:20 +01:00
2010-03-15 23:39:15 +01:00
ok ( ITypeInfo_Release ( dispatch ) = = 0 , " Object should be freed \n " ) ;
ok ( ITypeInfo_Release ( unknown ) = = 0 , " Object should be freed \n " ) ;
2010-03-17 22:05:20 +01:00
ok ( ITypeLib_Release ( stdole ) = = 0 , " Object should be freed \n " ) ;
2010-02-22 23:14:40 +01:00
2010-03-17 22:05:20 +01:00
hres = LoadTypeLibEx ( filenameW , REGKIND_NONE , & tl ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:33 +02:00
hres = ITypeLib_GetLibAttr ( tl , & libattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
2013-08-13 00:56:36 +02:00
ok ( libattr - > syskind = = sys , " syskind = %d \n " , libattr - > syskind ) ;
2013-08-13 00:56:33 +02:00
ok ( libattr - > wMajorVerNum = = 0 , " wMajorVer = %d \n " , libattr - > wMajorVerNum ) ;
ok ( libattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , libattr - > wMinorVerNum ) ;
todo_wine
ok ( libattr - > wLibFlags = = LIBFLAG_FHASDISKIMAGE , " wLibFlags = %d \n " , libattr - > wLibFlags ) ;
ITypeLib_ReleaseTLibAttr ( tl , libattr ) ;
hres = ITypeLib_GetDocumentation ( tl , - 1 , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( memcmp ( typelibW , name , sizeof ( typelibW ) ) = = 0 , " got wrong typelib name: %s \n " ,
wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got wrong docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got wrong helpcontext: 0x%x \n " , helpcontext ) ;
ok ( memcmp ( helpfileW , helpfile , sizeof ( helpfileW ) ) = = 0 ,
" got wrong helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeLib_GetDocumentation ( tl , 0 , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( memcmp ( interface1W , name , sizeof ( interface1W ) ) = = 0 , " got wrong typeinfo name: %s \n " ,
wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got wrong docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got wrong helpcontext: 0x%x \n " , helpcontext ) ;
ok ( memcmp ( helpfileW , helpfile , sizeof ( helpfileW ) ) = = 0 ,
" got wrong helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeLib_GetTypeInfo ( tl , 0 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_INTERFACE , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 13 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( typeattr - > cbSizeVft = = 16 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 16 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 3 , " hreftype = %d \n " , hreftype ) ;
hres = ITypeInfo_GetRefTypeInfo ( ti , hreftype , & unknown ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( unknown , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( IsEqualGUID ( & typeattr - > guid , & IID_IUnknown ) , " got wrong reftypeinfo \n " ) ;
ITypeInfo_ReleaseTypeAttr ( unknown , typeattr ) ;
ITypeInfo_Release ( unknown ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 0 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_PROPERTYPUTREF , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . idldesc . wIDLFlags = = IDLFLAG_FIN , " got: %x \n " , U ( * edesc ) . idldesc . wIDLFlags ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( ! memcmp ( name , func1W , sizeof ( func1W ) ) , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0x201 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , NULL , 0 , & cnames ) ;
ok ( hres = = E_INVALIDARG , " got: %08x \n " , hres ) ;
cnames = 8 ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , names , 0 , & cnames ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( cnames = = 0 , " got: %u \n " , cnames ) ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , names , sizeof ( names ) / sizeof ( * names ) , & cnames ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( cnames = = 1 , " got: %u \n " , cnames ) ;
ok ( ! memcmp ( names [ 0 ] , func1W , sizeof ( func1W ) ) , " got names[0]: %s \n " , wine_dbgstr_w ( names [ 0 ] ) ) ;
SysFreeString ( names [ 0 ] ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 1 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010001 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam = = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 0 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 4 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 4 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 2 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x1 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam = = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 0 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 5 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 5 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 3 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x6001000b , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 2 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 6 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 6 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_BSTR , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) , defaultQW ) ,
" got: %s \n " ,
wine_dbgstr_w ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ) ;
edesc = pfuncdesc - > lprgelemdescParam + 1 ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_BSTR , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) , defaultQW ) ,
" got: %s \n " ,
wine_dbgstr_w ( V_BSTR ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( ! memcmp ( name , func2W , sizeof ( func2W ) ) , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , names , sizeof ( names ) / sizeof ( * names ) , & cnames ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( cnames = = 3 , " got: %u \n " , cnames ) ;
ok ( ! memcmp ( names [ 0 ] , func2W , sizeof ( func2W ) ) , " got names[0]: %s \n " , wine_dbgstr_w ( names [ 0 ] ) ) ;
ok ( ! memcmp ( names [ 1 ] , param1W , sizeof ( func2W ) ) , " got names[1]: %s \n " , wine_dbgstr_w ( names [ 1 ] ) ) ;
ok ( ! memcmp ( names [ 2 ] , param2W , sizeof ( func2W ) ) , " got names[2]: %s \n " , wine_dbgstr_w ( names [ 2 ] ) ) ;
SysFreeString ( names [ 0 ] ) ;
SysFreeString ( names [ 1 ] ) ;
SysFreeString ( names [ 2 ] ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 4 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x6001000c , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 2 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 7 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 7 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_I4 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0xFFFFFFFF ,
" got: 0x%x \n " , V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
edesc = pfuncdesc - > lprgelemdescParam + 1 ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_I4 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0xFFFFFFFF ,
" got: 0x%x \n " , V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 5 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010005 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 8 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 8 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x789 , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( edesc - > tdesc . vt = = VT_USERDEFINED , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( edesc - > tdesc ) . hreftype = = hreftype , " got: 0x%x \n " , U ( edesc - > tdesc ) . hreftype ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 6 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010006 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 9 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 9 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VARIANT , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x3 , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( edesc - > tdesc . vt = = VT_VARIANT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( edesc - > tdesc ) . hreftype = = 0 , " got: 0x%x \n " , U ( edesc - > tdesc ) . hreftype ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 7 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010009 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 2 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 10 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 10 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
edesc = pfuncdesc - > lprgelemdescParam + 1 ;
ok ( edesc - > tdesc . vt = = VT_UI2 , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_UI2 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0xFFFF , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 8 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010003 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 11 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 11 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_INT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_I4 , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x123 , " got: 0x%x \n " ,
V_I4 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 9 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam = = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_PROPERTYGET , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 0 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 12 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 12 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_BSTR , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( ! memcmp ( name , func1W , sizeof ( func1W ) ) , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0x201 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
2013-08-28 10:42:03 +02:00
SysFreeString ( name ) ;
2013-08-13 00:56:33 +02:00
SysFreeString ( helpfile ) ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , names , sizeof ( names ) / sizeof ( * names ) , & cnames ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( cnames = = 1 , " got: %u \n " , cnames ) ;
ok ( ! memcmp ( names [ 0 ] , func1W , sizeof ( func1W ) ) , " got names[0]: %s \n " , wine_dbgstr_w ( names [ 0 ] ) ) ;
2013-08-28 10:42:03 +02:00
SysFreeString ( names [ 0 ] ) ;
2013-08-13 00:56:33 +02:00
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 10 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010007 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 13 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 13 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_PTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( edesc - > tdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . lptdesc - > vt = = VT_PTR , " got: %d \n " , U ( edesc - > tdesc ) . lptdesc - > vt ) ;
ok ( U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc ) ;
ok ( U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc - > vt = = VT_BSTR , " got: %d \n " , U ( * U ( edesc - > tdesc ) . lptdesc ) . lptdesc - > vt ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 11 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60010004 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 14 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 14 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_PTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FIN , " got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex = = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( edesc - > tdesc ) . lptdesc ! = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . lptdesc - > vt = = VT_BSTR , " got: %d \n " , U ( edesc - > tdesc ) . lptdesc - > vt ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( name = = NULL , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( helpfile ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 12 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_PROPERTYPUT , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( pfuncdesc - > oVft = = 15 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( pfuncdesc - > oVft = = 15 * sizeof ( void * ) , " got %d \n " , pfuncdesc - > oVft ) ;
2013-08-13 00:56:33 +02:00
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_BSTR , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . idldesc . wIDLFlags = = IDLFLAG_FIN , " got: %x \n " , U ( * edesc ) . idldesc . wIDLFlags ) ;
hres = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & name , & docstring , & helpcontext , & helpfile ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( ! memcmp ( name , func1W , sizeof ( func1W ) ) , " got name: %s \n " , wine_dbgstr_w ( name ) ) ;
ok ( docstring = = NULL , " got docstring: %s \n " , wine_dbgstr_w ( docstring ) ) ;
ok ( helpcontext = = 0x201 , " got helpcontext: 0x%x \n " , helpcontext ) ;
ok ( ! memcmp ( helpfile , helpfileW , sizeof ( helpfileW ) ) , " got helpfile: %s \n " , wine_dbgstr_w ( helpfile ) ) ;
SysFreeString ( name ) ;
SysFreeString ( helpfile ) ;
hres = ITypeInfo_GetNames ( ti , pfuncdesc - > memid , names , sizeof ( names ) / sizeof ( * names ) , & cnames ) ;
ok ( hres = = S_OK , " got: %08x \n " , hres ) ;
ok ( cnames = = 1 , " got: %u \n " , cnames ) ;
ok ( ! memcmp ( names [ 0 ] , func1W , sizeof ( func1W ) ) , " got names[0]: %s \n " , wine_dbgstr_w ( names [ 0 ] ) ) ;
2013-08-28 10:42:03 +02:00
SysFreeString ( names [ 0 ] ) ;
2013-08-13 00:56:33 +02:00
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 13 , & pfuncdesc ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
hres = ITypeLib_GetTypeInfo ( tl , 1 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_INTERFACE , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 2 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 0xaab8 | | typeattr - > cbSizeVft = = 0xaab0 | |
2013-08-13 00:56:33 +02:00
typeattr - > cbSizeVft = = 0x5560 , " cbSizeVft = 0x%x \n " , typeattr - > cbSizeVft ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 0 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60020000 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
ok ( pfuncdesc - > oVft = = 0xffffaaa8 | |
pfuncdesc - > oVft = = 0x5550 , " got %x \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_VARIANT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x3 , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( edesc - > tdesc ) . lptdesc = = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . hreftype = = 0 , " got: %d \n " , U ( edesc - > tdesc ) . hreftype ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
hres = ITypeInfo_GetFuncDesc ( ti , 1 , & pfuncdesc ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( pfuncdesc - > memid = = 0x60020001 , " got %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > lprgscode = = NULL , " got %p \n " , pfuncdesc - > lprgscode ) ;
ok ( pfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , pfuncdesc - > lprgelemdescParam ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got 0x%x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , pfuncdesc - > callconv ) ;
ok ( pfuncdesc - > cParams = = 1 , " got %d \n " , pfuncdesc - > cParams ) ;
ok ( pfuncdesc - > cParamsOpt = = 0 , " got %d \n " , pfuncdesc - > cParamsOpt ) ;
ok ( pfuncdesc - > oVft = = 0xffffaaac | |
2013-08-13 00:56:36 +02:00
pfuncdesc - > oVft = = 0xffffaab0 | |
2013-08-13 00:56:33 +02:00
pfuncdesc - > oVft = = 0x5558 , " got %x \n " , pfuncdesc - > oVft ) ;
ok ( pfuncdesc - > cScodes = = 0 , " got %d \n " , pfuncdesc - > cScodes ) ;
ok ( pfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , pfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( pfuncdesc - > wFuncFlags = = 0 , " got 0x%x \n " , pfuncdesc - > wFuncFlags ) ;
edesc = pfuncdesc - > lprgelemdescParam ;
ok ( edesc - > tdesc . vt = = VT_VARIANT , " got: %d \n " , edesc - > tdesc . vt ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex ! = NULL , " got: %p \n " , U ( * edesc ) . paramdesc . pparamdescex ) ;
ok ( U ( * edesc ) . paramdesc . pparamdescex - > cBytes = = sizeof ( PARAMDESCEX ) , " got: %d \n " ,
U ( * edesc ) . paramdesc . pparamdescex - > cBytes ) ;
ok ( V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = VT_INT , " got: %d \n " ,
V_VT ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) = = 0x3 , " got: 0x%x \n " ,
V_UI2 ( & U ( * edesc ) . paramdesc . pparamdescex - > varDefaultValue ) ) ;
ok ( U ( * edesc ) . paramdesc . wParamFlags = = PARAMFLAG_FHASDEFAULT ,
" got: 0x%x \n " , U ( * edesc ) . paramdesc . wParamFlags ) ;
ok ( U ( edesc - > tdesc ) . lptdesc = = NULL , " got: %p \n " , U ( edesc - > tdesc ) . lptdesc ) ;
ok ( U ( edesc - > tdesc ) . hreftype = = 0 , " got: %d \n " , U ( edesc - > tdesc ) . hreftype ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
hres = ITypeLib_GetTypeInfo ( tl , 2 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_QueryInterface ( ti , & IID_ITypeInfo2 , ( void * * ) & ti2 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_INTERFACE , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 0 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
VariantClear ( & cust_data ) ;
hres = ITypeInfo2_GetCustData ( ti2 , & custguid , & cust_data ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( V_VT ( & cust_data ) = = VT_BSTR , " got wrong custdata type: %u \n " , V_VT ( & cust_data ) ) ;
ok ( ! lstrcmpW ( V_BSTR ( & cust_data ) , asdfW ) , " got wrong custdata value: %s \n " , wine_dbgstr_w ( V_BSTR ( & cust_data ) ) ) ;
SysFreeString ( V_BSTR ( & cust_data ) ) ;
ITypeInfo2_Release ( ti2 ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
hres = ITypeLib_GetTypeInfo ( tl , 3 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_COCLASS , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 3 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = %d \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 0 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 0 , " got wrong hreftype: %x \n " , hreftype ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 0 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = IMPLTYPEFLAG_FDEFAULT , " got wrong flag: %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 1 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 1 , " got wrong hreftype: %x \n " , hreftype ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 1 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = IMPLTYPEFLAG_FRESTRICTED , " got wrong flag: %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 2 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = 1 , " got wrong hreftype: %x \n " , hreftype ) ;
hres = ITypeInfo_GetImplTypeFlags ( ti , 2 , & impltypeflags ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( impltypeflags = = 0 , " got wrong flag: %x \n " , impltypeflags ) ;
hres = ITypeInfo_GetRefTypeOfImplType ( ti , 3 , & hreftype ) ;
ok ( hres = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hres ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
hres = ITypeLib_GetTypeInfo ( tl , 4 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_DISPATCH , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 8 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 7 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL ) , " wTypeFlags = 0x%x \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
2013-09-06 14:13:17 +02:00
hres = ITypeInfo_GetTypeComp ( ti , & tcomp ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeComp_Bind ( tcomp , invokeW , 0 , INVOKE_FUNC , & interface1 , & desckind , & bindptr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( desckind = = DESCKIND_FUNCDESC , " got wrong desckind: 0x%x \n " , desckind ) ;
ok ( bindptr . lpfuncdesc - > memid = = 0x60010003 , " got %x \n " , bindptr . lpfuncdesc - > memid ) ;
ok ( bindptr . lpfuncdesc - > lprgscode = = NULL , " got %p \n " , bindptr . lpfuncdesc - > lprgscode ) ;
ok ( bindptr . lpfuncdesc - > lprgelemdescParam ! = NULL , " got %p \n " , bindptr . lpfuncdesc - > lprgelemdescParam ) ;
ok ( bindptr . lpfuncdesc - > funckind = = FUNC_DISPATCH , " got 0x%x \n " , bindptr . lpfuncdesc - > funckind ) ;
ok ( bindptr . lpfuncdesc - > invkind = = INVOKE_FUNC , " got 0x%x \n " , bindptr . lpfuncdesc - > invkind ) ;
ok ( bindptr . lpfuncdesc - > callconv = = CC_STDCALL , " got 0x%x \n " , bindptr . lpfuncdesc - > callconv ) ;
ok ( bindptr . lpfuncdesc - > cParams = = 8 , " got %d \n " , bindptr . lpfuncdesc - > cParams ) ;
ok ( bindptr . lpfuncdesc - > cParamsOpt = = 0 , " got %d \n " , bindptr . lpfuncdesc - > cParamsOpt ) ;
# ifdef _WIN64
if ( sys = = SYS_WIN32 )
todo_wine ok ( bindptr . lpfuncdesc - > oVft = = 6 * sizeof ( void * ) , " got %x \n " , bindptr . lpfuncdesc - > oVft ) ;
else
# endif
ok ( bindptr . lpfuncdesc - > oVft = = 6 * sizeof ( void * ) , " got %x \n " , bindptr . lpfuncdesc - > oVft ) ;
ok ( bindptr . lpfuncdesc - > cScodes = = 0 , " got %d \n " , bindptr . lpfuncdesc - > cScodes ) ;
ok ( bindptr . lpfuncdesc - > elemdescFunc . tdesc . vt = = VT_VOID , " got %d \n " , bindptr . lpfuncdesc - > elemdescFunc . tdesc . vt ) ;
ok ( bindptr . lpfuncdesc - > wFuncFlags = = FUNCFLAG_FRESTRICTED , " got 0x%x \n " , bindptr . lpfuncdesc - > wFuncFlags ) ;
ITypeInfo_ReleaseFuncDesc ( interface1 , bindptr . lpfuncdesc ) ;
ITypeInfo_Release ( interface1 ) ;
ITypeComp_Release ( tcomp ) ;
2013-08-13 00:56:33 +02:00
hres = ITypeInfo_GetRefTypeOfImplType ( ti , - 1 , & hreftype ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( hreftype = = - 2 , " got wrong hreftype: %x \n " , hreftype ) ;
hres = ITypeInfo_GetRefTypeInfo ( ti , hreftype , & interface1 ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( interface1 , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = sizeof ( void * ) , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_INTERFACE , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 1 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 1 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
# ifdef _WIN64
2013-08-13 00:56:36 +02:00
if ( sys = = SYS_WIN32 )
todo_wine ok ( typeattr - > cbSizeVft = = 8 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
else
2013-08-13 00:56:33 +02:00
# endif
2013-08-13 00:56:36 +02:00
ok ( typeattr - > cbSizeVft = = 8 * sizeof ( void * ) , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
2013-08-13 00:56:33 +02:00
ok ( typeattr - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL ) , " wTypeFlags = 0x%x \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ITypeInfo_ReleaseTypeAttr ( interface1 , typeattr ) ;
ITypeInfo_Release ( interface1 ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
2013-08-26 19:40:08 +02:00
hres = ITypeLib_GetTypeInfo ( tl , 5 , & ti ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
hres = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hres = = S_OK , " got %08x \n " , hres ) ;
ok ( typeattr - > cbSizeInstance = = 8 , " cbSizeInstance = %d \n " , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > typekind = = TKIND_ALIAS , " typekind = %d \n " , typeattr - > typekind ) ;
ok ( typeattr - > cFuncs = = 0 , " cFuncs = %d \n " , typeattr - > cFuncs ) ;
ok ( typeattr - > cVars = = 0 , " cVars = %d \n " , typeattr - > cVars ) ;
ok ( typeattr - > cImplTypes = = 0 , " cImplTypes = %d \n " , typeattr - > cImplTypes ) ;
ok ( typeattr - > cbSizeVft = = 0 , " cbSizeVft = %d \n " , typeattr - > cbSizeVft ) ;
ok ( typeattr - > cbAlignment = = alignment , " cbAlignment = %d \n " , typeattr - > cbAlignment ) ;
ok ( typeattr - > wTypeFlags = = 0 , " wTypeFlags = 0x%x \n " , typeattr - > wTypeFlags ) ;
ok ( typeattr - > wMajorVerNum = = 0 , " wMajorVerNum = %d \n " , typeattr - > wMajorVerNum ) ;
ok ( typeattr - > wMinorVerNum = = 0 , " wMinorVerNum = %d \n " , typeattr - > wMinorVerNum ) ;
ok ( typeattr - > tdescAlias . vt = = VT_R8 , " Got wrong tdescAlias.vt: %u \n " , typeattr - > tdescAlias . vt ) ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
ok ( ITypeInfo_Release ( ti ) = = 0 , " Object should be freed \n " ) ;
2010-03-15 23:39:15 +01:00
ok ( ITypeLib_Release ( tl ) = = 0 , " Object should be freed \n " ) ;
2010-02-17 13:01:33 +01:00
DeleteFileA ( filename ) ;
}
2007-10-06 00:55:56 +02:00
#if 0 /* use this to generate more tests */
# define OLE_CHECK(x) { HRESULT hr = x; if (FAILED(hr)) { printf(#x "failed - %x\n", hr); return; } }
static char * dump_string ( LPWSTR wstr )
{
int size = lstrlenW ( wstr ) + 3 ;
char * out = CoTaskMemAlloc ( size ) ;
WideCharToMultiByte ( 20127 , 0 , wstr , - 1 , out + 1 , size , NULL , NULL ) ;
out [ 0 ] = ' \" ' ;
strcat ( out , " \" " ) ;
return out ;
}
struct map_entry
{
DWORD value ;
const char * name ;
} ;
# define MAP_ENTRY(x) { x, #x }
static const struct map_entry tkind_map [ ] = {
MAP_ENTRY ( TKIND_ENUM ) ,
MAP_ENTRY ( TKIND_RECORD ) ,
MAP_ENTRY ( TKIND_MODULE ) ,
MAP_ENTRY ( TKIND_INTERFACE ) ,
MAP_ENTRY ( TKIND_DISPATCH ) ,
MAP_ENTRY ( TKIND_COCLASS ) ,
MAP_ENTRY ( TKIND_ALIAS ) ,
MAP_ENTRY ( TKIND_UNION ) ,
MAP_ENTRY ( TKIND_MAX ) ,
{ 0 , NULL }
} ;
static const struct map_entry funckind_map [ ] = {
MAP_ENTRY ( FUNC_VIRTUAL ) ,
MAP_ENTRY ( FUNC_PUREVIRTUAL ) ,
MAP_ENTRY ( FUNC_NONVIRTUAL ) ,
MAP_ENTRY ( FUNC_STATIC ) ,
MAP_ENTRY ( FUNC_DISPATCH ) ,
{ 0 , NULL }
} ;
static const struct map_entry invkind_map [ ] = {
MAP_ENTRY ( INVOKE_FUNC ) ,
MAP_ENTRY ( INVOKE_PROPERTYGET ) ,
MAP_ENTRY ( INVOKE_PROPERTYPUT ) ,
MAP_ENTRY ( INVOKE_PROPERTYPUTREF ) ,
{ 0 , NULL }
} ;
# undef MAP_ENTRY
static const char * map_value ( DWORD val , const struct map_entry * map )
{
static int map_id ;
static char bufs [ 16 ] [ 256 ] ;
char * buf ;
while ( map - > name )
{
if ( map - > value = = val )
return map - > name ;
map + + ;
}
buf = bufs [ ( map_id + + ) % 16 ] ;
sprintf ( buf , " 0x%x " , val ) ;
return buf ;
}
static void test_dump_typelib ( const char * name )
{
WCHAR wszString [ 260 ] ;
ITypeInfo * info ;
ITypeLib * lib ;
int count ;
int i ;
MultiByteToWideChar ( CP_ACP , 0 , name , - 1 , wszString , 260 ) ;
OLE_CHECK ( LoadTypeLib ( wszString , & lib ) ) ;
count = ITypeLib_GetTypeInfoCount ( lib ) ;
printf ( " /* interfaces count: %d */ \n " , count ) ;
for ( i = 0 ; i < count ; i + + )
{
TYPEATTR * attr ;
BSTR name ;
int f = 0 ;
OLE_CHECK ( ITypeLib_GetDocumentation ( lib , i , & name , NULL , NULL , NULL ) ) ;
printf ( " { \n "
" %s, \n " , dump_string ( name ) ) ;
SysFreeString ( name ) ;
OLE_CHECK ( ITypeLib_GetTypeInfo ( lib , i , & info ) ) ;
ITypeInfo_GetTypeAttr ( info , & attr ) ;
printf ( " /*kind*/ %s, /*flags*/ 0x%x, /*align*/ %d, /*size*/ %d, \n "
" /*#vtbl*/ %d, /*#func*/ %d, \n "
" { \n " ,
map_value ( attr - > typekind , tkind_map ) , attr - > wTypeFlags , attr - > cbAlignment , attr - > cbSizeInstance , attr - > cbSizeVft ,
attr - > cFuncs ) ;
ITypeInfo_ReleaseTypeAttr ( info , attr ) ;
while ( 1 )
{
FUNCDESC * desc ;
BSTR tab [ 256 ] ;
UINT cNames ;
int p ;
if ( FAILED ( ITypeInfo_GetFuncDesc ( info , f , & desc ) ) )
break ;
printf ( " { \n "
" 0x%x, /*func*/ %s, /*inv*/ %s, /*call*/ 0x%x, \n " ,
desc - > memid , map_value ( desc - > funckind , funckind_map ) , map_value ( desc - > invkind , invkind_map ) ,
desc - > callconv ) ;
printf ( " /*#param*/ %d, /*#opt*/ %d, /*vtbl*/ %d, /*#scodes*/ %d, /*flags*/ 0x%x, \n " ,
desc - > cParams , desc - > cParamsOpt , desc - > oVft , desc - > cScodes , desc - > wFuncFlags ) ;
printf ( " {%d, %x}, /* ret */ \n " , desc - > elemdescFunc . tdesc . vt , desc - > elemdescFunc . paramdesc . wParamFlags ) ;
printf ( " { /* params */ \n " ) ;
for ( p = 0 ; p < desc - > cParams ; p + + )
{
ELEMDESC e = desc - > lprgelemdescParam [ p ] ;
printf ( " {%d, %x}, \n " , e . tdesc . vt , e . paramdesc . wParamFlags ) ;
}
printf ( " {-1, -1} \n " ) ;
printf ( " }, \n " ) ;
printf ( " { /* names */ \n " ) ;
OLE_CHECK ( ITypeInfo_GetNames ( info , desc - > memid , tab , 256 , & cNames ) ) ;
for ( p = 0 ; p < cNames ; p + + )
{
printf ( " %s, \n " , dump_string ( tab [ p ] ) ) ;
SysFreeString ( tab [ p ] ) ;
}
printf ( " NULL, \n " ) ;
printf ( " }, \n " ) ;
printf ( " }, \n " ) ;
ITypeInfo_ReleaseFuncDesc ( info , desc ) ;
f + + ;
}
printf ( " } \n " ) ;
printf ( " }, \n " ) ;
ITypeInfo_Release ( info ) ;
}
ITypeLib_Release ( lib ) ;
}
# else
typedef struct _element_info
{
VARTYPE vt ;
USHORT wParamFlags ;
} element_info ;
typedef struct _function_info
{
MEMBERID memid ;
FUNCKIND funckind ;
INVOKEKIND invkind ;
CALLCONV callconv ;
short cParams ;
short cParamsOpt ;
2009-05-20 20:19:59 +02:00
short vtbl_index ;
2007-10-06 00:55:56 +02:00
short cScodes ;
WORD wFuncFlags ;
element_info ret_type ;
element_info params [ 15 ] ;
LPCSTR names [ 15 ] ;
} function_info ;
typedef struct _interface_info
{
LPCSTR name ;
TYPEKIND type ;
WORD wTypeFlags ;
USHORT cbAlignment ;
USHORT cbSizeInstance ;
USHORT cbSizeVft ;
USHORT cFuncs ;
function_info funcs [ 20 ] ;
} interface_info ;
static const interface_info info [ ] = {
/* interfaces count: 2 */
{
" IDualIface " ,
/*kind*/ TKIND_DISPATCH , /*flags*/ 0x1040 , /*align*/ 4 , /*size*/ 4 ,
2009-05-20 20:19:59 +02:00
/*#vtbl*/ 7 , /*#func*/ 8 ,
2007-10-06 00:55:56 +02:00
{
{
0x60000000 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
/*#param*/ 2 , /*#opt*/ 0 , /*vtbl*/ 0 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
{ 24 , 0 } , /* ret */
{ /* params */
{ 26 , 1 } ,
{ 26 , 2 } ,
{ - 1 , - 1 }
} ,
{ /* names */
" QueryInterface " ,
" riid " ,
" ppvObj " ,
NULL ,
} ,
} ,
{
0x60000001 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 0 , /*#opt*/ 0 , /*vtbl*/ 1 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 19 , 0 } , /* ret */
{ /* params */
{ - 1 , - 1 }
} ,
{ /* names */
" AddRef " ,
NULL ,
} ,
} ,
{
0x60000002 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 0 , /*#opt*/ 0 , /*vtbl*/ 2 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 19 , 0 } , /* ret */
{ /* params */
{ - 1 , - 1 }
} ,
{ /* names */
" Release " ,
NULL ,
} ,
} ,
{
0x60010000 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 1 , /*#opt*/ 0 , /*vtbl*/ 3 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 24 , 0 } , /* ret */
{ /* params */
{ 26 , 2 } ,
{ - 1 , - 1 }
} ,
{ /* names */
" GetTypeInfoCount " ,
" pctinfo " ,
NULL ,
} ,
} ,
{
0x60010001 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 3 , /*#opt*/ 0 , /*vtbl*/ 4 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 24 , 0 } , /* ret */
{ /* params */
{ 23 , 1 } ,
{ 19 , 1 } ,
{ 26 , 2 } ,
{ - 1 , - 1 }
} ,
{ /* names */
" GetTypeInfo " ,
" itinfo " ,
" lcid " ,
" pptinfo " ,
NULL ,
} ,
} ,
{
0x60010002 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 5 , /*#opt*/ 0 , /*vtbl*/ 5 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 24 , 0 } , /* ret */
{ /* params */
{ 26 , 1 } ,
{ 26 , 1 } ,
{ 23 , 1 } ,
{ 19 , 1 } ,
{ 26 , 2 } ,
{ - 1 , - 1 }
} ,
{ /* names */
" GetIDsOfNames " ,
" riid " ,
" rgszNames " ,
" cNames " ,
" lcid " ,
" rgdispid " ,
NULL ,
} ,
} ,
{
0x60010003 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 8 , /*#opt*/ 0 , /*vtbl*/ 6 , /*#scodes*/ 0 , /*flags*/ 0x1 ,
2007-10-06 00:55:56 +02:00
{ 24 , 0 } , /* ret */
{ /* params */
{ 3 , 1 } ,
{ 26 , 1 } ,
{ 19 , 1 } ,
{ 18 , 1 } ,
{ 26 , 1 } ,
{ 26 , 2 } ,
{ 26 , 2 } ,
{ 26 , 2 } ,
{ - 1 , - 1 }
} ,
{ /* names */
" Invoke " ,
" dispidMember " ,
" riid " ,
" lcid " ,
" wFlags " ,
" pdispparams " ,
" pvarResult " ,
" pexcepinfo " ,
" puArgErr " ,
NULL ,
} ,
} ,
{
0x60020000 , /*func*/ FUNC_DISPATCH , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 0 , /*#opt*/ 0 , /*vtbl*/ 7 , /*#scodes*/ 0 , /*flags*/ 0x0 ,
2007-10-06 00:55:56 +02:00
{ 24 , 0 } , /* ret */
{ /* params */
{ - 1 , - 1 }
} ,
{ /* names */
" Test " ,
NULL ,
} ,
} ,
}
} ,
{
" ISimpleIface " ,
/*kind*/ TKIND_INTERFACE , /*flags*/ 0x1000 , /*align*/ 4 , /*size*/ 4 ,
2009-05-20 20:19:59 +02:00
/*#vtbl*/ 8 , /*#func*/ 1 ,
2007-10-06 00:55:56 +02:00
{
{
0x60020000 , /*func*/ FUNC_PUREVIRTUAL , /*inv*/ INVOKE_FUNC , /*call*/ 0x4 ,
2009-05-20 20:19:59 +02:00
/*#param*/ 0 , /*#opt*/ 0 , /*vtbl*/ 7 , /*#scodes*/ 0 , /*flags*/ 0x0 ,
2007-10-06 00:55:56 +02:00
{ 25 , 0 } , /* ret */
{ /* params */
{ - 1 , - 1 }
} ,
{ /* names */
" Test " ,
NULL ,
} ,
} ,
}
} ,
} ;
# define check_type(elem, info) { \
2007-10-14 14:34:58 +02:00
expect_int ( ( elem ) - > tdesc . vt , ( info ) - > vt ) ; \
expect_hex ( U ( * ( elem ) ) . paramdesc . wParamFlags , ( info ) - > wParamFlags ) ; \
2007-10-06 00:55:56 +02:00
}
static void test_dump_typelib ( const char * name )
{
WCHAR wszName [ MAX_PATH ] ;
ITypeLib * typelib ;
int ifcount = sizeof ( info ) / sizeof ( info [ 0 ] ) ;
int iface , func ;
2008-09-13 15:13:56 +02:00
MultiByteToWideChar ( CP_ACP , 0 , name , - 1 , wszName , MAX_PATH ) ;
2007-10-06 00:55:56 +02:00
ole_check ( LoadTypeLibEx ( wszName , REGKIND_NONE , & typelib ) ) ;
expect_eq ( ITypeLib_GetTypeInfoCount ( typelib ) , ifcount , UINT , " %d " ) ;
for ( iface = 0 ; iface < ifcount ; iface + + )
{
const interface_info * if_info = & info [ iface ] ;
ITypeInfo * typeinfo ;
TYPEATTR * typeattr ;
BSTR bstrIfName ;
trace ( " Interface %s \n " , if_info - > name ) ;
ole_check ( ITypeLib_GetTypeInfo ( typelib , iface , & typeinfo ) ) ;
ole_check ( ITypeLib_GetDocumentation ( typelib , iface , & bstrIfName , NULL , NULL , NULL ) ) ;
2008-09-13 15:13:56 +02:00
expect_wstr_acpval ( bstrIfName , if_info - > name ) ;
2007-10-06 00:55:56 +02:00
SysFreeString ( bstrIfName ) ;
ole_check ( ITypeInfo_GetTypeAttr ( typeinfo , & typeattr ) ) ;
expect_int ( typeattr - > typekind , if_info - > type ) ;
expect_hex ( typeattr - > wTypeFlags , if_info - > wTypeFlags ) ;
expect_int ( typeattr - > cbAlignment , if_info - > cbAlignment ) ;
expect_int ( typeattr - > cbSizeInstance , if_info - > cbSizeInstance ) ;
2009-05-20 20:19:59 +02:00
expect_int ( typeattr - > cbSizeVft , if_info - > cbSizeVft * sizeof ( void * ) ) ;
2007-10-06 00:55:56 +02:00
expect_int ( typeattr - > cFuncs , if_info - > cFuncs ) ;
for ( func = 0 ; func < typeattr - > cFuncs ; func + + )
{
function_info * fn_info = ( function_info * ) & if_info - > funcs [ func ] ;
FUNCDESC * desc ;
BSTR namesTab [ 256 ] ;
UINT cNames ;
int i ;
trace ( " Function %s \n " , fn_info - > names [ 0 ] ) ;
ole_check ( ITypeInfo_GetFuncDesc ( typeinfo , func , & desc ) ) ;
expect_int ( desc - > memid , fn_info - > memid ) ;
expect_int ( desc - > funckind , fn_info - > funckind ) ;
expect_int ( desc - > invkind , fn_info - > invkind ) ;
expect_int ( desc - > callconv , fn_info - > callconv ) ;
expect_int ( desc - > cParams , fn_info - > cParams ) ;
expect_int ( desc - > cParamsOpt , fn_info - > cParamsOpt ) ;
2009-05-25 11:49:08 +02:00
ok ( desc - > oVft = = fn_info - > vtbl_index * sizeof ( void * ) | |
broken ( desc - > oVft = = fn_info - > vtbl_index * 4 ) , /* xp64 */
" desc->oVft got %u \n " , desc - > oVft ) ;
2007-10-06 00:55:56 +02:00
expect_int ( desc - > cScodes , fn_info - > cScodes ) ;
expect_int ( desc - > wFuncFlags , fn_info - > wFuncFlags ) ;
ole_check ( ITypeInfo_GetNames ( typeinfo , desc - > memid , namesTab , 256 , & cNames ) ) ;
for ( i = 0 ; i < cNames ; i + + )
{
2008-09-13 15:13:56 +02:00
expect_wstr_acpval ( namesTab [ i ] , fn_info - > names [ i ] ) ;
2007-10-06 00:55:56 +02:00
SysFreeString ( namesTab [ i ] ) ;
}
expect_null ( fn_info - > names [ cNames ] ) ;
check_type ( & desc - > elemdescFunc , & fn_info - > ret_type ) ;
for ( i = 0 ; i < desc - > cParams ; i + + )
{
check_type ( & desc - > lprgelemdescParam [ i ] , & fn_info - > params [ i ] ) ;
}
expect_int ( fn_info - > params [ desc - > cParams ] . vt , ( VARTYPE ) - 1 ) ;
ITypeInfo_ReleaseFuncDesc ( typeinfo , desc ) ;
}
ITypeInfo_ReleaseTypeAttr ( typeinfo , typeattr ) ;
ITypeInfo_Release ( typeinfo ) ;
}
ITypeLib_Release ( typelib ) ;
}
# endif
2009-06-10 17:45:29 +02:00
static void test_create_typelib_lcid ( LCID lcid )
{
char filename [ MAX_PATH ] ;
WCHAR name [ MAX_PATH ] ;
HRESULT hr ;
ICreateTypeLib2 * tl ;
HANDLE file ;
2013-08-16 21:40:14 +02:00
DWORD msft_header [ 7 ] ;
2009-06-10 17:45:29 +02:00
DWORD read ;
GetTempFileNameA ( " . " , " tlb " , 0 , filename ) ;
MultiByteToWideChar ( CP_ACP , 0 , filename , - 1 , name , MAX_PATH ) ;
hr = CreateTypeLib2 ( SYS_WIN32 , name , & tl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_SetLcid ( tl , lcid ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2013-08-16 21:40:14 +02:00
hr = ICreateTypeLib2_SetVersion ( tl , 3 , 4 ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2009-06-10 17:45:29 +02:00
hr = ICreateTypeLib2_SaveAllChanges ( tl ) ;
2011-02-11 01:44:41 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2009-06-10 17:45:29 +02:00
ICreateTypeLib2_Release ( tl ) ;
file = CreateFileA ( filename , GENERIC_READ , 0 , NULL , OPEN_EXISTING , 0 , 0 ) ;
ok ( file ! = INVALID_HANDLE_VALUE , " file creation failed \n " ) ;
ReadFile ( file , msft_header , sizeof ( msft_header ) , & read , NULL ) ;
ok ( read = = sizeof ( msft_header ) , " read %d \n " , read ) ;
CloseHandle ( file ) ;
ok ( msft_header [ 0 ] = = 0x5446534d , " got %08x \n " , msft_header [ 0 ] ) ;
ok ( msft_header [ 1 ] = = 0x00010002 , " got %08x \n " , msft_header [ 1 ] ) ;
ok ( msft_header [ 2 ] = = 0xffffffff , " got %08x \n " , msft_header [ 2 ] ) ;
ok ( msft_header [ 3 ] = = ( lcid ? lcid : 0x409 ) , " got %08x (lcid %08x) \n " , msft_header [ 3 ] , lcid ) ;
ok ( msft_header [ 4 ] = = lcid , " got %08x (lcid %08x) \n " , msft_header [ 4 ] , lcid ) ;
2013-08-16 21:40:14 +02:00
ok ( msft_header [ 6 ] = = 0x00040003 , " got %08x \n " , msft_header [ 6 ] ) ;
2009-06-10 17:45:29 +02:00
DeleteFileA ( filename ) ;
}
static void test_create_typelibs ( void )
{
test_create_typelib_lcid ( LOCALE_SYSTEM_DEFAULT ) ;
test_create_typelib_lcid ( LOCALE_USER_DEFAULT ) ;
test_create_typelib_lcid ( LOCALE_NEUTRAL ) ;
test_create_typelib_lcid ( 0x009 ) ;
test_create_typelib_lcid ( 0x409 ) ;
test_create_typelib_lcid ( 0x809 ) ;
test_create_typelib_lcid ( 0x007 ) ;
test_create_typelib_lcid ( 0x407 ) ;
}
2010-04-01 14:02:17 +02:00
2010-07-30 14:44:19 +02:00
static void test_register_typelib ( BOOL system_registration )
2010-04-01 14:02:17 +02:00
{
HRESULT hr ;
WCHAR filename [ MAX_PATH ] ;
const char * filenameA ;
ITypeLib * typelib ;
2010-04-09 20:34:04 +02:00
WCHAR uuidW [ 40 ] ;
char key_name [ MAX_PATH ] , uuid [ 40 ] ;
2010-04-01 14:02:17 +02:00
LONG ret , expect_ret ;
UINT count , i ;
HKEY hkey ;
struct
{
TYPEKIND kind ;
WORD flags ;
2012-12-14 21:07:50 +01:00
} attrs [ 12 ] =
2010-04-01 14:02:17 +02:00
{
{ TKIND_INTERFACE , 0 } ,
{ TKIND_INTERFACE , TYPEFLAG_FDISPATCHABLE } ,
{ TKIND_INTERFACE , TYPEFLAG_FOLEAUTOMATION } ,
{ TKIND_INTERFACE , TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FOLEAUTOMATION } ,
{ TKIND_DISPATCH , 0 /* TYPEFLAG_FDUAL - widl clears this flag for non-IDispatch derived interfaces */ } ,
{ TKIND_DISPATCH , 0 /* TYPEFLAG_FDUAL - widl clears this flag for non-IDispatch derived interfaces */ } ,
{ TKIND_DISPATCH , TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL } ,
{ TKIND_DISPATCH , TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL } ,
{ TKIND_DISPATCH , TYPEFLAG_FDISPATCHABLE } ,
{ TKIND_DISPATCH , TYPEFLAG_FDISPATCHABLE } ,
2012-12-14 21:07:50 +01:00
{ TKIND_DISPATCH , TYPEFLAG_FDISPATCHABLE } ,
{ TKIND_INTERFACE , TYPEFLAG_FDISPATCHABLE }
2010-04-01 14:02:17 +02:00
} ;
2010-07-30 14:44:19 +02:00
trace ( " Starting %s typelib registration tests \n " ,
system_registration ? " system " : " user " ) ;
if ( ! system_registration & & ( ! pRegisterTypeLibForUser | | ! pUnRegisterTypeLibForUser ) )
{
win_skip ( " User typelib registration functions are not available \n " ) ;
return ;
}
2010-04-01 14:02:17 +02:00
filenameA = create_test_typelib ( 3 ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filename , MAX_PATH ) ;
hr = LoadTypeLibEx ( filename , REGKIND_NONE , & typelib ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
2010-07-30 14:44:19 +02:00
if ( system_registration )
hr = RegisterTypeLib ( typelib , filename , NULL ) ;
else
hr = pRegisterTypeLibForUser ( typelib , filename , NULL ) ;
if ( hr = = TYPE_E_REGISTRYACCESS )
{
win_skip ( " Insufficient privileges to register typelib in the registry \n " ) ;
ITypeLib_Release ( typelib ) ;
DeleteFileA ( filenameA ) ;
return ;
}
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
count = ITypeLib_GetTypeInfoCount ( typelib ) ;
2012-12-14 21:07:50 +01:00
ok ( count = = 12 , " got %d \n " , count ) ;
2010-04-01 14:02:17 +02:00
for ( i = 0 ; i < count ; i + + )
{
ITypeInfo * typeinfo ;
TYPEATTR * attr ;
hr = ITypeLib_GetTypeInfo ( typelib , i , & typeinfo ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
hr = ITypeInfo_GetTypeAttr ( typeinfo , & attr ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
ok ( attr - > typekind = = attrs [ i ] . kind , " %d: got kind %d \n " , i , attr - > typekind ) ;
ok ( attr - > wTypeFlags = = attrs [ i ] . flags , " %d: got flags %04x \n " , i , attr - > wTypeFlags ) ;
if ( attr - > typekind = = TKIND_DISPATCH & & ( attr - > wTypeFlags & TYPEFLAG_FDUAL ) )
{
HREFTYPE reftype ;
ITypeInfo * dual_info ;
TYPEATTR * dual_attr ;
hr = ITypeInfo_GetRefTypeOfImplType ( typeinfo , - 1 , & reftype ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
hr = ITypeInfo_GetRefTypeInfo ( typeinfo , reftype , & dual_info ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
hr = ITypeInfo_GetTypeAttr ( dual_info , & dual_attr ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
ok ( dual_attr - > typekind = = TKIND_INTERFACE , " %d: got kind %d \n " , i , dual_attr - > typekind ) ;
ok ( dual_attr - > wTypeFlags = = ( TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FDUAL ) , " %d: got flags %04x \n " , i , dual_attr - > wTypeFlags ) ;
ITypeInfo_ReleaseTypeAttr ( dual_info , dual_attr ) ;
ITypeInfo_Release ( dual_info ) ;
}
2010-04-09 20:34:04 +02:00
StringFromGUID2 ( & attr - > guid , uuidW , sizeof ( uuidW ) / sizeof ( uuidW [ 0 ] ) ) ;
WideCharToMultiByte ( CP_ACP , 0 , uuidW , - 1 , uuid , sizeof ( uuid ) , NULL , NULL ) ;
sprintf ( key_name , " Interface \\ %s " , uuid ) ;
2010-04-01 14:02:17 +02:00
/* All dispinterfaces will be registered (this includes dual interfaces) as well
as oleautomation interfaces */
if ( ( attr - > typekind = = TKIND_INTERFACE & & ( attr - > wTypeFlags & TYPEFLAG_FOLEAUTOMATION ) ) | |
attr - > typekind = = TKIND_DISPATCH )
expect_ret = ERROR_SUCCESS ;
else
expect_ret = ERROR_FILE_NOT_FOUND ;
2010-04-09 20:34:04 +02:00
ret = RegOpenKeyExA ( HKEY_CLASSES_ROOT , key_name , 0 , KEY_READ , & hkey ) ;
2010-04-01 14:02:17 +02:00
ok ( ret = = expect_ret , " %d: got %d \n " , i , ret ) ;
if ( ret = = ERROR_SUCCESS ) RegCloseKey ( hkey ) ;
ITypeInfo_ReleaseTypeAttr ( typeinfo , attr ) ;
ITypeInfo_Release ( typeinfo ) ;
}
2010-07-30 14:44:19 +02:00
if ( system_registration )
2010-08-26 12:22:20 +02:00
hr = UnRegisterTypeLib ( & LIBID_register_test , 1 , 0 , LOCALE_NEUTRAL , is_win64 ? SYS_WIN64 : SYS_WIN32 ) ;
2010-07-30 14:44:19 +02:00
else
2010-08-26 12:22:20 +02:00
hr = pUnRegisterTypeLibForUser ( & LIBID_register_test , 1 , 0 , LOCALE_NEUTRAL , is_win64 ? SYS_WIN64 : SYS_WIN32 ) ;
2010-12-22 01:32:10 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-04-01 14:02:17 +02:00
ITypeLib_Release ( typelib ) ;
DeleteFileA ( filenameA ) ;
}
2010-11-15 17:45:35 +01:00
static void test_LoadTypeLib ( void )
{
ITypeLib * tl ;
HRESULT hres ;
static const WCHAR kernel32_dllW [ ] = { ' k ' , ' e ' , ' r ' , ' n ' , ' e ' , ' l ' , ' 3 ' , ' 2 ' , ' . ' , ' d ' , ' l ' , ' l ' , 0 } ;
hres = LoadTypeLib ( kernel32_dllW , & tl ) ;
ok ( hres = = TYPE_E_CANTLOADLIBRARY , " LoadTypeLib returned: %08x, expected TYPE_E_CANTLOADLIBRARY \n " , hres ) ;
}
2010-12-24 00:04:38 +01:00
static void test_SetVarHelpContext ( void )
{
static OLECHAR nameW [ ] = { ' n ' , ' a ' , ' m ' , ' e ' , 0 } ;
CHAR filenameA [ MAX_PATH ] ;
WCHAR filenameW [ MAX_PATH ] ;
ICreateTypeLib2 * ctl ;
ICreateTypeInfo * cti ;
2013-08-13 00:56:33 +02:00
ITypeLib * tl ;
ITypeInfo * ti ;
VARDESC desc , * pdesc ;
2010-12-24 00:04:38 +01:00
HRESULT hr ;
2013-08-13 00:56:33 +02:00
DWORD ctx ;
2010-12-24 00:04:38 +01:00
VARIANT v ;
GetTempFileNameA ( " . " , " tlb " , 0 , filenameA ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filenameW , MAX_PATH ) ;
hr = CreateTypeLib2 ( SYS_WIN32 , filenameW , & ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , nameW , TKIND_ENUM , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarHelpContext ( cti , 0 , 0 ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
memset ( & desc , 0 , sizeof ( desc ) ) ;
2013-08-16 21:40:22 +02:00
desc . memid = MEMBERID_NIL ;
2010-12-24 00:04:38 +01:00
desc . elemdescVar . tdesc . vt = VT_INT ;
desc . varkind = VAR_CONST ;
V_VT ( & v ) = VT_INT ;
V_INT ( & v ) = 1 ;
U ( desc ) . lpvarValue = & v ;
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_AddVarDesc ( cti , 0 , & desc ) ;
2010-12-24 00:04:38 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_SetVarHelpContext ( cti , 0 , 0 ) ;
2010-12-24 00:04:38 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
/* another time */
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_SetVarHelpContext ( cti , 0 , 1 ) ;
2010-12-24 00:04:38 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
/* wrong index now */
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_SetVarHelpContext ( cti , 1 , 0 ) ;
2010-12-24 00:04:38 +01:00
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
ICreateTypeInfo_Release ( cti ) ;
2013-08-13 00:56:33 +02:00
hr = ICreateTypeLib2_SaveAllChanges ( ctl ) ;
ok ( hr = = S_OK , " got: %08x \n " , hr ) ;
2010-12-24 00:04:38 +01:00
ICreateTypeLib2_Release ( ctl ) ;
2013-08-13 00:56:33 +02:00
hr = LoadTypeLib ( filenameW , & tl ) ;
ok ( hr = = S_OK , " got: %08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfo ( tl , 0 , & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeInfo_GetVarDesc ( ti , 0 , & pdesc ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2013-08-16 21:40:22 +02:00
ok ( pdesc - > memid = = 0x40000000 , " got wrong memid: %x \n " , pdesc - > memid ) ;
2013-08-13 00:56:33 +02:00
ok ( pdesc - > elemdescVar . tdesc . vt = = VT_INT , " got wrong vardesc type: %u \n " , pdesc - > elemdescVar . tdesc . vt ) ;
ok ( pdesc - > varkind = = VAR_CONST , " got wrong varkind: %u \n " , pdesc - > varkind ) ;
2013-09-12 23:55:23 +02:00
ok ( V_VT ( U ( * pdesc ) . lpvarValue ) = = VT_INT , " got wrong value type: %u \n " , V_VT ( U ( * pdesc ) . lpvarValue ) ) ;
ok ( V_INT ( U ( * pdesc ) . lpvarValue ) = = 1 , " got wrong value: 0x%x \n " , V_INT ( U ( * pdesc ) . lpvarValue ) ) ;
2013-08-13 00:56:33 +02:00
hr = ITypeInfo_GetDocumentation ( ti , pdesc - > memid , NULL , NULL , & ctx , NULL ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ok ( ctx = = 1 , " got wrong help context: 0x%x \n " , ctx ) ;
ITypeInfo_ReleaseVarDesc ( ti , pdesc ) ;
ITypeInfo_Release ( ti ) ;
ITypeLib_Release ( tl ) ;
2010-12-24 00:04:38 +01:00
DeleteFileA ( filenameA ) ;
}
2010-12-25 15:56:11 +01:00
static void test_SetFuncAndParamNames ( void )
{
static OLECHAR nameW [ ] = { ' n ' , ' a ' , ' m ' , ' e ' , 0 } ;
static OLECHAR prop [ ] = { ' p ' , ' r ' , ' o ' , ' p ' , 0 } ;
static OLECHAR * propW [ ] = { prop } ;
2013-09-10 15:45:41 +02:00
static OLECHAR func [ ] = { ' f ' , ' u ' , ' n ' , ' c ' , 0 } ;
static OLECHAR * funcW [ ] = { func , NULL } ;
2010-12-25 15:56:11 +01:00
CHAR filenameA [ MAX_PATH ] ;
WCHAR filenameW [ MAX_PATH ] ;
ICreateTypeLib2 * ctl ;
ICreateTypeInfo * cti ;
FUNCDESC funcdesc ;
ELEMDESC edesc ;
HRESULT hr ;
GetTempFileNameA ( " . " , " tlb " , 0 , filenameA ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filenameW , MAX_PATH ) ;
hr = CreateTypeLib2 ( SYS_WIN32 , filenameW , & ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , nameW , TKIND_DISPATCH , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
/* get method */
memset ( & funcdesc , 0 , sizeof ( FUNCDESC ) ) ;
funcdesc . funckind = FUNC_DISPATCH ;
funcdesc . callconv = CC_STDCALL ;
funcdesc . elemdescFunc . tdesc . vt = VT_VOID ;
funcdesc . wFuncFlags = FUNCFLAG_FBINDABLE ;
/* put method */
memset ( & edesc , 0 , sizeof ( edesc ) ) ;
edesc . tdesc . vt = VT_BSTR ;
U ( edesc ) . idldesc . dwReserved = 0 ;
U ( edesc ) . idldesc . wIDLFlags = IDLFLAG_FIN ;
funcdesc . lprgelemdescParam = & edesc ;
funcdesc . invkind = INVOKE_PROPERTYPUT ;
funcdesc . cParams = 1 ;
hr = ICreateTypeInfo_AddFuncDesc ( cti , 0 , & funcdesc ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
/* setter name */
hr = ICreateTypeInfo_SetFuncAndParamNames ( cti , 0 , propW , 1 ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
/* putref method */
funcdesc . invkind = INVOKE_PROPERTYPUTREF ;
hr = ICreateTypeInfo_AddFuncDesc ( cti , 1 , & funcdesc ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
/* putref name */
hr = ICreateTypeInfo_SetFuncAndParamNames ( cti , 1 , propW , 1 ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
funcdesc . invkind = INVOKE_PROPERTYGET ;
funcdesc . cParams = 0 ;
hr = ICreateTypeInfo_AddFuncDesc ( cti , 2 , & funcdesc ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
/* getter name */
hr = ICreateTypeInfo_SetFuncAndParamNames ( cti , 2 , propW , 1 ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
2013-05-29 21:59:09 +02:00
hr = ICreateTypeInfo_AddFuncDesc ( cti , 3 , & funcdesc ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
/* getter name again */
hr = ICreateTypeInfo_SetFuncAndParamNames ( cti , 3 , propW , 1 ) ;
ok ( hr = = TYPE_E_AMBIGUOUSNAME , " got 0x%08x \n " , hr ) ;
2013-09-10 15:45:41 +02:00
/* regular function */
funcdesc . invkind = INVOKE_FUNC ;
funcdesc . cParams = 1 ;
hr = ICreateTypeInfo_AddFuncDesc ( cti , 4 , & funcdesc ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
hr = ICreateTypeInfo_SetFuncAndParamNames ( cti , 4 , funcW , 2 ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
2010-12-25 15:56:11 +01:00
ICreateTypeInfo_Release ( cti ) ;
ICreateTypeLib2_Release ( ctl ) ;
DeleteFileA ( filenameA ) ;
}
2013-09-19 18:10:05 +02:00
static void test_SetDocString ( void )
2010-12-31 00:26:30 +01:00
{
static OLECHAR nameW [ ] = { ' n ' , ' a ' , ' m ' , ' e ' , 0 } ;
2013-09-19 18:10:05 +02:00
static OLECHAR name2W [ ] = { ' n ' , ' a ' , ' m ' , ' e ' , ' 2 ' , 0 } ;
2010-12-31 00:26:30 +01:00
static OLECHAR doc1W [ ] = { ' d ' , ' o ' , ' c ' , ' 1 ' , 0 } ;
static OLECHAR doc2W [ ] = { ' d ' , ' o ' , ' c ' , ' 2 ' , 0 } ;
2013-09-04 22:28:50 +02:00
static OLECHAR var_nameW [ ] = { ' v ' , ' a ' , ' r ' , ' n ' , ' a ' , ' m ' , ' e ' , 0 } ;
2010-12-31 00:26:30 +01:00
CHAR filenameA [ MAX_PATH ] ;
WCHAR filenameW [ MAX_PATH ] ;
ICreateTypeLib2 * ctl ;
ICreateTypeInfo * cti ;
2013-08-13 00:56:33 +02:00
ITypeLib * tl ;
ITypeInfo * ti ;
2013-09-04 22:28:50 +02:00
BSTR namestr , docstr ;
2013-08-13 00:56:33 +02:00
VARDESC desc , * pdesc ;
2013-09-19 18:10:05 +02:00
FUNCDESC funcdesc , * pfuncdesc ;
2010-12-31 00:26:30 +01:00
HRESULT hr ;
VARIANT v ;
GetTempFileNameA ( " . " , " tlb " , 0 , filenameA ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filenameW , MAX_PATH ) ;
hr = CreateTypeLib2 ( SYS_WIN32 , filenameW , & ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , nameW , TKIND_ENUM , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarDocString ( cti , 0 , doc1W ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarDocString ( cti , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got %08x \n " , hr ) ;
memset ( & desc , 0 , sizeof ( desc ) ) ;
2013-08-16 21:40:22 +02:00
desc . memid = MEMBERID_NIL ;
2010-12-31 00:26:30 +01:00
desc . elemdescVar . tdesc . vt = VT_INT ;
desc . varkind = VAR_CONST ;
V_VT ( & v ) = VT_INT ;
V_INT ( & v ) = 1 ;
U ( desc ) . lpvarValue = & v ;
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_AddVarDesc ( cti , 0 , & desc ) ;
2010-12-31 00:26:30 +01:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2013-09-04 22:28:50 +02:00
hr = ICreateTypeInfo_SetVarName ( cti , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarName ( cti , 1 , var_nameW ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarName ( cti , 0 , var_nameW ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2010-12-31 00:26:30 +01:00
hr = ICreateTypeInfo_SetVarDocString ( cti , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetVarDocString ( cti , 0 , doc1W ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
/* already set */
hr = ICreateTypeInfo_SetVarDocString ( cti , 0 , doc2W ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
/* wrong index now */
2012-08-13 11:12:24 +02:00
hr = ICreateTypeInfo_SetVarDocString ( cti , 1 , doc1W ) ;
2010-12-31 00:26:30 +01:00
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
ICreateTypeInfo_Release ( cti ) ;
2013-08-13 00:56:33 +02:00
2013-09-19 18:10:05 +02:00
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , name2W , TKIND_INTERFACE , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetFuncDocString ( cti , 0 , doc1W ) ;
ok ( hr = = TYPE_E_ELEMENTNOTFOUND , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetFuncDocString ( cti , 0 , NULL ) ;
ok ( hr = = E_INVALIDARG , " got %08x \n " , hr ) ;
memset ( & funcdesc , 0 , sizeof ( funcdesc ) ) ;
funcdesc . memid = MEMBERID_NIL ;
funcdesc . funckind = FUNC_PUREVIRTUAL ;
funcdesc . invkind = INVOKE_FUNC ;
funcdesc . callconv = CC_STDCALL ;
hr = ICreateTypeInfo_AddFuncDesc ( cti , 0 , & funcdesc ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_SetFuncDocString ( cti , 0 , doc1W ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ICreateTypeInfo_Release ( cti ) ;
2013-08-13 00:56:33 +02:00
hr = ICreateTypeLib2_SaveAllChanges ( ctl ) ;
ok ( hr = = S_OK , " got: %08x \n " , hr ) ;
2010-12-31 00:26:30 +01:00
ICreateTypeLib2_Release ( ctl ) ;
2013-08-13 00:56:33 +02:00
hr = LoadTypeLib ( filenameW , & tl ) ;
ok ( hr = = S_OK , " got: %08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfo ( tl , 0 , & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeInfo_GetVarDesc ( ti , 0 , & pdesc ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2013-08-16 21:40:22 +02:00
ok ( pdesc - > memid = = 0x40000000 , " got wrong memid: %x \n " , pdesc - > memid ) ;
2013-08-13 00:56:33 +02:00
ok ( pdesc - > elemdescVar . tdesc . vt = = VT_INT , " got wrong vardesc type: %u \n " , pdesc - > elemdescVar . tdesc . vt ) ;
ok ( pdesc - > varkind = = VAR_CONST , " got wrong varkind: %u \n " , pdesc - > varkind ) ;
2013-09-12 23:55:23 +02:00
ok ( V_VT ( U ( * pdesc ) . lpvarValue ) = = VT_INT , " got wrong value type: %u \n " , V_VT ( U ( * pdesc ) . lpvarValue ) ) ;
ok ( V_INT ( U ( * pdesc ) . lpvarValue ) = = 1 , " got wrong value: 0x%x \n " , V_INT ( U ( * pdesc ) . lpvarValue ) ) ;
2013-08-13 00:56:33 +02:00
2013-09-04 22:28:50 +02:00
hr = ITypeInfo_GetDocumentation ( ti , pdesc - > memid , & namestr , & docstr , NULL , NULL ) ;
2013-08-13 00:56:33 +02:00
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
2013-09-04 22:28:50 +02:00
ok ( memcmp ( namestr , var_nameW , sizeof ( var_nameW ) ) = = 0 , " got wrong name: %s \n " , wine_dbgstr_w ( namestr ) ) ;
2013-08-13 00:56:33 +02:00
ok ( memcmp ( docstr , doc2W , sizeof ( doc2W ) ) = = 0 , " got wrong docstring: %s \n " , wine_dbgstr_w ( docstr ) ) ;
2013-09-04 22:28:50 +02:00
SysFreeString ( namestr ) ;
2013-08-13 00:56:33 +02:00
SysFreeString ( docstr ) ;
ITypeInfo_ReleaseVarDesc ( ti , pdesc ) ;
ITypeInfo_Release ( ti ) ;
2013-09-19 18:10:05 +02:00
hr = ITypeLib_GetTypeInfo ( tl , 1 , & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeInfo_GetFuncDesc ( ti , 0 , & pfuncdesc ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ok ( pfuncdesc - > memid = = 0x60000000 , " got wrong memid: %x \n " , pfuncdesc - > memid ) ;
ok ( pfuncdesc - > funckind = = FUNC_PUREVIRTUAL , " got wrong funckind: %x \n " , pfuncdesc - > funckind ) ;
ok ( pfuncdesc - > invkind = = INVOKE_FUNC , " got wrong invkind: %x \n " , pfuncdesc - > invkind ) ;
ok ( pfuncdesc - > callconv = = CC_STDCALL , " got wrong callconv: %x \n " , pfuncdesc - > callconv ) ;
hr = ITypeInfo_GetDocumentation ( ti , pfuncdesc - > memid , & namestr , & docstr , NULL , NULL ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ok ( namestr = = NULL , " got wrong name: %s \n " , wine_dbgstr_w ( namestr ) ) ;
ok ( memcmp ( docstr , doc1W , sizeof ( doc1W ) ) = = 0 , " got wrong docstring: %s \n " , wine_dbgstr_w ( docstr ) ) ;
SysFreeString ( docstr ) ;
ITypeInfo_ReleaseFuncDesc ( ti , pfuncdesc ) ;
ITypeInfo_Release ( ti ) ;
2013-08-13 00:56:33 +02:00
ITypeLib_Release ( tl ) ;
2010-12-31 00:26:30 +01:00
DeleteFileA ( filenameA ) ;
}
2012-01-26 11:42:35 +01:00
static void test_FindName ( void )
{
static const WCHAR invalidW [ ] = { ' i ' , ' n ' , ' v ' , ' a ' , ' l ' , ' i ' , ' d ' , 0 } ;
WCHAR buffW [ 100 ] ;
MEMBERID memid ;
ITypeInfo * ti ;
ITypeLib * tl ;
HRESULT hr ;
UINT16 c ;
hr = LoadTypeLib ( wszStdOle2 , & tl ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
hr = ITypeLib_FindName ( tl , NULL , 0 , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
lstrcpyW ( buffW , wszGUID ) ;
hr = ITypeLib_FindName ( tl , buffW , 0 , NULL , NULL , NULL ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
c = 0 ;
ti = ( void * ) 0xdeadbeef ;
hr = ITypeLib_FindName ( tl , buffW , 0 , & ti , NULL , & c ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
ok ( c = = 0 , " got %d \n " , c ) ;
ok ( ti = = ( void * ) 0xdeadbeef , " got %p \n " , ti ) ;
c = 1 ;
ti = ( void * ) 0xdeadbeef ;
hr = ITypeLib_FindName ( tl , buffW , 0 , & ti , NULL , & c ) ;
ok ( hr = = E_INVALIDARG , " got 0x%08x \n " , hr ) ;
ok ( c = = 1 , " got %d \n " , c ) ;
ok ( ti = = ( void * ) 0xdeadbeef , " got %p \n " , ti ) ;
c = 1 ;
memid = 0 ;
ti = ( void * ) 0xdeadbeef ;
hr = ITypeLib_FindName ( tl , buffW , 0 , & ti , & memid , & c ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
todo_wine
ok ( memid = = - 1 , " got %d \n " , memid ) ;
ok ( ! lstrcmpW ( buffW , wszGUID ) , " got %s \n " , wine_dbgstr_w ( buffW ) ) ;
ok ( c = = 1 , " got %d \n " , c ) ;
ITypeInfo_Release ( ti ) ;
c = 1 ;
memid = 0 ;
lstrcpyW ( buffW , wszguid ) ;
ti = ( void * ) 0xdeadbeef ;
hr = ITypeLib_FindName ( tl , buffW , 0 , & ti , & memid , & c ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
todo_wine {
ok ( memid = = - 1 , " got %d \n " , memid ) ;
ok ( ! lstrcmpW ( buffW , wszGUID ) , " got %s \n " , wine_dbgstr_w ( buffW ) ) ;
ok ( c = = 1 , " got %d \n " , c ) ;
}
if ( c = = 1 )
ITypeInfo_Release ( ti ) ;
c = 1 ;
memid = - 1 ;
lstrcpyW ( buffW , invalidW ) ;
ti = ( void * ) 0xdeadbeef ;
hr = ITypeLib_FindName ( tl , buffW , 0 , & ti , & memid , & c ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
ok ( memid = = - 1 , " got %d \n " , memid ) ;
ok ( ! lstrcmpW ( buffW , invalidW ) , " got %s \n " , wine_dbgstr_w ( buffW ) ) ;
ok ( c = = 0 , " got %d \n " , c ) ;
ok ( ti = = ( void * ) 0xdeadbeef , " got %p \n " , ti ) ;
ITypeLib_Release ( tl ) ;
}
2013-05-27 12:43:38 +02:00
static void test_TypeInfo2_GetContainingTypeLib ( void )
{
static const WCHAR test [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' t ' , ' l ' , ' b ' , 0 } ;
static OLECHAR testTI [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' T ' , ' y ' , ' p ' , ' e ' , ' I ' , ' n ' , ' f ' , ' o ' , 0 } ;
ICreateTypeLib2 * ctl2 ;
ICreateTypeInfo * cti ;
ITypeInfo2 * ti2 ;
ITypeLib * tl ;
UINT Index ;
HRESULT hr ;
hr = CreateTypeLib2 ( SYS_WIN32 , test , & ctl2 ) ;
ok_ole_success ( hr , CreateTypeLib2 ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl2 , testTI , TKIND_DISPATCH , & cti ) ;
ok_ole_success ( hr , ICreateTypeLib2_CreateTypeInfo ) ;
hr = ICreateTypeInfo_QueryInterface ( cti , & IID_ITypeInfo2 , ( void * * ) & ti2 ) ;
ok_ole_success ( hr , ICreateTypeInfo2_QueryInterface ) ;
tl = NULL ;
Index = 888 ;
hr = ITypeInfo2_GetContainingTypeLib ( ti2 , & tl , & Index ) ;
ok_ole_success ( hr , ITypeInfo2_GetContainingTypeLib ) ;
2013-05-29 07:45:54 +02:00
ok ( tl ! = NULL , " ITypeInfo2_GetContainingTypeLib returned empty TypeLib \n " ) ;
2013-05-27 12:43:38 +02:00
ok ( Index = = 0 , " ITypeInfo2_GetContainingTypeLib returned Index = %u, expected 0 \n " , Index ) ;
if ( tl ) ITypeLib_Release ( tl ) ;
tl = NULL ;
hr = ITypeInfo2_GetContainingTypeLib ( ti2 , & tl , NULL ) ;
ok_ole_success ( hr , ITypeInfo2_GetContainingTypeLib ) ;
2013-05-29 07:45:54 +02:00
ok ( tl ! = NULL , " ITypeInfo2_GetContainingTypeLib returned empty TypeLib \n " ) ;
2013-05-27 12:43:38 +02:00
if ( tl ) ITypeLib_Release ( tl ) ;
Index = 888 ;
hr = ITypeInfo2_GetContainingTypeLib ( ti2 , NULL , & Index ) ;
ok_ole_success ( hr , ITypeInfo2_GetContainingTypeLib ) ;
ok ( Index = = 0 , " ITypeInfo2_GetContainingTypeLib returned Index = %u, expected 0 \n " , Index ) ;
hr = ITypeInfo2_GetContainingTypeLib ( ti2 , NULL , NULL ) ;
ok_ole_success ( hr , ITypeInfo2_GetContainingTypeLib ) ;
ITypeInfo2_Release ( ti2 ) ;
ICreateTypeInfo_Release ( cti ) ;
ICreateTypeLib2_Release ( ctl2 ) ;
}
2013-08-22 14:50:34 +02:00
static void create_manifest_file ( const char * filename , const char * manifest )
{
HANDLE file ;
DWORD size ;
file = CreateFileA ( filename , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS ,
FILE_ATTRIBUTE_NORMAL , NULL ) ;
ok ( file ! = INVALID_HANDLE_VALUE , " CreateFile failed: %u \n " , GetLastError ( ) ) ;
WriteFile ( file , manifest , strlen ( manifest ) , & size , NULL ) ;
CloseHandle ( file ) ;
}
static HANDLE create_actctx ( const char * file )
{
WCHAR path [ MAX_PATH ] ;
ACTCTXW actctx ;
HANDLE handle ;
MultiByteToWideChar ( CP_ACP , 0 , file , - 1 , path , MAX_PATH ) ;
memset ( & actctx , 0 , sizeof ( ACTCTXW ) ) ;
actctx . cbSize = sizeof ( ACTCTXW ) ;
actctx . lpSource = path ;
handle = pCreateActCtxW ( & actctx ) ;
ok ( handle ! = INVALID_HANDLE_VALUE , " handle == INVALID_HANDLE_VALUE, error %u \n " , GetLastError ( ) ) ;
ok ( actctx . cbSize = = sizeof ( actctx ) , " actctx.cbSize=%d \n " , actctx . cbSize ) ;
ok ( actctx . dwFlags = = 0 , " actctx.dwFlags=%d \n " , actctx . dwFlags ) ;
ok ( actctx . lpSource = = path , " actctx.lpSource=%p \n " , actctx . lpSource ) ;
ok ( actctx . wProcessorArchitecture = = 0 , " actctx.wProcessorArchitecture=%d \n " , actctx . wProcessorArchitecture ) ;
ok ( actctx . wLangId = = 0 , " actctx.wLangId=%d \n " , actctx . wLangId ) ;
ok ( actctx . lpAssemblyDirectory = = NULL , " actctx.lpAssemblyDirectory=%p \n " , actctx . lpAssemblyDirectory ) ;
ok ( actctx . lpResourceName = = NULL , " actctx.lpResourceName=%p \n " , actctx . lpResourceName ) ;
ok ( actctx . lpApplicationName = = NULL , " actctx.lpApplicationName=%p \n " ,
actctx . lpApplicationName ) ;
ok ( actctx . hModule = = NULL , " actctx.hModule=%p \n " , actctx . hModule ) ;
return handle ;
}
static const char manifest_dep [ ] =
" <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> " ;
static const char manifest_main [ ] =
" <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> " ;
static void test_LoadRegTypeLib ( void )
{
LCID lcid_en = MAKELCID ( MAKELANGID ( LANG_ENGLISH , SUBLANG_ENGLISH_US ) , SORT_DEFAULT ) ;
LCID lcid_ru = MAKELCID ( MAKELANGID ( LANG_RUSSIAN , SUBLANG_NEUTRAL ) , SORT_DEFAULT ) ;
ULONG_PTR cookie ;
TLIBATTR * attr ;
HANDLE handle ;
ITypeLib * tl ;
HRESULT hr ;
2013-08-23 08:30:44 +02:00
BSTR path ;
2013-08-22 14:50:34 +02:00
BOOL ret ;
if ( ! pActivateActCtx )
{
win_skip ( " Activation contexts not supported, skipping LoadRegTypeLib tests \n " ) ;
return ;
}
create_manifest_file ( " testdep.manifest " , manifest_dep ) ;
create_manifest_file ( " main.manifest " , manifest_main ) ;
handle = create_actctx ( " main.manifest " ) ;
DeleteFileA ( " testdep.manifest " ) ;
DeleteFileA ( " main.manifest " ) ;
/* create typelib file */
write_typelib ( 1 , " test_actctx_tlb.tlb " ) ;
write_typelib ( 3 , " test_actctx_tlb2.tlb " ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 1 , 0 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
hr = LoadRegTypeLib ( & LIBID_register_test , 1 , 0 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
2013-08-23 08:30:44 +02:00
hr = QueryPathOfRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , LOCALE_NEUTRAL , & path ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
2013-08-22 14:50:34 +02:00
ret = pActivateActCtx ( handle , & cookie ) ;
ok ( ret , " ActivateActCtx failed: %u \n " , GetLastError ( ) ) ;
2013-08-23 08:30:44 +02:00
path = NULL ;
hr = QueryPathOfRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , LOCALE_NEUTRAL , & path ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
SysFreeString ( path ) ;
path = NULL ;
hr = QueryPathOfRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , lcid_en , & path ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
SysFreeString ( path ) ;
path = NULL ;
hr = QueryPathOfRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , lcid_ru , & path ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
SysFreeString ( path ) ;
path = NULL ;
hr = QueryPathOfRegTypeLib ( & LIBID_TestTypelib , 1 , 0 , LOCALE_NEUTRAL , & path ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED | | broken ( hr = = S_OK ) /* winxp */ , " got 0x%08x \n " , hr ) ;
SysFreeString ( path ) ;
2013-08-22 14:50:34 +02:00
/* manifest version is 2.0, actual is 1.0 */
hr = LoadRegTypeLib ( & LIBID_register_test , 1 , 0 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED | | broken ( hr = = S_OK ) /* winxp */ , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK ) ITypeLib_Release ( tl ) ;
hr = LoadRegTypeLib ( & LIBID_register_test , 2 , 0 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
/* manifest version is 2.7, actual is 2.5 */
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , LOCALE_NEUTRAL , & tl ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK ) ITypeLib_Release ( tl ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 1 , LOCALE_NEUTRAL , & tl ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK ) ITypeLib_Release ( tl ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , lcid_en , & tl ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK ) ITypeLib_Release ( tl ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 0 , lcid_ru , & tl ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK ) ITypeLib_Release ( tl ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 7 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 2 , 5 , LOCALE_NEUTRAL , & tl ) ;
todo_wine
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
if ( hr = = S_OK )
{
hr = ITypeLib_GetLibAttr ( tl , & attr ) ;
ok ( hr = = S_OK , " got 0x%08x \n " , hr ) ;
ok ( attr - > lcid = = 0 , " got %x \n " , attr - > lcid ) ;
ok ( attr - > wMajorVerNum = = 2 , " got %d \n " , attr - > wMajorVerNum ) ;
ok ( attr - > wMinorVerNum = = 5 , " got %d \n " , attr - > wMinorVerNum ) ;
ok ( attr - > wLibFlags = = LIBFLAG_FHASDISKIMAGE , " got %x \n " , attr - > wLibFlags ) ;
ITypeLib_ReleaseTLibAttr ( tl , attr ) ;
ITypeLib_Release ( tl ) ;
}
hr = LoadRegTypeLib ( & LIBID_TestTypelib , 1 , 7 , LOCALE_NEUTRAL , & tl ) ;
ok ( hr = = TYPE_E_LIBNOTREGISTERED , " got 0x%08x \n " , hr ) ;
DeleteFileA ( " test_actctx_tlb.tlb " ) ;
DeleteFileA ( " test_actctx_tlb2.tlb " ) ;
ret = pDeactivateActCtx ( 0 , cookie ) ;
ok ( ret , " DeactivateActCtx failed: %u \n " , GetLastError ( ) ) ;
pReleaseActCtx ( handle ) ;
}
2013-08-26 19:40:08 +02:00
# define AUX_HREF 1
# define AUX_TDESC 2
# define AUX_ADESC 3
static struct _TDATest {
VARTYPE vt ;
ULONG size ; /* -1 == typelib ptr size */
WORD align ;
WORD align3264 ; /* for 32-bit typelibs loaded in 64-bit mode */
DWORD aux ;
TYPEDESC tdesc ;
ARRAYDESC adesc ;
} TDATests [ ] = {
{ VT_I2 , 2 , 2 , 2 } ,
{ VT_I4 , 4 , 4 , 4 } ,
{ VT_R4 , 4 , 4 , 4 } ,
{ VT_R8 , 8 , 4 , 8 } ,
{ VT_CY , 8 , 4 , 8 } ,
{ VT_DATE , 8 , 4 , 8 } ,
{ VT_BSTR , - 1 , 4 , 8 } ,
{ VT_DISPATCH , - 1 , 4 , 8 } ,
{ VT_ERROR , 4 , 4 , 4 } ,
{ VT_BOOL , 2 , 2 , 2 } ,
{ VT_VARIANT , 0 /* see code below */ , 4 , 8 } ,
{ VT_UNKNOWN , - 1 , 4 , 8 } ,
{ VT_DECIMAL , 16 , 4 , 8 } ,
{ VT_I1 , 1 , 1 , 1 } ,
{ VT_UI1 , 1 , 1 , 1 } ,
{ VT_UI2 , 2 , 2 , 2 } ,
{ VT_UI4 , 4 , 4 , 4 } ,
{ VT_I8 , 8 , 4 , 8 } ,
{ VT_UI8 , 8 , 4 , 8 } ,
{ VT_INT , 4 , 4 , 4 } ,
{ VT_UINT , 4 , 4 , 4 } ,
{ VT_VOID , 0 , 0 , 0 } ,
{ VT_HRESULT , 4 , 4 , 4 } ,
{ VT_PTR , - 1 , 4 , 8 , AUX_TDESC , { { 0 } , VT_INT } } ,
{ VT_SAFEARRAY , - 1 , 4 , 8 , AUX_TDESC , { { 0 } , VT_INT } } ,
{ VT_CARRAY , 16 /* == 4 * sizeof(int) */ , 4 , 4 , AUX_ADESC , { { 0 } } , { { { 0 } , VT_INT } , 1 , { { 4 , 0 } } } } ,
{ VT_USERDEFINED , 0 , 0 , 0 , AUX_HREF } ,
{ VT_LPSTR , - 1 , 4 , 8 } ,
{ VT_LPWSTR , - 1 , 4 , 8 } ,
{ 0 }
} ;
static void testTDA ( ITypeLib * tl , struct _TDATest * TDATest ,
ULONG ptr_size , HREFTYPE hreftype , ULONG href_cbSizeInstance ,
WORD href_cbAlignment , BOOL create )
{
TYPEDESC tdesc ;
WCHAR nameW [ 32 ] ;
ITypeInfo * ti ;
ICreateTypeInfo * cti ;
ICreateTypeLib2 * ctl ;
ULONG size ;
WORD alignment ;
TYPEATTR * typeattr ;
HRESULT hr ;
static const WCHAR name_fmtW [ ] = { ' a ' , ' l ' , ' i ' , ' a ' , ' s ' , ' % ' , ' 0 ' , ' 2 ' , ' u ' , 0 } ;
wsprintfW ( nameW , name_fmtW , TDATest - > vt ) ;
if ( create ) {
hr = ITypeLib_QueryInterface ( tl , & IID_ICreateTypeLib2 , ( void * * ) & ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , nameW , TKIND_ALIAS , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
tdesc . vt = TDATest - > vt ;
if ( TDATest - > aux = = AUX_TDESC )
U ( tdesc ) . lptdesc = & TDATest - > tdesc ;
else if ( TDATest - > aux = = AUX_ADESC )
U ( tdesc ) . lpadesc = & TDATest - > adesc ;
else if ( TDATest - > aux = = AUX_HREF )
U ( tdesc ) . hreftype = hreftype ;
hr = ICreateTypeInfo_SetTypeDescAlias ( cti , & tdesc ) ;
ok ( hr = = S_OK , " for VT %u, got %08x \n " , TDATest - > vt , hr ) ;
hr = ICreateTypeInfo_QueryInterface ( cti , & IID_ITypeInfo , ( void * * ) & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ICreateTypeInfo_Release ( cti ) ;
ICreateTypeLib2_Release ( ctl ) ;
} else {
USHORT found = 1 ;
MEMBERID memid ;
hr = ITypeLib_FindName ( tl , nameW , 0 , & ti , & memid , & found ) ;
ok ( hr = = S_OK , " for VT %u, got %08x \n " , TDATest - > vt , hr ) ;
}
hr = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
if ( TDATest - > aux = = AUX_HREF ) {
size = href_cbSizeInstance ;
alignment = href_cbAlignment ;
} else {
size = TDATest - > size ;
if ( size = = - 1 ) {
if ( create )
size = ptr_size ;
else
size = sizeof ( void * ) ;
} else if ( TDATest - > vt = = VT_VARIANT ) {
if ( create ) {
size = sizeof ( VARIANT ) ;
# ifdef _WIN64
if ( ptr_size ! = sizeof ( void * ) )
size - = 8 ; /* 32-bit variant is 4 bytes smaller than 64-bit variant */
# endif
} else
size = sizeof ( VARIANT ) ;
}
alignment = TDATest - > align ;
# ifdef _WIN64
if ( ! create & & ptr_size ! = sizeof ( void * ) )
alignment = TDATest - > align3264 ;
# endif
}
ok ( typeattr - > cbSizeInstance = = size | |
broken ( TDATest - > vt = = VT_VARIANT & & ptr_size ! = sizeof ( void * ) & & typeattr - > cbSizeInstance = = sizeof ( VARIANT ) ) /* winxp64 */ ,
" got wrong size for VT %u: 0x%x \n " , TDATest - > vt , typeattr - > cbSizeInstance ) ;
ok ( typeattr - > cbAlignment = = alignment , " got wrong alignment for VT %u: 0x%x \n " , TDATest - > vt , typeattr - > cbAlignment ) ;
ok ( typeattr - > tdescAlias . vt = = TDATest - > vt , " got wrong VT for VT %u: 0x%x \n " , TDATest - > vt , typeattr - > tdescAlias . vt ) ;
switch ( TDATest - > aux ) {
case AUX_HREF :
ok ( U ( typeattr - > tdescAlias ) . hreftype = = hreftype , " got wrong hreftype for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . hreftype ) ;
break ;
case AUX_TDESC :
ok ( U ( typeattr - > tdescAlias ) . lptdesc - > vt = = TDATest - > tdesc . vt , " got wrong typedesc VT for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . lptdesc - > vt ) ;
break ;
case AUX_ADESC :
ok ( U ( typeattr - > tdescAlias ) . lpadesc - > tdescElem . vt = = TDATest - > adesc . tdescElem . vt , " got wrong arraydesc element VT for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . lpadesc - > tdescElem . vt ) ;
ok ( U ( typeattr - > tdescAlias ) . lpadesc - > cDims = = TDATest - > adesc . cDims , " got wrong arraydesc dimension count for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . lpadesc - > cDims ) ;
ok ( U ( typeattr - > tdescAlias ) . lpadesc - > rgbounds [ 0 ] . cElements = = TDATest - > adesc . rgbounds [ 0 ] . cElements , " got wrong arraydesc element count for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . lpadesc - > rgbounds [ 0 ] . cElements ) ;
ok ( U ( typeattr - > tdescAlias ) . lpadesc - > rgbounds [ 0 ] . lLbound = = TDATest - > adesc . rgbounds [ 0 ] . lLbound , " got wrong arraydesc lower bound for VT %u: 0x%x \n " , TDATest - > vt , U ( typeattr - > tdescAlias ) . lpadesc - > rgbounds [ 0 ] . lLbound ) ;
break ;
}
2013-08-28 10:42:03 +02:00
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
2013-08-26 19:40:08 +02:00
ITypeInfo_Release ( ti ) ;
}
static void test_SetTypeDescAlias ( SYSKIND kind )
{
CHAR filenameA [ MAX_PATH ] ;
WCHAR filenameW [ MAX_PATH ] ;
ITypeLib * tl ;
ICreateTypeLib2 * ctl ;
ITypeInfo * ti ;
ICreateTypeInfo * cti ;
HREFTYPE hreftype ;
TYPEATTR * typeattr ;
ULONG href_cbSizeInstance , i ;
WORD href_cbAlignment , ptr_size ;
HRESULT hr ;
static OLECHAR interfaceW [ ] = { ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' f ' , ' a ' , ' c ' , ' e ' , 0 } ;
switch ( kind ) {
case SYS_WIN32 :
trace ( " testing SYS_WIN32 \n " ) ;
ptr_size = 4 ;
break ;
case SYS_WIN64 :
trace ( " testing SYS_WIN64 \n " ) ;
ptr_size = 8 ;
break ;
default :
return ;
}
GetTempFileNameA ( " . " , " tlb " , 0 , filenameA ) ;
MultiByteToWideChar ( CP_ACP , 0 , filenameA , - 1 , filenameW , MAX_PATH ) ;
hr = CreateTypeLib2 ( kind , filenameW , & ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeLib2_CreateTypeInfo ( ctl , interfaceW , TKIND_INTERFACE , & cti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_QueryInterface ( cti , & IID_ITypeInfo , ( void * * ) & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ICreateTypeInfo_AddRefTypeInfo ( cti , ti , & hreftype ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
href_cbSizeInstance = typeattr - > cbSizeInstance ;
href_cbAlignment = typeattr - > cbAlignment ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
ITypeInfo_Release ( ti ) ;
ICreateTypeInfo_Release ( cti ) ;
hr = ICreateTypeLib2_QueryInterface ( ctl , & IID_ITypeLib , ( void * * ) & tl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
for ( i = 0 ; TDATests [ i ] . vt ; + + i )
testTDA ( tl , & TDATests [ i ] , ptr_size , hreftype , href_cbSizeInstance , href_cbAlignment , TRUE ) ;
hr = ICreateTypeLib2_SaveAllChanges ( ctl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
ITypeLib_Release ( tl ) ;
2013-08-28 16:25:31 +02:00
ok ( 0 = = ICreateTypeLib2_Release ( ctl ) , " typelib should have been released \n " ) ;
2013-08-26 19:40:08 +02:00
trace ( " after save... \n " ) ;
hr = LoadTypeLibEx ( filenameW , REGKIND_NONE , & tl ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeLib_GetTypeInfo ( tl , 0 , & ti ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
hr = ITypeInfo_GetTypeAttr ( ti , & typeattr ) ;
ok ( hr = = S_OK , " got %08x \n " , hr ) ;
href_cbSizeInstance = typeattr - > cbSizeInstance ;
href_cbAlignment = typeattr - > cbAlignment ;
ITypeInfo_ReleaseTypeAttr ( ti , typeattr ) ;
ITypeInfo_Release ( ti ) ;
for ( i = 0 ; TDATests [ i ] . vt ; + + i )
testTDA ( tl , & TDATests [ i ] , ptr_size , hreftype , href_cbSizeInstance , href_cbAlignment , FALSE ) ;
2013-08-28 16:25:31 +02:00
ok ( 0 = = ITypeLib_Release ( tl ) , " typelib should have been released \n " ) ;
2013-08-26 19:40:08 +02:00
DeleteFileA ( filenameA ) ;
}
2004-08-19 22:29:16 +02:00
START_TEST ( typelib )
{
2008-04-25 12:09:03 +02:00
const char * filename ;
2010-07-30 14:44:19 +02:00
init_function_pointers ( ) ;
2006-02-16 19:33:08 +01:00
ref_count_test ( wszStdOle2 ) ;
2005-12-06 21:23:19 +01:00
test_TypeComp ( ) ;
2006-02-06 20:57:09 +01:00
test_CreateDispTypeInfo ( ) ;
2006-02-16 19:33:08 +01:00
test_TypeInfo ( ) ;
2010-08-26 12:22:20 +02:00
test_DispCallFunc ( ) ;
2010-08-19 18:13:43 +02:00
test_QueryPathOfRegTypeLib ( 32 ) ;
2013-08-13 00:56:36 +02:00
if ( sizeof ( void * ) = = 8 ) {
2010-08-19 18:13:43 +02:00
test_QueryPathOfRegTypeLib ( 64 ) ;
2013-08-13 00:56:36 +02:00
test_CreateTypeLib ( SYS_WIN64 ) ;
2013-08-26 19:40:08 +02:00
test_SetTypeDescAlias ( SYS_WIN64 ) ;
2013-08-13 00:56:36 +02:00
}
test_CreateTypeLib ( SYS_WIN32 ) ;
2013-08-26 19:40:08 +02:00
test_SetTypeDescAlias ( SYS_WIN32 ) ;
2007-05-11 16:23:31 +02:00
test_inheritance ( ) ;
2010-12-24 00:04:38 +01:00
test_SetVarHelpContext ( ) ;
2010-12-25 15:56:11 +01:00
test_SetFuncAndParamNames ( ) ;
2013-09-19 18:10:05 +02:00
test_SetDocString ( ) ;
2012-01-26 11:42:35 +01:00
test_FindName ( ) ;
2008-04-25 12:09:03 +02:00
2010-04-01 14:02:17 +02:00
if ( ( filename = create_test_typelib ( 2 ) ) )
2008-04-25 12:09:03 +02:00
{
test_dump_typelib ( filename ) ;
DeleteFile ( filename ) ;
}
2009-06-10 17:45:29 +02:00
2010-07-30 14:44:19 +02:00
test_register_typelib ( TRUE ) ;
test_register_typelib ( FALSE ) ;
2009-06-10 17:45:29 +02:00
test_create_typelibs ( ) ;
2010-11-15 17:45:35 +01:00
test_LoadTypeLib ( ) ;
2013-05-27 12:43:38 +02:00
test_TypeInfo2_GetContainingTypeLib ( ) ;
2013-08-22 14:50:34 +02:00
test_LoadRegTypeLib ( ) ;
2004-08-19 22:29:16 +02:00
}