[python-win32] win32com, server/policy.py bug? policy.py Line 639

Mark Hammond mhammond at skippinet.com.au
Mon Apr 17 08:14:31 EDT 2023


On 16/4/2023 11:48 pm, Wuping Xin wrote:
> A better fix is to change Line 639 of win32com/server/policy.py to the 
> following:
>
>                     import inspect
>                     if len(inspect.getfullargspec(func).args) == 1:
>                         return func()
>                     else:
>                         return func(*args)
>
> Then we can make VBA, Delphi, C++ .... all clients happy.
>
> Agree? Should I submit a pull request?

I'm not sure ATM - I'd be quite surprised if there was a bug in COM 
functions with no args, so it may be more subtle than that. But you 
should certainly get either a PR or issue on github for this, ideally 
with a complete repro. It might be quite some time (ie, many weeks) 
before I can look at this in more detail.

Thanks,

Mark


>
> Wuping
>
> ------ Original Message ------
> From "Wuping Xin" <wuping at caliper.com>
> To "Mark Hammond" <mhammond at skippinet.com.au>
> Cc "Python-win32 at python.org" <Python-win32 at python.org>
> Date 4/16/2023 9:28:48 AM
> Subject win32com, server/policy.py bug? policy.py Line 639
>
>> For the following code, the method "GetPerson" has no explicit 
>> argument (except self).
>> classMyCOMObject:
>> _public_methods_=["GetPerson"]
>> #_reg_clsid_ = '{44ee76c7-1290-4ea6-8189-00d5d7cd712a}'
>> #_reg_desc_ = "My COM server"
>> #_reg_progid_ = "MyCOMObject"
>> defget_person(self):
>> person=Person("haha",45)
>> wrapped=win32com.server.util.wrap(person,useDispatcher=my_dispatcher)
>> returnwrapped
>> When calling from VBA, like below , it works fine.
>>     Set o = CreateObject("MyCOMObject")
>>     Set p = o.get_person()
>> However, when calling from C++, or Delphi, the following error will 
>> be thrown:
>> /"TypeError: MyCOMObject.get_person() takes 1 positional argument but 
>> 2 were given"/
>> //
>> Delphi code:
>> /procedure TForm1.Button1Click(Sender: TObject); /
>> /var /
>> /  o: OleVariant; /
>> /  p: OleVariant; /
>> /begin /
>> /  o := CreateOleObject('MyCOMObject'); /
>> /*p := o.get_person()*; // error will be thrown /
>> /  s := p.name; /
>> /  age := p.age; /
>> /  ShowMessage(s); /
>> /end;/
>> //
>> The fix is to change Line 639 of policy.py to the following:
>> iflen(args)==1and(args[0]==-2147352572orargs[0]==None):
>> returnfunc()
>> else:
>> returnfunc(*args)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.python.org/pipermail/python-win32/attachments/20230417/9765b5fd/attachment.html>


More information about the python-win32 mailing list