在具有复杂结构的python中调用WinDLL不起作用

时间:2019-10-10 11:49:44

标签: ctypes

我正在尝试从Python调用WinDll,通常对于简单的函数可以正常运行。我的问题是我需要传递一个指向不起作用的复杂结构的指针。我无法定义WinDll函数的参数。

c中的函数声明和数据类型如下:

typedef struct VBLFileStatistics_t
{
    DWORD     mStatisticsSize;                   /* sizeof (VBLFileStatistics) */
    BYTE      mApplicationID;                    /* application ID */
    BYTE      mApplicationMajor;                 /* application major number */
    BYTE      mApplicationMinor;                 /* application minor number */
    BYTE      mApplicationBuild;                 /* application build number */
    ULONGLONG mFileSize;                         /* file size in bytes */
    ULONGLONG mUncompressedFileSize;             /* uncompressed file size in bytes */
    DWORD     mObjectCount;                      /* number of objects */
    DWORD     mObjectsRead;                      /* number of objects read */
} VBLFileStatistics;

( BOOL)   BLGetFileStatistics( HANDLE hFile, VBLFileStatistics* pStatistics);

加载并获取手柄可以正常工作。

import sys
import ctypes 
from ctypes import wintypes

GENERIC_READ         = wintypes.DWORD(0x80000000) 
INVALID_HANDLE_VALUE = -1 

class VBLFileStatistics(ctypes.Structure):
        _fields_ = [
        ("mStatisticsSize", wintypes.DWORD),
        ("mApplicationID", wintypes.BYTE),
        ("mApplicationMajor", wintypes.BYTE),
        ("mApplicationMinor", wintypes.BYTE),
        ("mApplicationBuild", wintypes.BYTE),
        ("mFileSize", ctypes.c_ulonglong),
        ("mUncompressedFileSize", ctypes.c_ulonglong),
        ("mObjectCount", wintypes.DWORD),
        ("mObjectsRead", wintypes.DWORD)]

lib = ctypes.WinDLL('myDll.dll')

#( HANDLE) BLCreateFile( LPCSTR lpFileName, DWORD dwDesiredAccess);
lib.BLCreateFile.restype  = wintypes.HANDLE
lib.BLCreateFile.argtypes = [wintypes.LPCSTR, wintypes.DWORD]

handle = lib.BLCreateFile(b'test.blf',GENERIC_READ)
    if(ctypes.c_int(handle).value == INVALID_HANDLE_VALUE):
        print("Error occured reading the file!!!")
        sys.exit()

#( BOOL)   BLGetFileStatistics( HANDLE hFile, VBLFileStatistics* pStatistics);
lib.BLGetFileStatistics.restype  = wintypes.BOOL
lib.BLGetFileStatistics.argtypes = [wintypes.HANDLE, ctypes.pointer(VBLFileStatistics)]

stats_obj = VBLFileStatistics()
success = lib.BLGetFileStatistics(handle, ctypes.pointer(stats_obj))

我收到以下错误消息:

Traceback (most recent call last):
  File "parser.py", line 104, in <module>
    lib.BLGetFileStatistics.argtypes = [wintypes.HANDLE, ctypes.pointer(VBLFileStatistics)]
TypeError: _type_ must have storage info

我还尝试将argtypes设置为空指针(wintypes.LPCVOID),然后将指针传递给stats_obj的{​​{1}},这不会导致错误,但是无法使用,因为通话后BLGetFileStatistics仍然为空。

0 个答案:

没有答案