我正在尝试将由我的相机制造商提供给C++的COM Interop指令转换为C#。C#COM Interop:如何翻译来自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 2010-08-24 10:39:18
@VinayC:你说得对,谢谢!那么我会研究那个包装。所以我猜测,以“CComQIPtr”开头的那一行并不是那么糟糕。 =)也许发布这个答案,所以我可以接受它。 – Jens 2010-08-24 11:02:10
您始终可以将评论标记为好。但是,您可能需要考虑Grzenio的解决方案 - 它将解决您的许多难题! – VinayC 2010-08-24 11:10:22