python弹出提示框 ctypes_Python ctypes:使用函数poin时出现窗口错误

在使用Python的ctypes模块处理Dokan(一个用户空间文件系统)的DLL时,作者遇到一个窗口错误,涉及作为函数指针传递的函数调用。错误表现为‘access violation reading’,且只偶尔出现。作者怀疑是64位操作系统下函数指针类型的不足导致,但无法确定解决方案。已尝试内存探查器和查阅相关资源,但问题仍未解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试图使用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)。这些要么是结构,要么是指向结构的指针,为了简洁起见,我没有包括这些结构。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值