summaryrefslogtreecommitdiff
path: root/packages/winunits-base
diff options
context:
space:
mode:
authorpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-19 09:28:54 +0000
committerpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-01-19 09:28:54 +0000
commita46d41bd77d585176dbf6dd0398fe8cc381d2328 (patch)
tree9f98a35a7fa4a6e7954b087581224201e36ffd09 /packages/winunits-base
parent70396add6e012463e139c4f24e7b720e7874cda4 (diff)
downloadfpc-a46d41bd77d585176dbf6dd0398fe8cc381d2328.tar.gz
comobj: fix DoDispCallByID. Now it works fine for DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYGET.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@14745 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/winunits-base')
-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; }