【问题标题】:What ctypes types to use with WORD and DWORD definitions与 WORD 和 DWORD 定义一起使用的 ctypes 类型
【发布时间】:2018-01-25 09:55:49
【问题描述】:

我必须将用 C 编写的 DLL 包装到 Python 中。为此,我使用了ctypes 模块。

但是,一些 C 函数使用 WORDDWORD 类型。我已经阅读了一些关于这些类型的帖子,但我无法理解两者之间的确切区别,以及为它们选择什么ctypes

仅供参考,我在 64 位 Windows 机器上工作。

【问题讨论】:

    标签: python dll ctypes


    【解决方案1】:

    ctypes 定义了一些 Windows 常量,因此您可以直接使用正确的类型而无需猜测:

    >>> from ctypes import wintypes
    >>> wintypes.DWORD
    <class 'ctypes.c_ulong'>
    >>> wintypes.WORD
    <class 'ctypes.c_ushort'>
    

    完整列表:

    >>> dir(wintypes)
    ['ATOM', 'BOOL', 'BOOLEAN', 'BYTE', 'CHAR', 'COLORREF', 'DOUBLE', 'DWORD', 'FILETIME', 'FLOAT', 'HACCEL', 'HANDLE', 'HBITMAP', 'HB
    RUSH', 'HCOLORSPACE', 'HDC', 'HDESK', 'HDWP', 'HENHMETAFILE', 'HFONT', 'HGDIOBJ', 'HGLOBAL', 'HHOOK', 'HICON', 'HINSTANCE', 'HKEY'
    , 'HKL', 'HLOCAL', 'HMENU', 'HMETAFILE', 'HMODULE', 'HMONITOR', 'HPALETTE', 'HPEN', 'HRGN', 'HRSRC', 'HSTR', 'HTASK', 'HWINSTA', '
    HWND', 'INT', 'LANGID', 'LARGE_INTEGER', 'LCID', 'LCTYPE', 'LGRPID', 'LONG', 'LPARAM', 'LPBOOL', 'LPBYTE', 'LPCOLESTR', 'LPCOLORRE
    F', 'LPCSTR', 'LPCVOID', 'LPCWSTR', 'LPDWORD', 'LPFILETIME', 'LPHANDLE', 'LPHKL', 'LPINT', 'LPLONG', 'LPMSG', 'LPOLESTR', 'LPPOINT
    ', 'LPRECT', 'LPRECTL', 'LPSC_HANDLE', 'LPSIZE', 'LPSIZEL', 'LPSTR', 'LPUINT', 'LPVOID', 'LPWIN32_FIND_DATAA', 'LPWIN32_FIND_DATAW
    ', 'LPWORD', 'LPWSTR', 'MAX_PATH', 'MSG', 'OLESTR', 'PBOOL', 'PBOOLEAN', 'PBYTE', 'PCHAR', 'PDWORD', 'PFILETIME', 'PFLOAT', 'PHAND
    LE', 'PHKEY', 'PINT', 'PLARGE_INTEGER', 'PLCID', 'PLONG', 'PMSG', 'POINT', 'POINTL', 'PPOINT', 'PPOINTL', 'PRECT', 'PRECTL', 'PSHO
    RT', 'PSIZE', 'PSIZEL', 'PSMALL_RECT', 'PUINT', 'PULARGE_INTEGER', 'PULONG', 'PUSHORT', 'PWCHAR', 'PWIN32_FIND_DATAA', 'PWIN32_FIN
    D_DATAW', 'PWORD', 'RECT', 'RECTL', 'RGB', 'SC_HANDLE', 'SERVICE_STATUS_HANDLE', 'SHORT', 'SIZE', 'SIZEL', 'SMALL_RECT', 'UINT', '
    ULARGE_INTEGER', 'ULONG', 'USHORT', 'VARIANT_BOOL', 'WCHAR', 'WIN32_FIND_DATAA', 'WIN32_FIND_DATAW', 'WORD', 'WPARAM', '_COORD', '
    _FILETIME', '_LARGE_INTEGER', '_POINTL', '_RECTL', '_SMALL_RECT', '_ULARGE_INTEGER', '__builtins__', '__cached__', '__doc__', '__f
    ile__', '__initializing__', '__loader__', '__name__', '__package__', 'ctypes', 'tagMSG', 'tagPOINT', 'tagRECT', 'tagSIZE']
    

    对于此列表中缺少的类型,请使用具有“转到定义”功能的良好 IDE 查阅标头。使用上面的预定义类型作为指导,这些类型通常很容易找出。

    【讨论】:

    • 非常感谢您的回答!太完美了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多