如何从C类中告知/强制转换for C++接口的实例

how to tell/cast instance of for C++ interfaces from within a C class

本文关键字:for 转换 C++ 接口 实例      更新时间:2023-10-16

我知道windows"directshow"标头既有C++类定义,也有它们的"C"结构等价物。

我的问题是,如果我调用了一个C++方法(在本例中来自C-ffmpeg),它给我返回了一个类,我如何确定传递给我的对象是否通过了各种接口的"是"测试?如何将其转换为各种接口方法?如果这有道理的话。(全部来自直线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/

谢谢!

基本上,我不会。我要做的是用C++编写一个适配器层,为C++框架提供一个C友好的接口。

如果您正在处理COM对象,那么您可以使用QueryInterfacehttp://www.codeproject.com/Articles/13601/COM-in-plain-C

在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());
}

在某种程度上,我可以说,只有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友好的接口。