2013-10-22 1 views
0

나는 이런 [dual]IDispatch를 구현하는 인터페이스, 뭔가를 :COM : 문자열 또는 실제 값의 복사본을 반환 하시겠습니까?

[dual, ...] 
interface IMyInterface : IDispatch 
{ 
    [id(1), propget] HRESULT StringValue([out, string, retval] OLECHAR const ** str); 
}; 

IMyInterface에 대한 나의 지원 객체는 멤버 변수, d_str 있습니다

class CBackingObject : public IMyInterface 
{ 
    std::basic_string<OLECHAR> d_str; 
    ... 
}; 

StringValue 속성을 반환에 대한 COM 규칙은 무엇을? d_str.data() 또는 사본을 보내 주시겠습니까? 클라이언트는 문자열 값 속성에 의해 반환 된 문자열을 자동으로 해제해야합니까?

답변

1

말하기 어렵지만 자동화 호환 서명이 아닙니다. IDispatch 인터페이스에는 문자열을 COM 힙에 할당 된 문자열 인 BSTR로 전달해야합니다. [out, retval]에 대한 계약은 인터페이스 메소드가 SysAllocString()으로 문자열을 할당하고 호출자가 SysFreeString()으로 그것을 해제한다는 것입니다.

작성한 코드가 오작동 할 가능성이 큽니다. 은 최소한이어야하며, 다른 말로는 복사본 인 SysAllocString을 사용하십시오. 당신은 IDL에서 OLECHAR ** 선언을 버릴지도 모르지만 그것은 매우 건강에 좋지 않습니다. 이것은 호출이 초기 경계에 있고 아파트 경계를 통해 정렬 될 때 잘못됩니다. BSTR *을 대신 사용하여 문제를 해결하는 것이 좋습니다.

+0

감사합니다 한스 - 훌륭한 답변과 그에 따라 계약을 따를 것입니다. 3 가지 질문 : (1) SysAllocString()의 * 사본 *을 반환해야합니다. (2) 만일 내가 상응하는'propput'을 가지고 있다면, 들어오는 BSTR도 역시 복사해야합니까? (3) 계약서를 설명하는 의사에게 나를 연결할 수 있습니까? – 0xbe5077ed

+0

SysAllocString이 이미 복사본을 만듭니다. setter는 포인터가 아닌 문자열 내용을 복사해야합니다. 링크에 google을 사용하고 도서에는 amazon을 사용하십시오. –