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

Alexander Jewell balexjewell at gmail.com
Mon Jan 11 12:44:11 EST 2016


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>
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>
> 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>> 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>
>>>         https://mail.python.org/mailman/listinfo/python-win32
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20160111/6c8e7e0c/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: overlays.py
Type: text/x-python-script
Size: 4917 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-win32/attachments/20160111/6c8e7e0c/attachment-0003.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: setup_2.py
Type: text/x-python-script
Size: 451 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-win32/attachments/20160111/6c8e7e0c/attachment-0004.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: setup.py
Type: text/x-python-script
Size: 1181 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-win32/attachments/20160111/6c8e7e0c/attachment-0005.bin>


More information about the python-win32 mailing list