Các phương thức giao diện COM có thể trả về các giá trị HRESULT
khác nhau để báo hiệu các giá trị đối số không hợp lệ được chuyển. Khi nào tôi trả lại E_POINTER
và khi nào E_INVALIDARG
?Khi trả lại E_POINTER và khi E_INVALIDARG?
Như tôi đã hiểu nếu một phương pháp nhận được chỉ mục trong bộ sưu tập được đóng gói và nằm ngoài giới hạn là E_INVALIDARG
. Nếu một phương thức nhận con trỏ Interface**
, nơi phương thức lưu trữ con trỏ đến đối tượng mới được tạo là E_POINTER
.
HRESULT CImpl::GetItem(long index; Interface** result)
{
if(result == 0) {
return E_POINTER;
}
if(index < 0 || index >= internalArray.size()) {
return E_INVALIDARG;
}
*result = CreateWrapperObject(internalArray[index]);
return S_OK;
}
Nhưng nếu nó nhận được một bộ đệm WCHAR*
với một tên tập tin như một "trong" tham số và WCHAR*
này là null? Đây có phải là E_POINTER
hoặc E_INVALIDARG
không?
Hoặc một phương thức nhận con trỏ tới một số cấu trúc và được dự kiến sẽ lấp đầy cấu trúc thông qua con trỏ đó và con trỏ này là rỗng - là E_POINTER
hoặc E_INVALIDARG
?
HRESULT CImpl::SaveToFile(WCHAR* fileName)
{
if(fileName == 0) {
return // what to return here?
}
//... do actual work here
}
HRESULT CImpl::GetAttributes(Attributes* to)
{
if(to == 0) {
return // what to return here?
}
attributes->IsCool = getIsCool();
attributes->Color = RGB(0, 255, 0);
return S_OK;
}
quy tắc cho thời trở E_POINTER
và khi E_INVALIDARG
khi kiểm tra các tham số kiểu con trỏ là gì?
Bạn có tài liệu tham khảo nào về tài liệu không? – Constantin
Đồng ý. Tôi thực sự muốn nhìn thấy một tài liệu tham khảo MSDN cho việc này. Ở trên làm cho một số loại ý nghĩa, nhưng nó sẽ là tốt để có các defical kinh điển. –
Tôi không chắc câu trả lời này là chính xác. Ví dụ, trong VS2010 '', trong 'AtlSetChildSite()' thực hiện, 'E_POINTER' được trả về nếu tham số' punkChild' là 'NULL', thay vào đó theo câu trả lời này (nếu tôi đã hiểu nó đúng),' E_INVALIDARG 'nên đã được trả lại trong trường hợp đó. Tôi nghĩ ATL là một nguồn tốt của thực hành lập trình COM tốt, vì vậy có thể 'E_POINTER' sẽ được trả lại trong các trường hợp chung không hợp lệ (ví dụ:' NULL'). Nhưng thẳng thắn tôi không chắc chắn, và tôi đồng ý một số tài liệu tham khảo chính thức MSDN sẽ là tốt. –