代码之家  ›  专栏  ›  技术社区  ›  user5530332

Ctypes CopyFileA不工作

  •  1
  • user5530332  · 技术社区  · 7 年前

    我正在学习这些教程 here 其中,调用windows API的CopyFile函数对我来说根本不起作用。这是我正在使用的代码(刚刚更改了用户名)

    from ctypes import *
    CopyFile = windll.kernel32.CopyFileA
    CopyFile("C:\Windows\System32\calc.exe", "C:\\Users\legion\Desktop\calc.exe", False)
    

    我尝试更改参数、文件路径,我尝试将同一个文件更改为同一个目录,将False更改为True,这样可能会出现错误或提示文件已经存在。它就是不起作用。如果您没有使用过Ctypes(像我一样),并且不知道答案,请在您的机器上尝试并尝试此代码段。

    1 回复  |  直到 7 年前
        1
  •  0
  •   CristiFati    6 年前

    1号 st公司 我看到的是 反斜杠 不会转义路径中的。在这种情况下,这不会是一个问题,但最好总是避开它们。

    我修改了你的代码( 代码0.py ):

    #!/usr/bin/env python3
    
    import sys
    import os
    from ctypes import windll
    
    
    if __name__ == "__main__":
        print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
        src = r"C:\Windows\System32\calc.exe"
        dst = os.path.join(os.getcwd(), "calc.exe")  # Change this to your original path
    
        kernel32_dll = windll.kernel32
    
        copy_file_a = kernel32_dll.CopyFileA
    
        copy_file_w = kernel32_dll.CopyFileW
    
        reta = copy_file_a(src, dst, False)
        retw = copy_file_w(src, dst, False)
    
        print("CopyFileA returned: {:d}\nCopyFileW returned: {:d}\n".format(reta, retw))
    

    输出 :

    E:\Work\Dev\StackOverflow\q048927571>"e:\Work\Dev\VEnvs\py27x64_test\Scripts\python.exe" code0.py
    Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
    
    CopyFileA returned: 1
    CopyFileW returned: 0
    
    E:\Work\Dev\StackOverflow\q048927571>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code0.py
    Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
    
    CopyFileA returned: 0
    CopyFileW returned: 1
    

    笔记 :

    • 根据 [MS.Docs]: CopyFile function :

      如果函数成功,则返回值为非零。

    • 我添加了 CopyFileW 混合中
    • 根据输出, CopyFileA 故障原因 Python 3 (我发现这是你的情况),并且 CopyFileW 故障原因 Python 2 .
      这是因为 Python 2 ,字符串为 8比特 ( char * 基于),而在 Python 3 他们是 Unicode ( 16位 ( wchar_t * 基于)基于 )
    • ANSI标准 ( A. )函数的版本与 宽的 ( W )版本,建议使用后者

    我们有失败的原因,但我们还没有完全做到。这里有一个更详细的例子( 代码1.py ):

    #!/usr/bin/env python3
    
    import sys
    import os
    from ctypes import windll, c_char_p, c_wchar_p, c_int
    
    
    if __name__ == "__main__":
        print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
        src = r"C:\Windows\System32\calc.exe"
        dst = os.path.join(os.getcwd(), "calc.exe")
    
        kernel32_dll = windll.kernel32
    
        copy_file_a = kernel32_dll.CopyFileA
        copy_file_a.argtypes = (c_char_p, c_char_p, c_int)
        copy_file_a.restype = c_int
    
        copy_file_w = kernel32_dll.CopyFileW
        copy_file_w.argtypes = (c_wchar_p, c_wchar_p, c_int)
        copy_file_w.restype = c_int
    
        reta = copy_file_a(src.encode(), dst.encode(), False)
        retw = copy_file_w(src, dst, False)
    
        print("CopyFileA returned: {:d}\nCopyFileW returned: {:d}\n".format(reta, retw))
    

    笔记 :

    输出 :

    E:\Work\Dev\StackOverflow\q048927571>"e:\Work\Dev\VEnvs\py27x64_test\Scripts\python.exe" code1.py
    Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
    
    CopyFileA returned: 1
    CopyFileW returned: 1
    
    E:\Work\Dev\StackOverflow\q048927571>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code1.py
    Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
    
    CopyFileA returned: 1
    CopyFileW returned: 1