2009-08-04 2 views
3

나는 간단한 것을 놓친다는 것을 알고있다. 나는이 com과 관련된 경험이 없다.bool을 C#에서 idl의 C++ com 인터페이스를 통해 전달하는 방법

내가 IDL

[id(5), helpstring("Returns true if the object is in a valid state.")] 
HRESULT IsValid([out, retval] boolean bValid); 

에 인터페이스에서이 작업을 수행하고자하는

그러나이 제공 : [OUT] 있었던 파라미터 포인터가 아닙니다.

네, 알겠습니다.

그러나 이것을 구현하는 C# 코드에서는 안전하지 않기 때문에 IsValid() 메서드에서 bool *을 반환 할 수 없습니다.

내가 부울 값을 반환하는 올바른 방법은 무엇입니까?

답변

7

보십시오 출력으로서 사용하기 위해서

HRESULT IsValid([out, retval] VARIANT_BOOL *bValid); 

, 그것이 갖는

의 값에 대한 포인터와; 이 그것이 C++ 측에 기록하는 방법이다 :

*bValue = VARIANT_TRUE; 

당신이 boolean으로 유형을 쓸 수 있다면 나도 몰라 - 나는 오직 VARIANT_BOOL 본 적이 사용된다. 런타임 호출 가능 래퍼 (RCW)이 메소드 서명의 "더 좋은"버전을 구현하고 안전하지 않은 처리됩니다

public bool IsValid() 

즉 :는 C# 측면에서

, 그것은 동등한에 될 것입니다 번역. C++ 구현이 E_FAIL (또는 E_WHATEVER)을 반환하면 RCW의 메서드는 ComException을 반환합니다.

을 메서드 대신 속성으로 사용할 수 있도록 [propget] 특성을 추가하는 것도 좋습니다. 어떤 자산과 마찬가지로 평가하기가 저렴하고 부작용이없는 경우에만이 작업을 수행하십시오 (디버거가 C# 코드를 단계별로 평가 함).

+0

이것은 효과가 있습니다. 또한, 나는 이것에 대한 속성을 사용하는 방법을 궁금해서 내 문제 중 두 가지를 해결했습니다. 덕분에 ! – Erix

관련 문제