[python-win32] Have icon overlays persist after machine restart in Python

Mark Hammond mhammond at skippinet.com.au
Mon Jan 11 17:43:30 EST 2016


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 <balexjewell at gmail.com
> <mailto:balexjewell at 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
>     <mhammond at skippinet.com.au <mailto:mhammond at 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.hammond at gmail.com <mailto:skippy.hammond at gmail.com>
>             <mailto:skippy.hammond at gmail.com
>             <mailto:skippy.hammond at 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 at python.org
>             <mailto:python-win32 at python.org>
>             <mailto:python-win32 at python.org
>             <mailto:python-win32 at python.org>>
>                     https://mail.python.org/mailman/listinfo/python-win32
>
>
>
>
>



More information about the python-win32 mailing list