2010-08-24 52 views
2

我正在尝试将由我的相机制造商提供给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。它显示,嗯? =)

+1

不是使用'as'操作符,而是使用直接投射 - 它当然不起作用,并给你一个例外。异常应该提供更多细节 - 我的猜测是你正在使用的包装类不支持有问题的接口。 – VinayC 2010-08-24 10:39:18

+0

@VinayC:你说得对,谢谢!那么我会研究那个包装。所以我猜测,以“CComQIPtr”开头的那一行并不是那么糟糕。 =)也许发布这个答案,所以我可以接受它。 – Jens 2010-08-24 11:02:10

+0

您始终可以将评论标记为好。但是,您可能需要考虑Grzenio的解决方案 - 它将解决您的许多难题! – VinayC 2010-08-24 11:10:22

回答

1

执行com互操作的最简单方法是让Visual Studio为您创建互操作 - 我将它与许多不同的com对象一起使用,从来没有任何问题。要开始,请在C#项目中选择添加引用,然后选择选项卡COM,在列表中找到相机制造商的对象,然后完成。您现在可以像使用本机C#一样使用com对象。

+0

不幸的是,似乎没有它的条目。谢谢,虽然=) – Jens 2010-08-24 10:55:16

+0

如果没有它的条目,那么可能它没有被注册,你不能使用它。请确保您的相机软件已正确安装。 – Grzenio 2010-08-24 11:10:58

+1

是的,不起作用,他不会有这样的COM接口的类型库。 – 2010-08-24 12:19:50