내 카메라 제조업체가 C++에서 제공 한 COM Interop 명령어를 C#으로 변환하려고합니다. ,C# COM Interop : C++에서 명령어를 번역하는 방법은 무엇입니까?
인터페이스를 얻으려면 당신은 당신이 캡처 필터에서 필요한 특정 인터페이스를 요구하는 일반 COM 기능을 사용
그들은 물품. 예를 들어 는 :
IBaseFilter* pSourceFilter; ... CComQIPtr<IManufacturersInterface> pKs(pSourceFilter); pKs->SetShutterSpeed(ssAuto1);
또한 인터페이스 서명과 GUID를 제공합니다. 나는 내가 COM-수입 인터페이스 IBaseFilter
을 포함하여, 처음에 카메라에 액세스 할 수 비슷한 DirectShow의 래퍼를 가지고 another source에서
[ComImport]
[Guid("926ddb16-3c8e-476c-9068-eb4555a99231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IManufacturersInterface
{
// more stuff
[PreserveSig]
int SetShutterSpeed([In] eShutterSpeed lShutter);
// more stuff
}
로 C 번호로 번역하는
interface IManufacturersInterface: IUnknown
{
// more stuff
HRESULT SetShutterSpeed([in] eShutterSpeed lShutter);
// more stuff
}
같은 서명이 보인다. 첫 번째 예를 어떻게 번역 할 수 있습니까?
나는
IManufacturersInterface control = sourceFilter as IManufacturersInterface; // sourceFilter is declared as IBaseFilter
control.SetShutterSpeed(eShutterSpeed.ssAuto1);
을 시도했지만 컨트롤은 주조 후 null입니다.
미안하지만 막연한 경우 여기에서 내가하고있는 실제 단서가 없습니다. COM Interop을 사용해야하는 것은 이번이 처음입니다. 그것은 보여줍니다, 흠? =)
대신 'as'연산자를 사용하는 대신 직접 형 변환을 사용하십시오. 물론 작동하지 않으며 예외가 발생합니다. 예외는 더 자세한 정보를 제공해야합니다. 사용중인 래퍼 클래스가 해당 인터페이스를 지원하지 않는다고 추측합니다. – VinayC
@VinayC : 네가 맞아, 고마워! 그 래퍼를 살펴 보겠습니다. 그래서 "CComQIPtr"로 시작하는 줄은 형편 없었던 것 같습니다. =) 어쩌면 답으로 게시 할 수 있으므로 받아 들일 수 있습니다. – Jens
언제든지 댓글을 좋은 것으로 표시 할 수 있습니다. 그러나, 당신은 Grzenio의 솔루션을 고려할 수도 있습니다 - 그것은 당신의 많은 고통을 해결할 것입니다! – VinayC