クラスを定義するC++のコードをctypesから使いたい。
でもctypesでさわれるのはC言語の構造体まで。どうしよう。
とりあえずうまくいったのは、2段階でやる方法、すなわち、
C++のコードをラップするCのコードを書いて、それをctypesでさらにラップする方法。
コンストラクタ、デストラクタ、メソッドをラップするコードを書いてDLLを作る。
extern "C" {
void *MyClass_ctor(void) /* returns new instance */{ ... }
const char *MyClass_hogeMessage(void *pThis) { ... }
void MyClass_dtor(void *pThis) { ... }
}
さらに、Pythonのコードでこれをラップする。
mydll = ctypes.CDLL("hoge.dll")
class HogeClass(object):
def __init__(self):
self.v = ctypes.c_void_p(mylib.MyClass_ctor())
def hogeMessage(self):
return ctypes.c_char_p(mylib.MyClass_hogeMessage(self.v)).value
def __del__(self):
mylib.MyClass_dtor(self.v)
使うときには、
i = HogeClass()
print i.hogeMessage()
みたいにする。
まあ手間だけど、C言語からC++のコードを利用するときと同じだと思えば、これで満足すべきかなあ。
でもctypesでさわれるのはC言語の構造体まで。どうしよう。
とりあえずうまくいったのは、2段階でやる方法、すなわち、
C++のコードをラップするCのコードを書いて、それをctypesでさらにラップする方法。
コンストラクタ、デストラクタ、メソッドをラップするコードを書いてDLLを作る。
extern "C" {
void *MyClass_ctor(void) /* returns new instance */{ ... }
const char *MyClass_hogeMessage(void *pThis) { ... }
void MyClass_dtor(void *pThis) { ... }
}
さらに、Pythonのコードでこれをラップする。
mydll = ctypes.CDLL("hoge.dll")
class HogeClass(object):
def __init__(self):
self.v = ctypes.c_void_p(mylib.MyClass_ctor())
def hogeMessage(self):
return ctypes.c_char_p(mylib.MyClass_hogeMessage(self.v)).value
def __del__(self):
mylib.MyClass_dtor(self.v)
使うときには、
i = HogeClass()
print i.hogeMessage()
みたいにする。
まあ手間だけど、C言語からC++のコードを利用するときと同じだと思えば、これで満足すべきかなあ。