Hi Kevin ,

Il 18/08/2011 17:10, Kevin Walzer ha scritto:
Hi all,

I'm working on a Tkinter app that is being deployed to Windows via py2exe for wrapping and InnoSetup for its installer. In order to provide a similar scripting capability to the app that is present in its Mac version, I've made the app a COM server using the examples from python-win32 code base.

I am running into two issues with the app that I would like some clarification on:

1. What is the best way to register the exe as a COM server? I'm using the code from the python-win32 extension to register the code dynamically, but on Windows 7 this requires administrator privileges--which means that the entire app must be run as an administrator (via a flag in py2exe). This works, but seems overkill. I understand from the list archives that there is no current built-in way to escalate UAC privileges for a single function, cf. to register the server. Is there another way to register the wrapped exe as a server, i.e. from the command line (regsvr32) during the installation phase?
For registering the com server we use innosetup with the following line
[Run]
Filename: "{app}\openclerk.exe"; Parameters: "/regserver"; WorkingDir: "{app}" ; StatusMsg: "Registering openclerk.exe ..."

2. I am testing the app via a simple vbscript with a create object() call and then running the command exported by the COM server. While my app launches, it blocks forever, and then eventually the Windows Scripting Host times out with an error ("couldn't create ActiveX object"). Any suggestions on how to debug this?

usually you get this error because you miss some reference into py2exe
the way that we use to trace this error is to try catch all com method even the __init__ and use the logging system:

here you get an example:

    def SetIntegration(self, integrationObject, activeEditor=""):
        """
            set the integration object
        """
        try:

        except:
            print_exc_plus()
            return E_FAIL
        return S_O

def print_exc_plus():
    """
        Print the usual traceback information, followed by a listing of
        all the local variables in each frame.
    """
    logging.error("*"*20)
    for m in sys.exc_info():
        logging.error(str(m))
    logging.error("*"*20)
    tb = sys.exc_info( )[2]
    while tb.tb_next:
        tb = tb.tb_next
    stack = [  ]
    f = tb.tb_frame
    while f:
        stack.append(f)
        f = f.f_back
    stack.reverse( )
    traceback.print_exc()
    logging.error( "Locals by frame, innermost last")
    for frame in stack:
        logging.error("Frame %s in %s at line %s" % (frame.f_code.co_name,
                                             frame.f_code.co_filename,
                                             frame.f_lineno))
        for key, value in frame.f_locals.items():
# we must _absolutely_ avoid propagating exceptions, and str(value)
            # COULD cause any exception, so we MUST catch any...:
            try:
                logging.error("\t%20s = %s"%(key ,str(value)))
            except:
                logging.error( "<ERROR WHILE PRINTING VALUE>")


Regards,
Matteo

I can find no obvious error in my code and the app does start up successfully, which tells me it's registered, but for some reason it locks up before it can run its command. (The app does pop up a dialog on startup, I don't know if that would have any effect or not.)

Thanks,
Kevin


_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32


Nessun virus nel messaggio.
Controllato da AVG - www.avg.com <http://www.avg.com>
Versione: 10.0.1392 / Database dei virus: 1520/3841 - Data di rilascio: 17/08/2011


_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to