0

Windows の "directshow" ヘッダーには、C++ クラス定義と、それらに相当する "C" 構造体の両方があることを認識しています。

私の質問は、C++ メソッド (この場合は C--ffmpeg から) を呼び出してクラスが返された場合、渡されたオブジェクトがさまざまなインターフェイスの「is a」テストに合格したかどうかをどのように判断できますか? さまざまなインターフェイスメソッドにキャストするにはどうすればよいですか? それが理にかなっていれば。(すべてストレート C から)。

問題の例は、ffmpeg の dshow レイヤーが与えられた場合です: https://github.com/FFmpeg/FFmpeg/tree/master/libavdevice私は IPin にアクセスできます。今、それらを IAMBufferNegotiation にキャストしたい (それらがそのインターフェイスを実装している場合)この例では: http://sid6581.wordpress.com/2006/10/09/minimizing-audio-capture-latency-in-directshow/

ありがとう!

4

3 に答える 3

4

基本的に、私はしません。私がやりたいことは、C++ フレームワークへの C フレンドリーなインターフェースを提供する C++ でアダプター層を作成することです。

COM オブジェクトを扱っている場合は、QueryInterface http://www.codeproject.com/Articles/13601/COM-in-plain-Cを使用できます。

于 2012-08-20T22:57:52.023 に答える
1

C++ では、動的キャストを試みることができます。animalAtRandom()クラスのインスタンスへのポインターを返す関数を考えてみましょう。AnimalそれがクラスのインスタンスかどうかをテストしたいとしますDog

Animal *someAnimal = animalAtRandom();
Dog *rex = dynamic_cast<Dog *>(someAnimal);

if (rex == NULL)
{
    // this Animal is not a Dog
}
else
{
    // yay
}

純粋な C では、これは簡単ではありません。C++ コンパイラは、適切なオフセットに到達するためにいくつかのポインター演算を行うため、代わりに C++ ヘルパー関数を作成することをお勧めします。

extern "C" Dog *fetchFirstAnimalAsDog()
{
    return dynamic_cast<Dog *>(animalAtRandom());
}
于 2012-08-20T23:03:43.653 に答える
0

ある意味では、C++ がデータを C 構造体に転送するためのインターフェイスを提供するまで、効率的ではないと言えます。
クラス内のメンバー配置は実装定義であるため、何らかの順序に従ってメンバーのデータをコピーするハックは失敗します。

ただし、いくつかの古いハックでは、クラスの public セクションから重要なもののようなものを取得したい場合は、memcpy を実行することをお勧めします。

 memcpy(dest_c_struct,src_c_class_ret_from_function,size_define);

しかし、それは進歩的な性質のものをあなたに残すことはありません.

アップデート:

問題の例は、ffmpeg の dshow レイヤーが与えられた場合です: https://github.com/FFmpeg/FFmpeg/tree/master/libavdevice私は IPin にアクセスできます。今、それらを IAMBufferNegotiation にキャストしたい (それらがそのインターフェイスを実装している場合)この例では:

Cについて話しているのですか?? IPin インターフェイスを IAMBufferNegotiation にキャストしていますか??

私が正しく理解していれば、C であるインターフェイス タイプを別のインターフェイスにキャストすることはできません。実際、C にはインターフェイスがありません。唯一の方法は、C++ に戻すか、アプリケーションで FFmpeg ライブラリへの C フレンドリー インターフェイスを提供することです。

于 2012-08-20T23:13:06.187 に答える