2011-10-25 12 views
2

ctypesパッケージを使用して64ビットのPythonからmsvcrt関数を呼び出したいとします。私は明らかに間違っている。それを明白にする正しい方法はありますか?このコードは、私が欲しいものをやった場合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 
>>> 

は、それが開かれ、クラッシュすることなく、テキストファイルを閉じているだろう。

答えて

5

デフォルトのctypes結果タイプは32ビット整数ですが、ファイルハンドルはポインタ幅、つまり64ビットです。したがって、ファイルポインタの情報の半分が失われています。

あなたは結果の型がポインタであることを述べる必要がありますはfopen呼び出す前:

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

ナイス!ありがとう!これは確かに問題でした。 – Andrew

関連する問題