[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