Sufficient conditions for COM local server to be singleton

Bill Bell bill-bell at
Wed Jun 20 14:38:09 EDT 2001

My essential question is: I had understood from reading previous 
discussions on this list that, by default, to make a COM local 
server fire up in only a single copy it is only necessary to declare 
"_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER". However, 
this doesn't seem to do the trick.

The following is a slightly altered version of the "Final Sample" 
server code from Chapter 12 of the Hammond & Robinson Win32 
book (O'Reilly).

from win32com.server.util import wrap, unwrap
import win32com.client, pythoncom
debugging = 0
if debugging:
    from win32com.server.dispatcher import DefaultDebugDispatcher
    useDispatcher = DefaultDebugDispatcher
    useDispatcher = None
class Parent:
    _public_methods_ = ['CreateChild', 'KissChild']
    _reg_clsid_ = "{41A0B351-A708-48c2-9E12-56C4291E0F42}"
    _reg_progid_ = "PythonDemos.Parent"
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER

    def __init__(self):
        import time
        self.StartTime = time.asctime()
    def CreateChild(self):
        child = Child()
        child.Name = self.StartTime
        print "Our Python child is ", child
        wrapped = wrap( child, useDispatcher=useDispatcher )
        print "Returning wrapped ", wrapped
        return wrapped
    def KissChild(self, child):
        print "KissChild called with child ", child
        dispatch = win32com.client.Dispatch(child)
        print "KissChild called with child named ", dispatch.Name
        child = unwrap(child)
        print "The Python child is ", child
class Child:
    _public_methods_ = []
    _public_attrs_ = ['Name']
    def __init__(self):
        self.Name = "Unnamed"
if __name__=='__main__':
    import win32com.server.register

I have just verified (using 'diff') that the only differences between this 
code and the original version of it are the following:

1. 'pythoncom' is imported (in order to have access to the constant 
mentioned at the beginning of this message).
2. 'debugging' is set to 0 (rather than 1, to switch off debugging)
3. different CLSID
4. _reg_clsctx_ is set as mentioned above
5. an __init__ is added to the Parent class to save instantiation 
time in an instance variable
6. CreateChild() sets name of child to Parent instantiation time.

When I inhibit complete execution of the following code (by setting 
a break on its final line in PythonWin) and run the same code 
meanwhile in a DOS box Parent is created twice, as evidenced by 
the different times for the names of the children.

import win32com.client, msvcrt, pythoncom

ParentObj = win32com.client.Dispatch("PythonDemos.Parent")

child = ParentObj.CreateChild()
print "DRIVECHAPTER12.PY: Child's name is ", child.Name
print "DRIVECHAPTER12.PY: I kissed my child"


My apologies for returning so often to this topic!

More information about the Python-list mailing list