2017-09-28 11 views
1

構造体を定義するDLLがあります。この構造体内には、windows.hのように、タイプがCRITICAL_SECTIONのフィールドがあります。この型を参照するためにPythonでctypes構造体を定義するにはどうすればよいですか? CRITICAL_SECTIONはそれ自体が構造体(それ自身の定義で他の構造体への参照を持つ)なので、Pythonのctype等価物を定義しなければならないのですか?CRITICAL_SECTIONを参照できますか?より良い方法がありますか?未知のフィールドタイプのpython ctypes構造体を定義します。

例Cプログラム:

... 
typedef struct some_struct { 
    ... 
    CRITICAL_SECTION field1; 
} SOME_STRUCT; 
... 

例Pythonプログラム:

... 
class SOME_STRUCT(Structure): 
    _fields_ = [... ('field1', CRITICAL_SECTION)] 

私はctypesのはCRITICAL_SECTIONはまであらゆるものを定義するのウサギの穴を下に行かなくても何であるかを認識させるにはどうすればよいですctypesが認識するプリミティブ型?

+0

テストされていないが、Pythonの目的のため* xは'のsizeofであるX ' (CRITICAL_SECTION) 'で十分かもしれません。最終的な構造が正しいサイズであれば、それを不透明なバイト配列として扱うことができます。 –

+0

とにかく 'sizeof(CRITICAL_SECTION)'とは何ですか:D –

+0

@AnttiHaapalaはあなたのCコンパイラに質問します:^)それは40バイトでしたが、それは変わります。私は下のほうがうまくいっていたと思う。 –

答えて

1

トップレベルの構造体サイズを取得するだけで済みます。 InitializeCriticalSectionは、構造の設定を処理する必要があります。 Windowsのヘッダを見ると

が、これは32ビットと64ビットのシステム上で動作するはずです:c_ubyte `としてそれを定義し、

from ctypes import * 
from ctypes import wintypes as w 

# Set to an unsigned int type that is 32- or 64-bit depending on OS architecture. 
# I didn't see a wintype that worked. 
ULONG_PTR = c_size_t 

class CRITICAL_SECTION(Structure): 
    _fields_ = [('DebugInfo',w.LPVOID), 
       ('LockCount',w.LONG), 
       ('RecursionCount',w.LONG), 
       ('OwningThread',w.HANDLE), 
       ('LockSemaphore',w.HANDLE), 
       ('SpinCount',ULONG_PTR)] 

k32 = WinDLL('kernel32') 
InitializeCriticalSection = k32.InitializeCriticalSection 
InitializeCriticalSection.argtypes = POINTER(CRITICAL_SECTION), 
InitializeCriticalSection.restype = None 

s = CRITICAL_SECTION() 
InitializeCriticalSection(byref(s)) 
+0

返事をありがとう。これは私のために働いているようですが、実際にテストする時間がまだ必要です。私は戻ってくると私はそれが私の特定のアプリケーションで100%動作することを知って受け入れるだろう。 – zephyr

関連する問題