From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/command.c | 165 ++++++++++++++++++++++++++++++++- dlls/msado15/main.c | 1 + dlls/msado15/msado15_private.h | 1 + dlls/msado15/tests/msado15.c | 13 +++ 4 files changed, 178 insertions(+), 2 deletions(-)
diff --git a/dlls/msado15/command.c b/dlls/msado15/command.c index 762a13c8776..de5dcc0233e 100644 --- a/dlls/msado15/command.c +++ b/dlls/msado15/command.c @@ -33,6 +33,7 @@ struct command { _Command Command_iface; ADOCommandConstruction ADOCommandConstruction_iface; + Parameters Parameters_iface; LONG ref; CommandTypeEnum type; BSTR text; @@ -49,6 +50,156 @@ static inline struct command *impl_from_ADOCommandConstruction( ADOCommandConstr return CONTAINING_RECORD( iface, struct command, ADOCommandConstruction_iface ); }
+static inline struct command *impl_from_Parameters( Parameters *iface ) +{ + return CONTAINING_RECORD( iface, struct command, Parameters_iface ); +} + +static HRESULT WINAPI parameters_QueryInterface(Parameters *iface, REFIID riid, void **obj) +{ + TRACE( "%p, %s, %p\n", iface, debugstr_guid(riid), obj ); + + *obj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID__Collection) || + IsEqualIID(riid, &IID__DynaCollection) || + IsEqualIID(riid, &IID_Parameters)) + { + *obj = iface; + } + else + { + FIXME( "interface %s not implemented\n", debugstr_guid(riid) ); + return E_NOINTERFACE; + } + + Parameters_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI parameters_AddRef(Parameters *iface) +{ + struct command *command = impl_from_Parameters( iface ); + return _Command_AddRef(&command->Command_iface); +} + +static ULONG WINAPI parameters_Release(Parameters *iface) +{ + struct command *command = impl_from_Parameters( iface ); + return _Command_Release(&command->Command_iface); +} + +static HRESULT WINAPI parameters_GetTypeInfoCount(Parameters *iface, UINT *count) +{ + struct command *command = impl_from_Parameters( iface ); + TRACE( "%p, %p\n", command, count ); + *count = 1; + return S_OK; +} + +static HRESULT WINAPI parameters_GetTypeInfo(Parameters *iface, UINT index, LCID lcid, ITypeInfo **info) +{ + struct command *command = impl_from_Parameters( iface ); + TRACE( "%p, %u, %lu, %p\n", command, index, lcid, info ); + return get_typeinfo(Parameters_tid, info); +} + +static HRESULT WINAPI parameters_GetIDsOfNames(Parameters *iface, REFIID riid, LPOLESTR *names, UINT count, + LCID lcid, DISPID *dispid) +{ + struct command *command = impl_from_Parameters( iface ); + HRESULT hr; + ITypeInfo *typeinfo; + + TRACE( "%p, %s, %p, %u, %lu, %p\n", command, debugstr_guid(riid), names, count, lcid, dispid ); + + hr = get_typeinfo(Parameters_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, dispid); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI parameters_Invoke(Parameters *iface, DISPID member, REFIID riid, LCID lcid, WORD flags, + DISPPARAMS *params, VARIANT *result, EXCEPINFO *excep_info, UINT *arg_err) +{ + struct command *command = impl_from_Parameters( iface ); + HRESULT hr; + ITypeInfo *typeinfo; + + TRACE( "%p, %ld, %s, %ld, %d, %p, %p, %p, %p\n", command, member, debugstr_guid(riid), lcid, flags, params, + result, excep_info, arg_err ); + + hr = get_typeinfo(Parameters_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke(typeinfo, &command->Parameters_iface, member, flags, params, + result, excep_info, arg_err); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI parameters_get_Count(Parameters *iface, LONG *count) +{ + FIXME( "%p, %p\n", iface, count); + *count = 0; + return S_OK; +} + +static HRESULT WINAPI parameters__NewEnum(Parameters *iface, IUnknown **object) +{ + FIXME( "%p, %p\n", iface, object); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameters_Refresh(Parameters *iface) +{ + FIXME( "%p\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameters_Append(Parameters *iface, IDispatch *object) +{ + FIXME( "%p, %p\n", iface, object); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameters_Delete(Parameters *iface, VARIANT index) +{ + FIXME( "%p, %s\n", iface, debugstr_variant(&index)); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameters_get_Item(Parameters *iface, VARIANT index, _Parameter **object) +{ + FIXME( "%p, %s, %p\n", iface, debugstr_variant(&index), object); + return E_NOTIMPL; +} + +static const struct ParametersVtbl parameters_vtbl = +{ + parameters_QueryInterface, + parameters_AddRef, + parameters_Release, + parameters_GetTypeInfoCount, + parameters_GetTypeInfo, + parameters_GetIDsOfNames, + parameters_Invoke, + parameters_get_Count, + parameters__NewEnum, + parameters_Refresh, + parameters_Append, + parameters_Delete, + parameters_get_Item +}; + static HRESULT WINAPI command_QueryInterface( _Command *iface, REFIID riid, void **obj ) { struct command *command = impl_from_Command( iface ); @@ -253,8 +404,17 @@ static HRESULT WINAPI command_CreateParameter( _Command *iface, BSTR name, DataT
static HRESULT WINAPI command_get_Parameters( _Command *iface, Parameters **parameters ) { - FIXME( "%p, %p\n", iface, parameters ); - return E_NOTIMPL; + struct command *command = impl_from_Command( iface ); + + TRACE( "%p, %p\n", iface, parameters ); + + if (!parameters) + return E_INVALIDARG; + + *parameters = &command->Parameters_iface; + Parameters_AddRef(*parameters); + + return S_OK; }
static HRESULT WINAPI command_put_CommandType( _Command *iface, CommandTypeEnum type ) @@ -446,6 +606,7 @@ HRESULT Command_create( void **obj ) if (!(command = malloc( sizeof(*command) ))) return E_OUTOFMEMORY; command->Command_iface.lpVtbl = &command_vtbl; command->ADOCommandConstruction_iface.lpVtbl = &construct_vtbl; + command->Parameters_iface.lpVtbl = ¶meters_vtbl; command->type = adCmdUnknown; command->text = NULL; command->connection = NULL; diff --git a/dlls/msado15/main.c b/dlls/msado15/main.c index 2d2f220c06f..2e2e5a83250 100644 --- a/dlls/msado15/main.c +++ b/dlls/msado15/main.c @@ -145,6 +145,7 @@ static REFIID tid_ids[] = { &IID__Connection, &IID_Field, &IID_Fields, + &IID_Parameters, &IID_Properties, &IID_Property, &IID__Recordset, diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h index f8a515a596f..797354e7dc0 100644 --- a/dlls/msado15/msado15_private.h +++ b/dlls/msado15/msado15_private.h @@ -32,6 +32,7 @@ typedef enum tid_t { Connection_tid, Field_tid, Fields_tid, + Parameters_tid, Properties_tid, Property_tid, Recordset_tid, diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 8826fb5b0e8..4b46848cbe7 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -1332,6 +1332,7 @@ static void test_Command(void) BSTR cmd_text = (BSTR)"test"; _Connection *connection; ADOCommandConstruction *adocommand; + Parameters *parameters, *parameters2;
hr = CoCreateInstance( &CLSID_Command, NULL, CLSCTX_INPROC_SERVER, &IID__Command, (void **)&command ); ok( hr == S_OK, "got %08lx\n", hr ); @@ -1352,6 +1353,9 @@ static void test_Command(void) ok( hr == S_OK, "got %08lx\n", hr ); ADOCommandConstruction_Release( adocommand );
+ hr = _Command_QueryInterface( command, &IID_Parameters, (void **)¶meters ); + ok( hr == E_NOINTERFACE, "got %08lx\n", hr ); + hr = _Command_get_CommandType( command, &cmd_type ); ok( hr == S_OK, "got %08lx\n", hr ); ok( cmd_type == adCmdUnknown, "got %08x\n", cmd_type ); @@ -1397,6 +1401,15 @@ static void test_Command(void) hr = _Command_putref_ActiveConnection( command, NULL ); ok( hr == S_OK, "got %08lx\n", hr );
+ hr = _Command_get_Parameters( command, ¶meters ); + ok( hr == S_OK, "got %08lx\n", hr ); + + hr = _Command_get_Parameters( command, ¶meters2 ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( parameters == parameters2, "got %08lx\n", hr ); + Parameters_Release(parameters); + Parameters_Release(parameters2); + _Command_Release( command ); }
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/command.c | 61 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 6 deletions(-)
diff --git a/dlls/msado15/command.c b/dlls/msado15/command.c index de5dcc0233e..99519527c1c 100644 --- a/dlls/msado15/command.c +++ b/dlls/msado15/command.c @@ -24,11 +24,19 @@ #include "msado15_backcompat.h"
#include "wine/debug.h" +#include "wine/list.h"
#include "msado15_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(msado15);
+struct param_item +{ + struct list entry; + + IDispatch *param; +}; + struct command { _Command Command_iface; @@ -38,6 +46,8 @@ struct command CommandTypeEnum type; BSTR text; _Connection *connection; + + struct list parameters; };
static inline struct command *impl_from_Command( _Command *iface ) @@ -148,8 +158,9 @@ static HRESULT WINAPI parameters_Invoke(Parameters *iface, DISPID member, REFIID
static HRESULT WINAPI parameters_get_Count(Parameters *iface, LONG *count) { - FIXME( "%p, %p\n", iface, count); - *count = 0; + struct command *command = impl_from_Parameters( iface ); + TRACE( "%p, %p\n", iface, count); + *count = list_count(&command->parameters); return S_OK; }
@@ -167,14 +178,41 @@ static HRESULT WINAPI parameters_Refresh(Parameters *iface)
static HRESULT WINAPI parameters_Append(Parameters *iface, IDispatch *object) { - FIXME( "%p, %p\n", iface, object); - return E_NOTIMPL; + struct command *command = impl_from_Parameters( iface ); + struct param_item *param; + + TRACE( "%p, %p\n", iface, object); + + if (!(param = calloc(1, sizeof(*param)))) + return E_OUTOFMEMORY; + param->param = object; + IDispatch_AddRef(object); + + list_add_tail(&command->parameters, ¶m->entry); + return S_OK; }
static HRESULT WINAPI parameters_Delete(Parameters *iface, VARIANT index) { - FIXME( "%p, %s\n", iface, debugstr_variant(&index)); - return E_NOTIMPL; + struct command *command = impl_from_Parameters( iface ); + struct param_item *para, *para2; + int cnt = 0; + + TRACE( "%p, %s\n", iface, debugstr_variant(&index)); + + LIST_FOR_EACH_ENTRY_SAFE(para, para2, &command->parameters, struct param_item, entry) + { + if(cnt == V_I4(&index)) + { + list_remove(¶->entry); + if (para->param) + IDispatch_Release(para->param); + free(para); + break; + } + } + + return S_OK; }
static HRESULT WINAPI parameters_get_Item(Parameters *iface, VARIANT index, _Parameter **object) @@ -242,7 +280,17 @@ static ULONG WINAPI command_Release( _Command *iface ) LONG ref = InterlockedDecrement( &command->ref ); if (!ref) { + struct param_item *para, *para2; TRACE( "destroying %p\n", command ); + + LIST_FOR_EACH_ENTRY_SAFE(para, para2, &command->parameters, struct param_item, entry) + { + list_remove(¶->entry); + if (para->param) + IDispatch_Release(para->param); + free(para); + } + if (command->connection) _Connection_Release(command->connection); free( command->text ); free( command ); @@ -610,6 +658,7 @@ HRESULT Command_create( void **obj ) command->type = adCmdUnknown; command->text = NULL; command->connection = NULL; + list_init(&command->parameters); command->ref = 1;
*obj = &command->Command_iface;
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/command.c | 305 ++++++++++++++++++++++++++++++++- dlls/msado15/main.c | 1 + dlls/msado15/msado15_private.h | 1 + dlls/msado15/tests/msado15.c | 20 +++ 4 files changed, 323 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/command.c b/dlls/msado15/command.c index 99519527c1c..0aecf2a7c54 100644 --- a/dlls/msado15/command.c +++ b/dlls/msado15/command.c @@ -50,6 +50,23 @@ struct command struct list parameters; };
+struct parameter +{ + _Parameter Parameter_iface; + LONG ref; + + BSTR name; + DataTypeEnum datatype; + ParameterDirectionEnum direction; + ADO_LONGPTR size; + VARIANT value; +}; + +static inline struct parameter *impl_from_Parameter( _Parameter *iface ) +{ + return CONTAINING_RECORD( iface, struct parameter, Parameter_iface ); +} + static inline struct command *impl_from_Command( _Command *iface ) { return CONTAINING_RECORD( iface, struct command, Command_iface ); @@ -442,14 +459,294 @@ static HRESULT WINAPI command_Execute( _Command *iface, VARIANT *affected, VARIA return E_NOTIMPL; }
-static HRESULT WINAPI command_CreateParameter( _Command *iface, BSTR name, DataTypeEnum type, - ParameterDirectionEnum direction, ADO_LONGPTR size, VARIANT value, - _Parameter **parameter ) +static HRESULT WINAPI parameter_QueryInterface(_Parameter *iface, REFIID riid, void **obj) +{ + TRACE( "%p, %s, %p\n", iface, debugstr_guid(riid), obj ); + + *obj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID__Parameter)) + { + *obj = iface; + } + else + { + FIXME( "interface %s not implemented\n", debugstr_guid(riid) ); + return E_NOINTERFACE; + } + + _Parameter_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI parameter_AddRef(_Parameter *iface) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + return InterlockedIncrement( ¶meter->ref ); +} + +static ULONG WINAPI parameter_Release(_Parameter *iface) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + LONG ref = InterlockedDecrement( ¶meter->ref ); + if (!ref) + { + SysFreeString(parameter->name); + VariantClear(¶meter->value); + + free( parameter ); + } + + return ref; +} + +static HRESULT WINAPI parameter_GetTypeInfoCount(_Parameter *iface, UINT *count) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE( "%p, %p\n", parameter, count ); + *count = 1; + return S_OK; +} + +static HRESULT WINAPI parameter_GetTypeInfo(_Parameter *iface, UINT index, LCID lcid, ITypeInfo **info) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE( "%p, %u, %lu, %p\n", parameter, index, lcid, info ); + return get_typeinfo(Parameter_tid, info); +} + +static HRESULT WINAPI parameter_GetIDsOfNames(_Parameter *iface, REFIID riid, LPOLESTR *names, UINT count, + LCID lcid, DISPID *dispid) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + HRESULT hr; + ITypeInfo *typeinfo; + + TRACE( "%p, %s, %p, %u, %lu, %p\n", parameter, debugstr_guid(riid), names, count, lcid, dispid ); + + hr = get_typeinfo(Parameter_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, dispid); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI parameter_Invoke(_Parameter *iface, DISPID member, REFIID riid, LCID lcid, WORD flags, + DISPPARAMS *params, VARIANT *result, EXCEPINFO *excep_info, UINT *arg_err) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + HRESULT hr; + ITypeInfo *typeinfo; + + TRACE( "%p, %ld, %s, %ld, %d, %p, %p, %p, %p\n", parameter, member, debugstr_guid(riid), lcid, flags, params, + result, excep_info, arg_err ); + + hr = get_typeinfo(Parameter_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke(typeinfo, ¶meter->Parameter_iface, member, flags, params, + result, excep_info, arg_err); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI parameter_get_Properties(_Parameter *iface, Properties **object) { - FIXME( "%p, %s, %d, %d, %Id, %p\n", iface, debugstr_w(name), type, direction, size, parameter ); + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %p\n", parameter, object); return E_NOTIMPL; }
+static HRESULT WINAPI parameter_get_Name(_Parameter *iface, BSTR *str) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %p\n", parameter, str); + *str = SysAllocString(parameter->name); + return S_OK; +} + +static HRESULT WINAPI parameter_put_Name(_Parameter *iface, BSTR str) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %s\n", parameter, debugstr_w(str)); + + SysFreeString(parameter->name); + parameter->name = SysAllocString(str); + return S_OK; +} + +static HRESULT WINAPI parameter_get_Value(_Parameter *iface, VARIANT *val) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %p\n", parameter, val); + + return VariantCopy(val, ¶meter->value); +} + +static HRESULT WINAPI parameter_put_Value(_Parameter *iface, VARIANT val) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %s\n", parameter, debugstr_variant(&val)); + + VariantClear(¶meter->value); + return VariantCopy(¶meter->value, &val); +} + +static HRESULT WINAPI parameter_get_Type(_Parameter *iface, DataTypeEnum *data_type) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %p\n", parameter, data_type); + *data_type = parameter->datatype; + return S_OK; +} + +static HRESULT WINAPI parameter_put_Type(_Parameter *iface, DataTypeEnum data_type) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %d\n", parameter, data_type); + parameter->datatype = data_type; + return S_OK; +} + +static HRESULT WINAPI parameter_put_Direction(_Parameter *iface, ParameterDirectionEnum direction) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %d\n", parameter, direction); + parameter->direction = direction; + return S_OK; +} + +static HRESULT WINAPI parameter_get_Direction(_Parameter *iface, ParameterDirectionEnum *direction) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %p\n", parameter, direction); + *direction = parameter->direction; + return S_OK; +} + +static HRESULT WINAPI parameter_put_Precision(_Parameter *iface, unsigned char precision) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %d\n", parameter, precision); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_get_Precision(_Parameter *iface, unsigned char *precision) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %p\n", parameter, precision); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_put_NumericScale(_Parameter *iface, unsigned char scale) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %d\n", parameter, scale); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_get_NumericScale(_Parameter *iface, unsigned char *scale) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %p\n", parameter, scale); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_put_Size(_Parameter *iface, ADO_LONGPTR size) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %Id\n", parameter, size); + parameter->size = size; + return S_OK; +} + +static HRESULT WINAPI parameter_get_Size(_Parameter *iface, ADO_LONGPTR *size) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + TRACE("%p, %p\n", parameter, size); + *size = parameter->size; + return S_OK; +} + +static HRESULT WINAPI parameter_AppendChunk(_Parameter *iface, VARIANT val) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %s\n", parameter, debugstr_variant(&val)); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_get_Attributes(_Parameter *iface, LONG *attrs) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %p\n", parameter, attrs); + return E_NOTIMPL; +} + +static HRESULT WINAPI parameter_put_Attributes(_Parameter *iface, LONG attrs) +{ + struct parameter *parameter = impl_from_Parameter( iface ); + FIXME("%p, %ld\n", parameter, attrs); + return E_NOTIMPL; +} + +static const _ParameterVtbl parameter_vtbl = +{ + parameter_QueryInterface, + parameter_AddRef, + parameter_Release, + parameter_GetTypeInfoCount, + parameter_GetTypeInfo, + parameter_GetIDsOfNames, + parameter_Invoke, + parameter_get_Properties, + parameter_get_Name, + parameter_put_Name, + parameter_get_Value, + parameter_put_Value, + parameter_get_Type, + parameter_put_Type, + parameter_put_Direction, + parameter_get_Direction, + parameter_put_Precision, + parameter_get_Precision, + parameter_put_NumericScale, + parameter_get_NumericScale, + parameter_put_Size, + parameter_get_Size, + parameter_AppendChunk, + parameter_get_Attributes, + parameter_put_Attributes +}; + +static HRESULT WINAPI command_CreateParameter( _Command *iface, BSTR name, DataTypeEnum type, + ParameterDirectionEnum direction, ADO_LONGPTR size, VARIANT value, + _Parameter **obj ) +{ + struct parameter *parameter; + TRACE( "%p, %s, %d, %d, %Id, %s, %p\n", iface, debugstr_w(name), type, direction, size, + debugstr_variant(&value), obj ); + + if (!(parameter = malloc( sizeof(*parameter) ))) return E_OUTOFMEMORY; + parameter->Parameter_iface.lpVtbl = ¶meter_vtbl; + parameter->ref = 1; + parameter->name = SysAllocString(name); + parameter->datatype = type; + parameter->direction = direction; + parameter->size = size; + VariantCopy(¶meter->value, &value); + + *obj = ¶meter->Parameter_iface; + TRACE( "returning iface %p\n", *obj ); + return S_OK; +} + static HRESULT WINAPI command_get_Parameters( _Command *iface, Parameters **parameters ) { struct command *command = impl_from_Command( iface ); diff --git a/dlls/msado15/main.c b/dlls/msado15/main.c index 2e2e5a83250..91b2a642771 100644 --- a/dlls/msado15/main.c +++ b/dlls/msado15/main.c @@ -145,6 +145,7 @@ static REFIID tid_ids[] = { &IID__Connection, &IID_Field, &IID_Fields, + &IID__Parameter, &IID_Parameters, &IID_Properties, &IID_Property, diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h index 797354e7dc0..2944f9fce4f 100644 --- a/dlls/msado15/msado15_private.h +++ b/dlls/msado15/msado15_private.h @@ -32,6 +32,7 @@ typedef enum tid_t { Connection_tid, Field_tid, Fields_tid, + Parameter_tid, Parameters_tid, Properties_tid, Property_tid, diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 4b46848cbe7..76e1bb35b77 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -1333,6 +1333,10 @@ static void test_Command(void) _Connection *connection; ADOCommandConstruction *adocommand; Parameters *parameters, *parameters2; + _Parameter *parameter = NULL; + IDispatch *disp; + BSTR str; + VARIANT value;
hr = CoCreateInstance( &CLSID_Command, NULL, CLSCTX_INPROC_SERVER, &IID__Command, (void **)&command ); ok( hr == S_OK, "got %08lx\n", hr ); @@ -1401,9 +1405,25 @@ static void test_Command(void) hr = _Command_putref_ActiveConnection( command, NULL ); ok( hr == S_OK, "got %08lx\n", hr );
+ VariantInit(&value); + str = SysAllocString(L"_"); + hr = _Command_CreateParameter(command, str, adInteger, adParamInput, 0, value, ¶meter ); + SysFreeString(str); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( parameter != NULL, "Invalid pointer\n"); + hr = _Command_get_Parameters( command, ¶meters ); ok( hr == S_OK, "got %08lx\n", hr );
+ hr = _Parameter_QueryInterface(parameter, &IID_IDispatch, (void**)&disp); + ok( hr == S_OK, "got %08lx\n", hr ); + + hr = Parameters_Append(parameters, disp); + ok( hr == S_OK, "got %08lx\n", hr ); + + IDispatch_Release(disp); + _Parameter_Release(parameter); + hr = _Command_get_Parameters( command, ¶meters2 ); ok( hr == S_OK, "got %08lx\n", hr ); ok( parameters == parameters2, "got %08lx\n", hr );