如何从C类中告知/强制转换for C++接口的实例
how to tell/cast instance of for C++ interfaces from within a C class
我知道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友好的接口。
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 如何将python的for循环转换为c++
- 转换为基本 for 循环
- 将 uint16 转换为 WMI Variant for CreateSnapshot 方法
- 内部 for 循环:将文本和 int 转换为 const char* 并传递给函数
- NAPI AsyncWorker:将指针数组转换为NAPI::array,而不使用大的for
- iostream GCC错误,转换为boost::filesystem::iostream for Windows
- 如何将 c++ 中的 for 循环转换为汇编程序
- 将此 C++ for 循环转换为汇编语言
- 将For循环的i转换为QString
- 如何从C类中告知/强制转换for C++接口的实例
- 奇怪的 LLVM 在 For 循环中无符号到有符号的转换
- 将while循环转换为等效的for循环
- 对于相互转换的类型,有没有办法绕过"deduced conflicting types for parameter in template instantiation"?
- 正在将for循环转换为OpenMP
- 将 MSVS 2010 项目转换为 MSVS 2012 RC,但出现错误"The C++ standard doesn't provide a hash for this type"
- 将项目转换为 qt5 并将未定义的引用转换为 'vtable for qt5 和 cmake
- 从嵌套的 for 循环转换为嵌套的 while 循环时出现问题
- 简单将 OpenMp Parallel for 转换为 C# Parallel for
- 将C++ FOR循环转换为德尔福