2009-09-15 27 views
8

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ì?

Trả lời

9

Bạn trả lại E_POINTER khi tham chiếu đến con trỏ của tham số ra là rỗng, đây được coi là mã lỗi cho biết lỗi trong chương trình hoặc trong lớp tương tác.

Bạn trả lại E_INVALIDARG khi có cấp ứng dụng với thông số ví dụ về vấn đề phạm vi hoặc tham số va chạm với nhau.

Trong trường hợp của bạn, trong SaveToFile(...) bạn nên trở E_INVLIADARG vì nó không có giá trị để vượt qua tên tập tin rỗng, và trong GetAttributes(...) bạn nên trở E_POINTER (nếu nó là một hiện param) vì bạn không thể lấp đầy giá trị.

Và vâng, tất cả chúng tôi đều có L-O-V-E com :)

+0

Bạn có tài liệu tham khảo nào về tài liệu không? – Constantin

+0

Đồ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. –

+0

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. –

Các vấn đề liên quan