在实现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;
}
有一次,我因为没有初始化一个 out 参数并假设如果我初始化变量,如果我不在方法内部更改它,它将保持那个值。但是我使用了这个方法.NET
,因为编组器看到这是一个[out]
参数,它丢弃了我放在调用站点上的初始值,并在函数返回后放入垃圾中(调试很有趣,不是)。
即使在故障过度补偿时也分配给out
参数还是我真的应该这样做?
编辑:即使在函数失败的情况下正式不应访问参数我经常看到(有时编写)这样的代码(使用Sharptooth的帖子中的示例):
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();
}
这在未编组的代码(相同的线程单元)中可以正常工作,但是如果涉及编组器,它是否足够聪明,仅在函数成功时才设置返回值?