2016-05-20 14 views
0

私はPython ctypesライブラリをWindowsで使用し、OVERLAPPED構造体を実装しています。 ctypes.wintypesでは利用できないULONG_PTR型のメンバーが2人あります。 MicrosoftによるとULONG_PTRはポインタサイズに依存するULONGです。 PythonでULONG_PTRの代わりにwintypes.ULONGを使用できますか?それとも良い方法がありますか?ULONG_PTR in Python ctypes

ULONG_PTRとhere - LPVOIDの代わりにhere POINTER(ULONG))が使用されています。しかし、ULONG_PTRはポインタではないので、これは正しいタイプのものではありません。私が間違っている?私はLPVOIDを試してみましたが、うまくいきましたが、私はCの男ではないので、私の場合に違いはありますか?

+0

'POINTER(ULONG)'は間違っていて、明らかに '_PTR'接尾辞の誤解に由来します。推測する必要はありません。 MSDNの[データ型を調べる](https://msdn.microsoft.com/en-us/library/aa383751#ULONG_PTR) – eryksun

+0

これは私がこれらの例を見たときに私が考えていたものです。 _PTRはポインタではありません。私はwintypesでWPARAMを見逃してしまったので、ULONGを選択しました。今私は私が64ビットシステム上にあり、代わりにc_ulonglongが使用されているべきであるので、私も間違いを犯したことに気付きました。 WPARAMについてのあなたのコメントを答えに変えることができますか? – wombatonfire

+0

現在の回答は良いです。私は 'InternalHigh'のように' None'ではなく0値が必要な場合に 'c_void_p'を使うのが間違っていることを明確にしたかっただけです。また、 'WPARAM'を使うといくつかの行が保存されますが、最終結果は' c_ulonglong'と 'c_ulong'を条件付きで代入する答えのコードと同じです。 – eryksun

答えて

2

c_void_pまたはLPVOIDを使用してください。これはポインタのサイズに関係なく、InternalInternalHighのメンバーには決してアクセスしないので、実際のタイプは関係ありません。

POINTER(ULONG)を使用すると動作しますが、POINTER(c_char)または他のポインタ型も使用できます。型はまだ間違っていますが、実際には必要のない新しい型のオブジェクトを割り当てている点が異なります。

「正しい」タイプを使用して内部メンバーにアクセスする必要がある場合は、32ビット版と64ビット版のどちらのPythonを使用しているかによって、2つの異なるオーバーラップされた構造の1つを定義する必要があります。何かのように:

if ctypes.sizeof(ctypes.c_void_p) == 8: 
    ULONG_PTR = ctypes.u_longlong 
else: 
    ULONG_PTR = ctypes.u_long 

class OVERLAPPED(ctypes.Structure): 
    _fields_ = [("Internal", ULONG_PTR), 
       ("InternalHigh", ULONG_PTR), 
       ...] 
+1

タイプ 'getfunc'が' None'ではなく0を返す必要がある場合、 'c_void_p'を使うのは間違っています。 'getfunc'は、オブジェクト' value'、関数の結果、構造体フィールドと配列/ポインタインデックスへのアクセスに呼び出されます。整数の定義はより一般的には正しいです。 'ULONG_PTR = ctypes.wintypes.WPARAM'という別名を付けることができます。これは、ポインタのサイズに基づいて条件付きで定義されています。 – eryksun

+0

@Ross Ridge、あなたの答えに感謝します。私のシナリオで間違ったタイプが実行や正確さにどのように影響するかを詳しく説明できますか?私は技術的に彼らはすべて動作しますが、彼らはどのようにプログラムの動作を変更できますか? – wombatonfire

+1

@wombatonfire何らかの方法で内部メンバーにアクセスしない限り、プログラムの動作には影響しません。彼らは内部使用のみのため、あなたはそれらを設定するか、それらを読むことは想定されていません。内部メンバーにアクセスしない場合、これらのメンバーに十分なスペースを確保するタイプ(例えば、32ビットの場合は 'c_char * 4 ')が機能します。そのため、実装のバリエーションを見て、正しいサイズのものは実際には動作します。 –

関連する問題