Использование msvcrt в 64-битных типах Python - PullRequest
2 голосов
/ 26 октября 2011

Я хочу вызывать функции msvcrt из 64-битного питона, используя пакет ctypes.Я явно делаю это неправильно.Правильный ли способ сделать это очевидным?

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 Ответ

5 голосов
/ 26 октября 2011

Тип результата ctypes по умолчанию - 32-битное целое число, а дескриптор файла - ширина указателя, т.е. 64-битная.Поэтому вы теряете половину информации в указателе файла.

Прежде чем вызывать fopen, вы должны указать, что тип результата является указателем:

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