Eryk Sun added the comment:

On second thought, it occurred to me that the problem isn't in Explorer or 
shell32, but in the drop handler. It turns out the problem is that the drop 
handler calls the ANSI API DragQueryFileA instead of DragQueryFileW. To see 
this I attached a debugger to Explorer and set a breakpoint on 
shell32!DragQueryFileA:

    Breakpoint 0 hit
    SHELL32!DragQueryFileA:
    00007ffd`bed1a5b0 4883ec38        sub     rsp,38h
    0:056> k 3
    Child-SP          RetAddr           Call Site
    00000000`0ee3e0f8 00007ffd`b2c95b7a SHELL32!DragQueryFileA
    00000000`0ee3e100 00007ffd`bedade2e wshext!CWSHExtension::Drop+0x7a
    00000000`0ee3e300 00007ffd`bed9d547 
SHELL32!CDVDropTarget::_PerformDrop+0x14a

Note that the shell is deferring to the drop handler for the file type, which 
in our case is implemented by wshext.dll. 

The first DragQueryFileA call is to query the number of files (i.e. iFile == 
0xFFFFFFFF):

    0:056> r rdx
    rdx=00000000ffffffff
    0:056> g

The 2nd call gets the ANSI encoded filename:

    Breakpoint 0 hit
    SHELL32!DragQueryFileA:
    00007ffd`bed1a5b0 4883ec38        sub     rsp,38h
    0:056> r r8
    r8=000000000ee3e1a0
    0:056> pt; da ee3e1a0
    00000000`0ee3e1a0  "C:\Temp\A.txt"

The drop handler is set in the Python.File ProgId, which is defined in the 
installer in Tools/msi/launcher/launcher_reg.wxs, which configures the 
following registry entry:

    C:\>reg query HKLM\Software\Classes\Python.File\shellex\DropHandler

    HKEY_LOCAL_MACHINE\Software\Classes\Python.File\shellex\DropHandler
        (Default)    REG_SZ    {60254CA5-953B-11CF-8C96-00AA00B8708C}

As we previously saw in the stack trace, it's implemented by wshext.dll:

    C:\>reg query 
HKLM\Software\Classes\CLSID\{60254CA5-953B-11CF-8C96-00AA00B8708C} /s

    
HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{60254CA5-953B-11CF-8C96-00AA00B8708C}
        (Default)    REG_SZ    Shell Extension For Windows Script Host

    
HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{60254CA5-953B-11CF-8C96-00AA00B8708C}\InProcServer32
        (Default)    REG_SZ    C:\Windows\System32\wshext.dll
        ThreadingModel    REG_SZ    Apartment


I thought I could fix this easily by switching to the drop handler that batfile 
and exefile use:

    C:\>reg add HKLM\Software\Classes\Python.File\shellex\DropHandler /ve /d ^
    More? {86C86720-42A0-1069-A2E8-08002B30309D}
    Value  exists, overwrite(Yes/No)? y
    The operation completed successfully.

This gets the Unicode filename right, but when I move "Ā.txt" to a directory 
under "Program Files", I see that it uses short filenames in the path. 

    ['C:\\PROGRA~1\\Python35\\Ā.txt']

Is that acceptable?

----------
resolution: third party -> 
stage: resolved -> 
status: closed -> open

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue27469>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to