我正在尝试从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
仍然为空。