summaryrefslogtreecommitdiff
path: root/packages/winunits-base/src/comobj.pp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/winunits-base/src/comobj.pp')
-rw-r--r--packages/winunits-base/src/comobj.pp31
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; }