Thanks for the help Mark.

I further stripped down my example script, removing logging and anything
unnecessary.
Updated the setup.py to generate the DLL and ran py2exe (with elevated
perms, not sure that was necessary though).
Took the dist directory generated by py2exe to another machine with no
Python.
>From a command prompt with elevated perms registered using regsvr32.
Restarted explorer.exe manually.
And overlays are working.

Now I will try to slowly add back in all of the code I removed, but at
least I have a base which I know works.

Thanks again.


On Tue, Jan 12, 2016 at 6:45 PM, Mark Hammond <mhamm...@skippinet.com.au>
wrote:

> 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