現在、次のライブラリ(http://sol.gfxile.net/escapi/)とctypesを使用してインターフェイスを構築しようとしていますが、何か間違っているかライブラリが期待通りに動作しないctypesの返り値の空値int配列へのポインタ
from ctypes import cdll, Structure, c_int, POINTER, cast, c_long, pointer
class SimpleCapParams(Structure):
_fields_ = [
("mTargetBuf", POINTER(c_int)),
("mWidth", c_int),
("mHeight", c_int)
]
width, height = 512, 512
array = (width * height * c_int)()
options = SimpleCapParams()
options.mWidth = width
options.height = height
options.mTargetBuf = array
lib = cdll.LoadLibrary('escapi.dll')
lib.initCOM()
lib.initCapture(0, options)
lib.doCapture(0)
while lib.isCaptureDone(0) == 0:
pass
print options.mTargetBuf
lib.deinitCapture(0)
:あなたはこれが私の現在のコードでこの
struct SimpleCapParams
{
/* Target buffer.
* Must be at least mWidth * mHeight * sizeof(int) of size!
*/
int * mTargetBuf;
/* Buffer width */
int mWidth;
/* Buffer height */
int mHeight;
};
のように見えますinitCapture
に渡すことを意味している構造体があり
(サンプルCアプリケーションが動作するように見えます) 0
しかし、mTargetBufのすべての値は0です。私はこれを間違って呼び出しているのでしょうか、何か他のことが起こっていますか?
これは私が(ASCIIなし)何をする必要があるかのC++の例である:https://github.com/jarikomppa/escapi/blob/master/simplest/main.cpp
例は '&capture'を通過します。だから、 'options'は値渡しではなく参照渡しが必要です。 'lib.initCapture(0、ctypes.byref(options))'です。 – eryksun
ありがとうございますが、依然として0を返すようです。options.mTargetBuf.contentsを実行すると 'c_long(0)'が返されます –
'initCapture'が失敗したかどうか、つまり0を返すかどうかを確認する必要があります。 'options.mTargetBuf'ではなく、配列がサイズ変更されているので安全です。 'options.mTargetBuf [i]'を使うと、配列を越えて読み込み、segfaultを起こすことができます。 – eryksun