COM
인터페이스를 구현할 때 필자는 항상 성공시 out 매개 변수를 할당하지만 오류가 발생하더라도이를 수행해야합니까?COM 함수가 실패하더라도 매개 변수를 설정해야합니까?
HRESULT CDemo::Div(/*[in]*/ LONG a, /*[in]*/LONG b, /*[out,retval]*/ LONG* pRet)
{
if (pRet == NULL)
return E_POINTER;
if (b == 0)
{
*pRet = 0; // is this redundant?
return E_INVALIDARG;
}
*pRet = a/b;
return S_OK;
}
한때는 I는 출력 파라미터를 초기화하고 I 변수를 초기화하는 경우 I 메소드 내부를 변경하지 않을 경우는 그 값을 유지 것이라고 가정하지 않음으로써 코 비트이었다. 그러나 나는 .NET
에서이 방법을 사용했으며 marshaller는 이것이 [out]
매개 변수라는 것을 알고 있기 때문에 호출 사이트에 놓은 초기 값을 무시하고 함수가 반환 된 후 가비지를 넣었습니다 (재미있는 디버깅이 아닌).
오류 초과 보상시에도 out
매개 변수에 할당하고 있습니까? 아니면 실제로해야합니까?
편집 :
ISmth *pSmth = NULL;
pObj->GetSmth(&pSmth); // HRES is ignored
if (pSmth) // Assumes that if GetSmth failed then pSmth is still NULL
{
pSmth->Foo();
pSmth->Release();
}
: 함수가 나는이 같은 코드 (sharptooth's post에서 예를 사용)을 종종 볼 (때로는 쓰기) 실패 할 경우 공식적으로 하나 PARAMS을 액세스하지 않아야에도 불구하고 이것은 비 정렬 화 코드에서 똑같이 작동하지만 (동일 thread apartment) marshaller가 관련되어 있으면 함수가 성공하면 반환 값만 설정할만큼 똑똑합니까?
나는 그것이 중요하지 않아야한다고 생각한다. 호출하는 COM 클라이언트는 실패가 발생하면'out' 매개 변수를 보지 않아야합니다. –