【发布时间】:2011-04-03 02:18:41
【问题描述】:
我正在尝试将我的相机制造商针对 C++ 提供的 COM 互操作指令翻译成 C#。
他们写道:
要获取接口,您可以使用普通的 COM 函数从捕获过滤器中请求您需要的特定接口。 例如:
IBaseFilter* pSourceFilter; ... CComQIPtr<IManufacturersInterface> pKs( pSourceFilter ); pKs->SetShutterSpeed( ssAuto1 );
它们还提供接口签名和 Guid。签名看起来像
interface IManufacturersInterface: IUnknown
{
// more stuff
HRESULT SetShutterSpeed( [in] eShutterSpeed lShutter );
// more stuff
}
我把它翻译成 C#
[ComImport]
[Guid("926ddb16-3c8e-476c-9068-eb4555a99231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IManufacturersInterface
{
// more stuff
[PreserveSig]
int SetShutterSpeed([In] eShutterSpeed lShutter);
// more stuff
}
从another source 我得到了一个类似的 DirectShow 包装器来访问相机,包括一个 COM 导入接口IBaseFilter。我现在如何翻译第一个例子?
我试过了
IManufacturersInterface control = sourceFilter as IManufacturersInterface; // sourceFilter is declared as IBaseFilter
control.SetShutterSpeed(eShutterSpeed.ssAuto1);
但转换后控制为空。
对不起,如果我含糊不清,我不知道我在这里做什么。这是我第一次不得不使用 COM Interop。它显示,嗯? =)
【问题讨论】:
-
不要使用 'as' 运算符,而是使用直接强制转换 - 它当然不会工作并给你一个例外。异常应该提供更多细节 - 我猜你正在使用的包装类不支持有问题的接口。
-
@VinayC:你是对的,谢谢!然后我会研究那个包装器。所以我猜想以“CComQIPtr”开头的那行是演员表并没有那么糟糕。 =) 也许把这个作为答案发布,所以我可以接受。
-
您可以随时将评论标记为良好。但是,您可能需要考虑 Grzenio 的解决方案 - 它会解决您的许多问题!
-
是的,CComQIPtr
将在分配时对 com 对象进行查询接口“转换” - 它也是一个托管对象,因此它将处理所有适当的添加/取消引用。
标签: c# c++ directshow com-interop