Python COM iterator

Carsten Haese carsten at uniqsys.com
Wed Apr 18 23:49:05 EDT 2007


>[...]
> > On Tue, 2007-04-17 at 16:54 -0500, Larry Bates wrote:
> >> Does anyone know if there is a way to make a Python COM object
> >> act like a proper iterator in VB/Delphi?
>[...]

After more googling, staring at win32com's code, and a fair bit of trial
and error, I've come up with the following working example:

# server.py
import pythoncom

class HelloWorld:
    _reg_clsid_ = "{CAB8BED1-9174-4AAD-ABC5-F377951CB71B}"
    _reg_desc_ = "Python Test COM Server"
    _reg_progid_ = "Python.TestServer"
    _public_methods_ = ['Next']
    _com_interfaces_ = [pythoncom.IID_IEnumVARIANT]
    
    def __init__(self):
        self.numbers=[1,2,3,4,5,6,7,8]

    def Next(self, count):
        assert count==1
        try:
            return (self.numbers.pop(0),)
        except IndexError:
            return ()
    
    def _NewEnum(self):
        import win32com.server.util
        return win32com.server.util.wrap(self)

if __name__=='__main__':
  import win32com.server.register 
  win32com.server.register.UseCommandLine(HelloWorld)
  
# client.py
import win32com.client
comobj = win32com.client.Dispatch("Python.TestServer")
for x in comobj:
    print x

This works for me on Python 2.5 and pywin32 Build 210, but I don't know
whether clients in VB or Delphi are able to use this iterator.

-Carsten





More information about the Python-list mailing list