我正在嘗試將由我的相機制造商提供給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