http://bugs.winehq.org/show_bug.cgi?id=24759
--- Comment #14 from bill lam cbill.lam@gmail.com 2010-10-17 19:28:09 CDT --- I suspect the bug is inside usemarshal.c
wiresab = (SAFEARRAYBOUND *)Buffer; Buffer += sizeof(wiresab[0]) * wiresa->cDims;
if(vt) *ppsa = SafeArrayCreateEx(vt, wiresa->cDims, wiresab, NULL);
where Buffer is (I supposed) the internal record of safearray, if it is the case then, the axis specification in wiresab will be in the reversed order. However SafeArrayCreate expects wiresab hold axis dimension in the normal order. The patch in year 2006 only change the storage of safearray but did not modify this part.
IMO what should be done is to create a vector from Buffer that holds the axis dimension in normal order for the consumption of safearraycreate. Can you write a patch for this?