On 13/01/2016 6:09 AM, Alexander Jewell wrote:
I should have checked the setup file before attaching, that's actually
from a third test I ran that tried running an EXE.
In my earlier test I had create_dll = True.
During that test I ran "regsvr32 overlays.dll" (with terminal running as
Administrator) and got a success message, but no registry entries were
added and none of the logging present in the class was triggered, so it
didn't run the main method in the provided script or instantiate the class.

Am I mistaken in thinking that regsvr32 of the DLL replaces the use of
win32com.server.register.UseCommandLine? Do I actually need both?

No - the regsvr32 should be all that is necessary. Because you are in a py2exe world, the file ./py2exe/py2exe/boot_com_servers.py is used to perform the registration - some diagnostics there should help.

So I would need to:
Run the python script which writes the overlay handler GUID to the
registry and calls win32com.server.register.UseCommandLine
Run (with elevated privileges) regsvr32 to register the DLL
Restart explorer.exe process so that Explorer picks up the overlays

Is this correct?

It should be possible to do without an explicit script, executing regsvr32 in an elevated process should be all you need. I think it will also be possible to avoid restarting explorer (there's some win32com.shell function you can call IIRC) but for now, you should just focus on getting the registration working (ie, to see the registry entries being written) and then seeing your extension work when manually restarting explorer.

Mark


If so, I would have to ship both the script and the DLL build from the
script, which shouldn't be a problem; I guess I just assumed that having
two copies of the same code was incorrect.

Thanks for bearing with me
Alex

On Mon, Jan 11, 2016 at 5:43 PM, Mark Hammond <mhamm...@skippinet.com.au
<mailto:mhamm...@skippinet.com.au>> wrote:

    setup_2.py has:

    > setup(console=['overlays.py'])

    So that's going to create a console program with no COM support.
    setup.py has:

    >        # specify which type of com server you want (exe and/or dll)
    >        create_exe=True,
    >        create_dll=False

    So you are only going to get a COM object that can be created as a
    .exe. Explorer wants only inproc objects (ie, those hosted in a
    DLL), so you want create_dll=True and create_exe=False - you should
    then get a DLL you can register with regsvr32.

    HTH,

    Mark



    On 12/01/2016 4:44 AM, Alexander Jewell wrote:

        Hi Mark,

        I followed your suggestion and the SO threads touching on this area.
        
(http://stackoverflow.com/questions/4619701/python-64-bit-dll-com-server-registration-problem-on-64-bit-windows-7)
        Using py2exe I generated a dist folder with an exe of my overlay
        script.
        Running this on a machine without Python installed shows all of the
        proper log messages being generated and registry entry created
        for my
        overlay handler, however there's no indication that explorer is
        loading
        and running the overlay handler.

        Following the SO examples I instead generated a COM DLL from the
        same
        source. I can copy this dist directory and new DLL over to a machine
        without Python and use regsrv32 to register the DLL without
        errors, but
        it doesn't run the main method which is what sets the required
        registry
        entries and calls UseCommandLine so it doesn't look like it's being
        registered correctly at all.

        Sorry for the newb questions, but I seem to have a big gap in my
        understanding of the mechanism.

        So, the way that I'm using it at least, py2exe is either
        generating an
        EXE that will register correctly but not provide a COM object
        with the
        correct environment for explorer to run the overlay handler, or
        a DLL
        that should be self contained and functional but not provide the
        registration functionality.

        I've attached my primary script (Overlay Handler + logging and some
        helper objects) as well as 2 py2exe setup scripts I've tried.

        I'm hoping you can point out a huge flaw in my thinking, or an
        obvious
        step that I'm missing in the registration process.

        Thanks again for any help you can provide.


        On Fri, Jan 8, 2016 at 3:30 PM, Alexander Jewell
        <balexjew...@gmail.com <mailto:balexjew...@gmail.com>
        <mailto:balexjew...@gmail.com <mailto:balexjew...@gmail.com>>>
        wrote:

            I created a fresh Python 2.7 environment with pywin and
        py2exe and
            stripped down my overlay handler to the basics to better
        troubleshoot.

            Running my script (command line or in PyCharm) registers
        everything
            correctly, just like before, but running the py2exe
        generated EXE
            seems to be registering but no overlays are appearing, which
        looks
            just like what happens when I restarted explorer.exe in my
        previous
            attempt (logged messages during registration, plus a manual
        check of
            the registry look good but nothing generated by IsMemberOf.

            I'm going to try generating a DLL and manually registering
        following
            the example
            here:
        
http://stackoverflow.com/questions/4619701/python-64-bit-dll-com-server-registration-problem-on-64-bit-windows-7

            It looks like this example came out of a mail thread with
        you back
            in 2011 so I'll try to follow the advice there and report back.

            Thanks again for the help Mark.

            On Wed, Jan 6, 2016 at 7:19 PM, Mark Hammond
            <mhamm...@skippinet.com.au
        <mailto:mhamm...@skippinet.com.au>
        <mailto:mhamm...@skippinet.com.au
        <mailto:mhamm...@skippinet.com.au>>> wrote:

                On 7/01/2016 6:21 AM, Alexander Jewell wrote:

                    Unfortunately my end goal was to bundle the entire
                    application as an exe
                    with PyInstaller so that the end user does not
        actually have
                    Python
                    installed.

                    Do you think it would be possible to package the overlay
                    handler in such
                    a way that explorer would not need access to an
        installed Python
                    interpreter?

        Embedding(https://docs.python.org/3.4/extending/embedding.html)
                    seems
                    to still require a Python interpreter but Cython sounds
                    promising.


                I've used py2exe for this in the past and it works fine
        - you
                need to end up with a stand-alone directory that functions
                independently of any installed Python - py2exe bundles
        Python
                itself, pywin32, etc in just this way. Last I tried
        though, it
                only worked with python 2.x

                Mark


                    -Alex

                    On Wed, Jan 6, 2016 at 5:37 AM, Mark Hammond
                    <skippy.hamm...@gmail.com
        <mailto:skippy.hamm...@gmail.com>
        <mailto:skippy.hamm...@gmail.com <mailto:skippy.hamm...@gmail.com>>
                    <mailto:skippy.hamm...@gmail.com
        <mailto:skippy.hamm...@gmail.com>

                    <mailto:skippy.hamm...@gmail.com
        <mailto:skippy.hamm...@gmail.com>>>> wrote:

                        My guess is that the environment (eg, PATH,
        PYTHONPATH
                    etc) for the
                        new explorer instance isn't setup correctly -
        how is the
                        explorer.exe process started when it *does*
        work? It's
                    hard to
                        answer without more info, but Python ends up inside
                    explorer.exe, so
                        the environment that explorer.exe starts with is
        important.

                        Mark

                        On 6/01/2016 8:29 AM, Alexander Jewell wrote:

                            So, thanks to the Tim Golden guide


        
<http://timgolden.me.uk/python/win32_how_do_i/add-my-own-icon-overlays.html>


        
(http://timgolden.me.uk/python/win32_how_do_i/add-my-own-icon-overlays.html)
                            and
                            other questions


        
<http://stackoverflow.com/questions/4775020/icon-overlay-issue-with-python#>
                            on
                            Stack Overflow I have a script that will show
                    overlays on files and
                            folders based on their "state" similar to
        Tortoise
                    SVN or
                            Dropbox. Works
                            great.

                            My problem is that once I restart the
        explorer.exe
                    process or the OS
                            itself and open explorer there are no longer any
                    overlays.

                            My first thought:

                              * Have the service that actually manages file
                    state detect that no
                                requests have come in and just
        re-register the
                    overlay handler

                            The problem here is that registration requires
                    elevated permissions
                            which is acceptable on initial install of the
                    application by the end
                            user but not every time they restart their
        machine.

                            Can anyone suggest what I might be missing
        here? I
                    have the class
                            BaseOverlay and its children in a single .py
        file
                    and register
                            from my
                            main app by calling this script using
        subprocess.



        |subprocess.check_call("C:\scripts\register_overlays.py",shell=True)|

                            Is Explorer not able to re-load the script
        as it is
                    Python? Do I
                            need to
                            compile into a DLL or EXE? Would that change the
                    registration
                            process?

                            Here's the registration call:


        |win32com.server.register.UseCommandLine(BaseOverlay)|

                            Here's the class(simplified):

                            |classBaseOverlay:_reg_clsid_

        ='{8D4B1C5D-F8AC-4FDA-961F-A0143CD97C41}'_reg_progid_
                            ='someoverlays'_reg_desc_ ='Icon Overlay
                    Handler'_public_methods_


        =['GetOverlayInfo','GetPriority','IsMemberOf']_com_interfaces_


        
=[shell.IID_IShellIconOverlayIdentifier]defGetOverlayInfo(self):returnicon_path,0,shellcon.ISIOI_ICONFILE


        
defGetPriority(self):return50defIsMemberOf(self,fname,attributes):returnwinerror.S_OK|

                            Thanks for any help you can provide,

                            Alex Jewell




                            _______________________________________________
                            python-win32 mailing list
                            python-win32@python.org
        <mailto:python-win32@python.org>
                    <mailto:python-win32@python.org
        <mailto:python-win32@python.org>>
                    <mailto:python-win32@python.org
        <mailto:python-win32@python.org>
                    <mailto:python-win32@python.org
        <mailto:python-win32@python.org>>>

        https://mail.python.org/mailman/listinfo/python-win32








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

Reply via email to