Cライブラリであるlibupnpを利用するPythonアプリケーションに取り組んでいます。私は十分に簡単なライブラリを使用するために CTypes を使用しています。私が抱えている問題は、読み取り要求のコールバック関数を登録するときです。関数には、次の形式のプロトタイプがあります。
int read_callback(void *pFileHandle, char *pBuf, long nBufLength);
pFileHandle は、単なるファイル ハンドル タイプです。pBuf は、書き込み可能なメモリ バッファです。ここにデータが出力されます。nBufLength は、ファイルから読み取るバイト数です。ステータス コードが返されます。
これには Python 関数ポインタがあります。これは簡単に作成できましたが、このコールバックを処理する Python 関数を定義すると、Python 文字列は不変であり、割り当てまたは変更すると新しいインスタンスが作成されるため、pBuf が書き込まれないことがわかりました。関数が要求されたファイル データで終了すると、C ライブラリは char ポインターが返されることを期待しているため、これは大きな問題を引き起こします。ただし、Python 文字列が原因で、バッファは毎回空になります。C ライブラリを変更せずにこれを回避する方法はありますか?
ハンドラーは、指定されたバッファーパラメーターを変更する必要がありますが、これは私の問題です。
したがって、私が実現したいのは、Python 関数が呼び出されてファイルの読み取りを実行することです (メモリ内、ファイル システム ハンドル、またはその中間にある可能性があります)。pBuf パラメーターは、ストリームの読み取りによって入力されます (これも Python で)。その後、コールバックは、pBuf に書き込まれた C コードに戻ります。