2010-08-24 47 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