3

pinvoke を使用して C# で pocketphinxチュートリアルを実行しようとしていますが、ps_decode_raw() を使用してデコードしようとすると AccessViolationException が発生します。

        IntPtr ps = PocketSphinx.ps_init(config);
        IntPtr fh = Win32Util.fopen(@"goforward.raw", "rb");
        int rv = PocketSphinx.ps_decode_raw(ps, fh, "goforward", -1);

関数は次のようにラップされます

    //ps_decoder_t* ps_init(cmd_ln_t* config)
    [DllImport("pocketsphinx.dll",
        SetLastError = true,
        CallingConvention = CallingConvention.Cdecl)]
    public extern static IntPtr ps_init(
        IntPtr config);

    //int ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, char const *uttid, long maxsamps);
    [DllImport("pocketsphinx.dll",
        SetLastError = true,
        CallingConvention = CallingConvention.Cdecl)]
    public extern static int ps_decode_raw(
        IntPtr ps,
        IntPtr rawfh,
        [MarshalAs(UnmanagedType.LPStr)] string uttid,
        int maxsamps);

    [DllImport("msvcrt.dll",
        SetLastError = true,
        CallingConvention = CallingConvention.Cdecl)]
    public extern static IntPtr fopen(
        [MarshalAs(UnmanagedType.LPStr)] string _Filename,
        [MarshalAs(UnmanagedType.LPStr)] string _Mode);

C の fopen もラップしました。これがチュートリアルを実装する最も簡単な方法だったからです。

ps で cmd_ln_retain を呼び出して、ps が問題の原因ではないことを確認してみました。(そうではありませんでした)。上記のデバッグコードも削除しました。

fopen に何か問題があることは確かですが、何が原因かはわかりません。

誰かがポケットフィンクスのログを要求しました. https://justpaste.it/h52t

4

1 に答える 1

2

どこでもエラーをチェックしません。SetLastErrorそして、これらの関数を trueに設定するのは間違っています。彼らは電話をかけませんSetLastError

ただし、大きな問題は、ライブラリがビルド方法に応じて、C ランタイムの特定のインスタンスを使用することです。また、fopenインポートは C ランタイムの別のインスタンスからのものです。

オブジェクトを作成および破棄する関数を公開するライブラリにコードを追加する必要がありFILE*ます。そうすることでFILE*、正しいランタイムによって作成されます。

于 2014-09-18T05:42:06.463 に答える