0

Python から DLL の int の配列にアクセスしようとしています。ctypes ドキュメント ページのガイドラインに従っていますが、Null ポインター アクセス例外が発生します。私のコードは次のとおりです。

if __name__ == "__main__":
    cur_dir = sys.path[0]
    os.chdir(cur_dir)
    api = CDLL("PCIE_API")
    PciAgentIndex=POINTER(c_uint32).in_dll(api, "PciAgentIndex")
    print(PciAgentIndex)
    print(PciAgentIndex[0])

そして私は得る:

ValueError: NULL pointer access

最後の行を印刷するとき。

このコード スニペットを Eclipse デバッガーで実行し、PciAgentIndex の content 属性を確認すると、次のようになります。

str: Traceback (most recent call last):
  File "C:\Program Files\eclipse\plugins\org.python.pydev_2.7.5.2013052819\pysrc\pydevd_resolver.py", line 182, in _getPyDictionary
    attr = getattr(var, n)
ValueError: NULL pointer access

私は何を間違っていますか?私は Windows で Python 3.3.2 を使用しています。

4

1 に答える 1

4

ポインターと配列の違いを明確にするために、comp.lang.c FAQ の質問 6.2 をお読みくださいchar a[]char *a

DLL 内のデータからポインターを作成しています。どうやら、データは 4 つの null バイト (32 ビット Python) または 8 つの null バイト (64 ビット Python) で始まるようです。代わりに配列を使用します。

# for a length n array
PciAgentIndex = (c_uint32 * n).in_dll(api, "PciAgentIndex")

ポインターが必要な場合は、関数ポインターをキャストすることもできます。

PciAgentIndex = cast(api.PciAgentIndex, POINTER(c_uint32))

ctypes データ オブジェクトには、関連する C データのバッファへのポインタがあります。ポインターのバッファーは、Python が 32 ビットか 64 ビットかに応じて、4 バイトまたは 8 バイトです。配列のバッファは、要素のサイズに長さを掛けたものです。in_dllDLL 内のデータ範囲 (単なるコピーではない) をバッファーとして使用してインスタンスを作成するクラス メソッドです。

于 2013-08-09T11:37:56.517 に答える