1

link("parameters", &connection);文字列パラメーターを受け取り、接続を初期化するDLL (C 言語) の関数があります。

の呼び出しで初期化されたオブジェクトconnect(connection)である関数があります。 connectionlink()

Python 接続オブジェクトを関数connect()に引数として渡します

connection_t = ctypes.c_uint32
link = mydll.link
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t) )
connect = mydll.connect
connect.argtypes=(connection_t,)
...
connection = connection_t()
link ("localhost: 5412", ctypes.byref(connection))
...

しかし、'connection' オブジェクトを mydll ライブラリの他の関数に転送すると、関数は値を返しますが、その値は正しくありません。

func=mydll.func
status_t=ctypes.c_uint32
status=status_t()
func.argtypes=(ctypes.c_ulong,ctypes.POINTER(status_t))
result=func(connection, ctypes.byref(status))

この例result=0では、このコードの C バリアントでは、正しい値 (0 ではない) を受け取ります。

なんで?

4

1 に答える 1

0

C apis を説明するコメントに基づいて:

link(const char* set, conn_type* connection );
func(conn_type* connection, uint32_t* status);

func は接続タイプへのポインタを取るため、コードは次のようになります。

mydll=ctypes.CDLL('mydll')
connection_t = ctypes.c_uint32
link = mydll.link
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t) )
connection = connection_t()
link("localhost: 5412", ctypes.byref(connection))

func=mydll.func
status_t=ctypes.c_uint32
status=status_t()
func.argtypes=(ctypes.POINTER(connection_t),ctypes.POINTER(status_t))
result=func(ctypes.byref(connection), ctypes.byref(status))
于 2012-04-28T20:33:08.730 に答える