Help, pls: COM local server factory class

Bill Bell bill-bell at bill-bell.hamilton.on.ca
Mon Jun 18 15:35:43 EDT 2001


Esteemed Pythonistas:

The code that appears below is intended to define a COM local 
server. (My understanding of some earlier messages on this list is 
that it should result in a singleton by default.)

There are two classes in the server, one of them being a factory for 
the other (and defined near the end of the code).

Two questions I'd appreciate answers to (bearing in mind I'm new to 
Python):

1. How close is the factory class to what I ~should~ be doing?

2. What is the meaning of the following?

>>> import win32com.client, msvcrt, pythoncom
>>> factory = 
win32com.client.Dispatch("WebPASS.ServerFactory1")
>>> server = factory.Factory()
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "<COMObject WebPASS.ServerFactory1>", line 2, in Factory
com_error: (-2147352567, 'Exception occurred.', (0, 'Python COM 
Server Internal Error', 'Unexpected Python Error: 
exceptions.TypeError: Objects for SAFEARRAYS must be 
sequences (of sequences), or a buffer object.', None, 0, -
2147467259), None)
>>> 

Thanks for any help you can render.

Bill

<SNIP wxPython stuff>
def GUI():
    try:
        WebPASSPath = os.path.split(__file__)[0]
        os.chdir(WebPASSPath)
    except:
        pass
    global app
    app = WebPASSApp(0)
    app.MainLoop()

from threading import Thread

class GUIThread(Thread):
    def _init_(self):
        Thread._init_(self)
    def run(self):
        GUI()

def main():
    t = GUIThread()
    t.start()
    time.sleep(5)
    app.frame.ReportActivity("... from main()")

class COMServer:
    _reg_clsid_ = "{D471BE26-C3C8-4773-B438-041BA612C563}"
    _reg_desc_ = "WebPASS COM Server"
    _reg_progid_ = "WebPASS.Server1"
    _public_methods_ = ['Report']
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    
    def __init__(self):
        main()

    def Report(self, msg):
        app.frame.ReportActivity("... from COMServer.Report(self) " + 
str(msg))

class COMServerFactory:
    _reg_clsid_ = "{ED8F1767-4035-4c20-8162-24C2EE9E380C}"
    _reg_desc_ = "WebPASS COM Server Factory"
    _reg_progid_ = "WebPASS.ServerFactory1"
    _public_methods_ = ['Factory']
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER

    def __init__(self):
        self.theCOMServer = None

    def Factory(self):
        if self.theCOMServer == None:
            self.theCOMServer = COMServer()
        return self.theCOMServer

if __name__ == '__main__':
    import win32com.server.register
    win32com.server.register.UseCommandLine(COMServer)
    win32com.server.register.UseCommandLine(COMServerFactory)





More information about the Python-list mailing list