1

私がアクセスする必要があるのは、メディア ファイルを再生、一時停止、および停止する機能だけであるため、LibVLC メディア ライブラリ用の非常にシンプルな超軽量の .Net ラッパーを作成しています。これについていくつかの質問を投稿し、いくつかの回答を得ましたが、残念ながら、さらに質問が残っています。

上から始めて、下に作業します。

ドキュメントには、最初に、この仕様で関数を呼び出して VLC を初期化する必要があると記載されています。

libvlc_instance_t* libvlc_new (int argc, const char *const *argv)

私は次のメソッドを定義しました:

[DllImport("libvlc", EntryPoint = "libvlc_new", 
CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr NewCore(int argc, IntPtr argv);

そして、私は次のように関数を呼び出しています:

private IntPtr Instance;
this.Instance = DGLibVLC.NewCore(0, IntPtr.Zero);

私はそれをいくつかの異なる方法で試しました。最初は、不均衡なスタックにつながっていた CallingConvention について知りませんでした。その問題は解決され、メソッドは何度か繰り返されましたが、どれも成功したとは証明されていません。つまり、メソッド呼び出しの後、IntPtr は常に 0 です。上記のように試してみString[] argcまし[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[]た。

LibVLC DLL ライブラリからこの関数を呼び出す正しい方法を知っている人はいますか?

編集:提案で、ライブラリのエラーメッセージ関数を呼び出してみました:

仕様:

const char* libvlc_errmsg (void)

実装:

[DllImport("libvlc", EntryPoint = "libvlc_errmsg", 
CallingConvention = CallingConvention.Cdcel)]
public static extern string GetLastError();

電話:

Console.WriteLine(DGLibVLC.GetLastError());

結果:

Null

ドキュメントには、エラーがない場合は Null を返すと記載されています。これは、最初の関数呼び出しNewCoreが正しく機能していたことを示しているに違いありませんが、何らかの形でまだ問題が発生しています。

すべてのベースをカバーするために、DLL がドキュメントと一致していることを確認しました。2.0.6.0。私が参照しているドキュメントはこちらです。

編集:エラーがないことを確認できます。ゼロに初期化された long 変数を使用して NewCore の結果を格納すると、何かが返されることがわかります。ここで私が間違っているのは、オブジェクトへのポインターを返すアンマネージ関数によって返されるポインターを格納しようとしているところです。返される不透明な構造参照へのポインタを格納するにはどうすればよいですか?

4

2 に答える 2

1

関数の呼び出し方法とは関係ありません。libvlc_new() から IntPtr.Zero を取得しても、どこにも到達できません。「エラーが発生しました」という意味です。最初にエラー報告に集中する必要があります。libvlc_errmsg() を呼び出して、問題の説明を取得してください。

于 2013-08-13T16:07:34.040 に答える