[Bug 6638] ADODB.Recordset.Fields.Append method fails when last
parameter omitted
Wine Bugs
wine-bugs at winehq.org
Thu Nov 9 16:50:26 CST 2006
http://bugs.winehq.org/show_bug.cgi?id=6638
------- Additional Comments From a_villacis at palosanto.com 2006-09-11 16:50 -------
Created an attachment (id=4045)
--> (http://bugs.winehq.org/attachment.cgi?id=4045&action=view)
IDL of the ADODB typelib with the Attach method
This is the IDL of the typelib responsible for the crash.
One thing is apparent in close examination: There are really two methods.
There is an:
[id(0x00000003)]
void Append(
[in] BSTR Name,
[in] DataTypeEnum Type,
[in, opt, hasdefault] ADO_LONGPTR
DefinedSize, [in, opt, hasdefault]
FieldAttributeEnum Attrib,
[in, opt] VARIANT FieldValue);
And then, there is an:
void _stdcall _Append(
[in] BSTR Name,
[in] DataTypeEnum Type,
[in, opt, hasdefault] ADO_LONGPTR DefinedSize,
[in, opt, hasdefault] FieldAttributeEnum Attrib);
The key differences between the two methods (apart from the underscore) is that
1) Append and _Append differ only in the presence of the critical parameter
FieldValue. Note that FieldValue is declared as [in, opt], but does not have a
hasdefault attribute.
2) _Append does not have an ID for the IDispatch interface. If I understand the
code correctly, this means it cannot be directly invoked through IDispatch.
I have a hypothesis, that native oleaut32 checks the number of parameters given
to the Invoke method. The Invoke method was given the ID of the Append method,
but in the 4-parameter case, _Append gets called instead, since its parameter
list more closely matches the actual usage. So the general rule might be: if
there are ommited parameters with [in, opt] attributes, but no hasdefault
attribute, then check whether an underscore-prefixed version of the method
exists which does not have the problematic parameter, and call that instead.
This obviously requires a testcase, but this seems sensible to me, at least in
principle. The underscore might then work as a kind of crude method
overloading. Builtin oleaut32 does not follow this rule, and ends up invoking
the wrong version of the method, with the exception explained earlier.
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
More information about the wine-bugs
mailing list