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 结构中。
类内的成员排列是实现定义的,因此根据某些顺序复制成员数据的一些黑客攻击失败了。

但是,在一些旧的技巧中,如果你想从课堂的公共部分检索重要的东西,建议你做一个 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 回答