Hi,
Well, I've made pretty good progress, but am a bit stuck with this problem. Basically:
003d:trace:ole:TL_Marshal parameter 1 003d:trace:ole:TL_Marshal name : L"rgszNames" 003d:trace:ole:TL_Marshal type : 26 003d:trace:ole:TL_Marshal flags : 01 003d:trace:ole:TL_MarshalType dereferencing PTR 0x52edf7d0 => 0x54331260 003d:trace:ole:TL_MarshalType dereferencing PTR 0x54331260 => 0x54331270 003d:trace:ole:TL_MarshalType marshaling byte 100
weird. are the "type" and "flags" correct?
As you can see, it's marshalling IDispatch across apartment boundaries, but it gets this parameter wrong. The double dereference seems correct, but marshalling a byte is not - I think it should be a BSTR.
rgszNames is a parameter of IDispatch::GetIDsFromNames, which is defined as an OLECHAR FAR* FAR*
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. 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)?
I can't figure out where the typeinfo data for IDispatch is coming from though, hence my stuckness. BTW, is this line really correct:
TL_Unmarshal(pStm, pInfo, pDesc, PARAMFLAG_FIN, args, &argc, pChannel, &is_iid);
shouldn't it be:
TL_Unmarshal(pStm, pInfo, pDesc, PARAMFLAG_FIN, (DWORD*)&args[0], &argc, pChannel, &is_iid);
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.
Kelly