Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#COM互操作:如何翻译C++;? 我尝试将我的相机制造商提供的COM互操作指令翻译成C++。_C#_C++_Directshow_Com Interop - Fatal编程技术网

C#COM互操作:如何翻译C++;? 我尝试将我的相机制造商提供的COM互操作指令翻译成C++。

C#COM互操作:如何翻译C++;? 我尝试将我的相机制造商提供的COM互操作指令翻译成C++。,c#,c++,directshow,com-interop,C#,C++,Directshow,Com Interop,他们写道: 要获得接口,您可以使用普通COM函数从捕获筛选器请求所需的特定接口。 例如: IBaseFilter* pSourceFilter; ... CComQIPtr<IManufacturersInterface> pKs( pSourceFilter ); pKs->SetShutterSpeed( ssAuto1 ); 我把它翻译成C#as 从一开始,我就得到了一个类似的DirectShow包装器来访问摄像头,包括一个COM导入的接口IBaseFilter。我现在

他们写道:

要获得接口,您可以使用普通COM函数从捕获筛选器请求所需的特定接口。 例如:

IBaseFilter* pSourceFilter;
...
CComQIPtr<IManufacturersInterface> pKs( pSourceFilter );
pKs->SetShutterSpeed( ssAuto1 );
我把它翻译成C#as

从一开始,我就得到了一个类似的DirectShow包装器来访问摄像头,包括一个COM导入的接口
IBaseFilter
。我现在如何翻译第一个示例

我试过了

IManufacturersInterface control = sourceFilter as IManufacturersInterface; // sourceFilter is declared as IBaseFilter
control.SetShutterSpeed(eShutterSpeed.ssAuto1);
但在强制转换之后,控件为空


对不起,如果我含糊不清,我不知道我在这里做什么。这是我第一次使用COM互操作。这表明,嗯?=)

执行com互操作的最简单方法是让Visual Studio为您创建互操作-我将其用于许多不同的com对象,从未遇到任何问题。要开始,在您的C#项目中选择AddReference并选择选项卡COM,在列表中找到相机制造商的对象,您应该完成此操作。现在,您可以像使用本机C#一样使用com对象。

使用直接强制转换,而不是使用“as”操作符,这当然不起作用,并且会给您一个异常。异常应该提供更多详细信息-我猜您使用的包装器类不支持所讨论的接口。@VinayC:您说得对,谢谢!那我去看看那个包装纸。所以我猜以“CComQIPtr”开头的那行是演员阵容并没有那么糟糕也许把这个贴出来作为答案,这样我就可以接受了。你可以把评论标记为好的。然而,你可能想考虑GRZENIO的解决方案-它将解决你的许多痛苦!是的,CComQIPtr将在分配时对com对象执行查询接口“强制转换”-它也是一个托管对象,因此它将处理所有适当的添加/取消引用。不幸的是,似乎没有相应的条目。谢谢,但是=)如果没有它的条目,那么它可能还没有注册,您不能使用它。请确保您的相机软件安装正确。是的,不起作用,他不会有这样的COM接口类型库。@Hans Passant:您可能知道如何处理“那样的COM接口”的教程吗?正如VinayC所建议的,我正在寻找的界面不受支持,但我很难解决这个问题。@Jens:我不知道有什么。每个人都避免这样做,因为它很容易出错,而且很难维护。改用C++/CLI语言编写托管包装器,以便可以使用本机COM。
[ComImport]
[Guid("926ddb16-3c8e-476c-9068-eb4555a99231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IManufacturersInterface
{
    // more stuff
    [PreserveSig]
    int SetShutterSpeed([In] eShutterSpeed lShutter);
    // more stuff
}
IManufacturersInterface control = sourceFilter as IManufacturersInterface; // sourceFilter is declared as IBaseFilter
control.SetShutterSpeed(eShutterSpeed.ssAuto1);