我试图使用Python的ctypes来处理DLL,但是当我试图调用作为指向另一个函数的指针传递的函数时,偶尔会遇到问题。在
一点背景知识…我正在尝试使用Dokan(版本0.6.0)构建一个用户空间文件系统。有点松散地说,Dokan基本上是Windows的FUSE。我已经用ctypes包装了dokan头文件(类似于pydokan)。该头文件包含函数指针的定义,如下所示typedef int (WINAPI *PFillFindData) (PWIN32_FIND_DATAW, PDOKAN_FILE_INFO);
它还包含另一个函数的原型
^{pr2}$
相应的ctypes定义如下所示PFillFindData = ctypes.WINFUNCTYPE(ctypes.c_int,
PWIN32_FIND_DATAW,
PDOKAN_FILE_INFO)
FindFilesWithPattern = ctypes.WINFUNCTYPE(ctypes.c_int,
ctypes.c_wchar_p,
ctypes.c_wchar_p,
PFillFindData,
PDOKAN_FILE_INFO)
后一个函数(findFileWithPattern)的实现必须调用传递给它的FillFindData函数。基本实现如下所示def FindFilesWithPattern(self,
FileName,
SearchPattern,
FillFindData,
DokanFileInfo):
if FileName == '\\':
File = WIN32_FIND_DATAW(FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY,
FILETIME(1, 1),
FILETIME(1, 1),
FILETIME(1, 1),
0,
len(self.HelloWorldText),
0,
0,
'Hello_World.txt',
'Hello_~1.txt')
pFile = PWIN32_FIND_DATAW(File)
FillFindData(pFile, DokanFileInfo)
return 0
else:
return -ERROR_FILE_NOT_FOUND
调用此函数时,有时会出现以下错误:Traceback (most recent call last):
File "_ctypes/callbacks.c", line 313, in 'calling callback function'
File "src/test.py", line 385, in FindFilesWithPattern
FillFindData(pFile, DokanFileInfo)
WindowsError: exception: access violation reading 0x0000000000000008
我很烦恼。乍一看,这似乎是我试图访问超出范围的内存。但这种错误只是偶尔发生。有时候一切都很好,结果会如期而至。我指的是,当我在程序上运行时,偶尔会出现一些错误。错误似乎在一次运行中发生或不一致。)
当时我在想,也许我得到的是一个错误代码,而不是一个内存地址。我发现here如果这是一个错误代码,那么它可能表示“内存不足”。当我看到系统监视器时,这似乎不是一个问题。我尝试过运行各种内存探查器,比如Heapy和{a6},但它们似乎都不能在64位Windows上使用Python2.7。在
我的下一个最佳猜测是使用64位操作系统时会出现问题。也许用于函数指针的类型不足以正确寻址它。在做了一些谷歌搜索之后,似乎其他人在Win64中使用ctypes时遇到了问题。我已经为64位体系结构构建了Dokan库。那么我的python代码有问题吗?在
任何帮助都将不胜感激。我已经挣扎了一段时间了。在
{a7}也有类似的帖子。不过,这看起来并不是很相似。在
注意:在python代码中,您将看到一些没有在这里定义的类型(例如PDOKAN_FILE_INFO)。这些要么是结构,要么是指向结构的指针,为了简洁起见,我没有包括这些结构。在