在64位Python ctypes中使用msvcrt

2 投票
1 回答
1607 浏览
提问于 2025-04-17 05:00

我想在64位的Python中使用ctypes这个包来调用msvcrt的函数。显然我做错了。正确的方法是不是很明显呢?

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> libc = ctypes.cdll.msvcrt
>>> fp = libc.fopen('text.txt', 'wb') #Seems to work, creates a file
>>> libc.fclose(ctypes.c_void_p(fp))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
WindowsError: exception: access violation reading 0xFFFFFFFFFF082B28
>>>

如果这段代码能达到我的目的,它应该能够打开和关闭一个文本文件,而不会崩溃。

1 个回答

6

默认情况下,ctypes的返回类型是32位整数,但文件句柄是指针宽度,也就是64位。所以你会丢失文件指针的一半信息。

在你调用fopen之前,必须先说明返回类型是一个指针:

libc.fopen.restype = ctypes.c_void_p
fp = libc.fopen(...)
libc.fclose(fp)

撰写回答