diff options
Diffstat (limited to 'packages/winunits-base/src/comobj.pp')
| -rw-r--r-- | packages/winunits-base/src/comobj.pp | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/packages/winunits-base/src/comobj.pp b/packages/winunits-base/src/comobj.pp index ef79e47938..c89972a174 100644 --- a/packages/winunits-base/src/comobj.pp +++ b/packages/winunits-base/src/comobj.pp @@ -1335,9 +1335,8 @@ HKCR invokeresult : HRESULT; preallocateddata : array[0..15] of TVarData; Arguments : ^TVarData; - NamedArguments : PPointer; - CurrType : byte; - namedcount,i : byte; + CurrType, i : byte; + dispidNamed: dispid; begin { use preallocated space, i.e. can we avoid a getmem call? } if desc^.calldesc.argcount<=Length(preallocateddata) then @@ -1402,16 +1401,24 @@ HKCR end; dispparams.cArgs:=desc^.calldesc.argcount; dispparams.rgvarg:=pointer(Arguments); + dispparams.cNamedArgs:=desc^.calldesc.namedargcount; + dispparams.rgdispidNamedArgs:=@desc^.CallDesc.ArgTypes[desc^.CallDesc.ArgCount]; + flags:=desc^.calldesc.calltype; + + case flags of + DISPATCH_PROPERTYPUT: + begin + inc(dispparams.cNamedArgs); + if (Arguments[0].VType and varTypeMask) = varDispatch then + flags:=DISPATCH_PROPERTYPUTREF; + dispidNamed:=DISPID_PROPERTYPUT; + DispParams.rgdispidNamedArgs:=@dispidNamed; + end; + DISPATCH_METHOD: + if assigned(res) and (desc^.calldesc.argcount=0) then + flags:=DISPATCH_METHOD or DISPATCH_PROPERTYGET; + end; - { handle properties properly here ! } - namedcount:=desc^.calldesc.namedargcount; - if desc^.calldesc.calltype=DISPATCH_PROPERTYPUT then - inc(namedcount) - else - NamedArguments:=@desc^.CallDesc.ArgTypes[desc^.CallDesc.ArgCount]; - dispparams.cNamedArgs:=namedcount; - dispparams.rgdispidNamedArgs:=pointer(NamedArguments); - flags:=0; invokeresult:=disp.Invoke( desc^.DispId, { DispID: LongInt; } GUID_NULL, { const iid : TGUID; } |
