Skip to content

Commit

Permalink
split DISPPARAMS instantiation in IDispatch.Invoke method with `_…
Browse files Browse the repository at this point in the history
…_make_dp` method (#485)
  • Loading branch information
junkmd authored Jun 5, 2023
1 parent 94b81af commit 62ce303
Showing 1 changed file with 15 additions and 24 deletions.
39 changes: 15 additions & 24 deletions comtypes/automation.py
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,20 @@ def _invoke(self, memid: int, invkind: int, lcid: int, *args: Any) -> Any:
self.__com_Invoke(memid, riid_null, lcid, invkind, dp, var, None, argerr)
return var._get_value(dynamic=True)

def __make_dp(self, _invkind: int, *args: Any) -> DISPPARAMS:
array = (VARIANT * len(args))()
for i, a in enumerate(args[::-1]):
array[i].value = a
dp = DISPPARAMS()
dp.cArgs = len(args)
dp.rgvarg = array
if _invkind in (DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF): # propput
dp.cNamedArgs = 1
dp.rgdispidNamedArgs = pointer(DISPID(DISPID_PROPERTYPUT))
else:
dp.cNamedArgs = 0
return dp

def Invoke(self, dispid: int, *args: Any, **kw: Any) -> Any:
"""Invoke a method or property."""

Expand All @@ -857,33 +871,10 @@ def Invoke(self, dispid: int, *args: Any, **kw: Any) -> Any:
_lcid = kw.pop("_lcid", 0)
if kw:
raise ValueError("named parameters not yet implemented")

dp = self.__make_dp(_invkind, *args)
result = VARIANT()
excepinfo = EXCEPINFO()
argerr = c_uint()

if _invkind in (DISPATCH_PROPERTYPUT, DISPATCH_PROPERTYPUTREF): # propput
array = (VARIANT * len(args))()

for i, a in enumerate(args[::-1]):
array[i].value = a

dp = DISPPARAMS()
dp.cArgs = len(args)
dp.cNamedArgs = 1
dp.rgvarg = array
dp.rgdispidNamedArgs = pointer(DISPID(DISPID_PROPERTYPUT))
else:
array = (VARIANT * len(args))()

for i, a in enumerate(args[::-1]):
array[i].value = a

dp = DISPPARAMS()
dp.cArgs = len(args)
dp.cNamedArgs = 0
dp.rgvarg = array

try:
self.__com_Invoke(
dispid,
Expand Down

0 comments on commit 62ce303

Please sign in to comment.