2010-08-24 5 views
2

내 카메라 제조업체가 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을 사용해야하는 것은 이번이 처음입니다. 그것은 보여줍니다, 흠? =)

+1

대신 'as'연산자를 사용하는 대신 직접 형 변환을 사용하십시오. 물론 작동하지 않으며 예외가 발생합니다. 예외는 더 자세한 정보를 제공해야합니다. 사용중인 래퍼 클래스가 해당 인터페이스를 지원하지 않는다고 추측합니다. – VinayC

+0

@VinayC : 네가 맞아, 고마워! 그 래퍼를 살펴 보겠습니다. 그래서 "CComQIPtr"로 시작하는 줄은 형편 없었던 것 같습니다. =) 어쩌면 답으로 게시 할 수 있으므로 받아 들일 수 있습니다. – Jens

+0

언제든지 댓글을 좋은 것으로 표시 할 수 있습니다. 그러나, 당신은 Grzenio의 솔루션을 고려할 수도 있습니다 - 그것은 당신의 많은 고통을 해결할 것입니다! – VinayC

답변

1

com interop을 만드는 가장 쉬운 방법은 Visual Studio에서 여러 가지 COM 객체와 함께 사용하고 아무런 문제가 없었던 interop을 만들 수있게하는 것입니다. 시작하려면 C# 프로젝트에서 참조 추가를 선택하고 COM 탭을 선택하고 목록에서 카메라 제조업체 개체를 찾아야합니다. 이제는 네이티브 C# 인 것처럼 com 객체를 사용할 수 있습니다.

+0

불행히도, 그것에 대한 항목이없는 것 같습니다. 고마워, 그래도 =) – Jens

+0

항목이 없다면 아마 등록되지 않았으므로 사용할 수 없습니다. 카메라의 소프트웨어가 올바르게 설치되었는지 확인하십시오. – Grzenio

+1

그래, 작동하지 않습니다, 그 같은 COM 인터페이스에 대한 형식 라이브러리가 없습니다. –

관련 문제