On Fri, 2003-07-18 at 17:08, Kelly Leahy wrote:
weird. are the "type" and "flags" correct?
They appear to be. Type 26 is VT_PTR, flags 1 == in param
bstr isn't right, since it's an array of bstr (or more precisely array of OLECHAR FAR* - which may also be causing problems) - though I may be wrong if it marshals them one by one.
Yeah, I had a thinko. It's supposed to be an array of bstr, but even simply marshalling the first element correctly would be good :)
Shouldn't there be some special attributes in the IDL for this stuff, like size_of() or something like that (I'm a bit rusty)?
HRESULT GetIDsOfNames( [in] REFIID riid, [in, size_is(cNames)] LPOLESTR *rgszNames, [in] UINT cNames, [in] LCID lcid, [out, size_is(cNames)] DISPID *rgDispId);
Maybe the size_is() field should be noticed somewhere in the marshalling code. I don't know where such information would surface though, it's not in the flags, there is no PARAMFLAG constant for it.
these should be identical in terms of the code that gets compiles, though the second form may eliminate some warnings by using the typecast. Incidentally, you could just use (DWORD*)args to have the same effect.
Hm, so if you declare an array like so:
DWORD args[32];
and then pass args as a parameter of type "DWORD *args", it automatically gets the address of it? I thought passing variables directly like that would normally cause a copy by value, but I don't know C well enough I suppose.