Re: win32com, server/policy.py bug? policy.py Line 639
Mark Hammond <[email protected]> Mon, 17 Apr 2023 22:14:31 +1000
| Newsgroups | gmane.comp.python.windows |
|---|---|
| Message-ID | <[email protected]> |
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" <[email protected]> > To "Mark Hammond" <[email protected]> > Cc "[email protected]" <[email protected]> > 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) _______________________________________________ python-win32 mailing list [email protected] https://mail.python.org/mailman/listinfo/python-win32