2008-10-06 40 views
10

Giao diện ISupportErrorInfo có nghĩa là gì? Tôi có một chút mất mát để hiểu nó. Từ MSDN:Triển khai ISupportErrorInfo - điều đó có nghĩa là gì?

Giao diện này đảm bảo rằng thông tin lỗi có thể được truyền bá chính xác đến chuỗi cuộc gọi . Tự động hóa các đối tượng sử dụng lỗi xử lý các giao diện phải triển khai ISupportErrorInfo.

Phương pháp này cho biết có hay không giao diện hỗ trợ giao diện IErrorInfo .

HRESULT InterfaceSupportsErrorInfo(
    REFIID riid 
); 

có nghĩa là gì để quay trở lại S_OK trong InterfaceSupportsErrorInfo? Bạn có nên trả lại S_OK cho tất cả các giao diện không? Chỉ một vài?

Trả lời

17

sự hiểu biết của tôi về nó (dựa trên một số trang MSDN liên quan) là bằng cách thực hiện ISupportErrorInfo, bạn cho biết rằng một hoặc nhiều giao diện trên lớp của bạn trả về thông tin lỗi bằng cách gọi SetErrorInfo, như trái ngược với chỉ trả lại một thất bại HRESULT.

Cuối cùng, thực hiện lại ISuportErrorInfo::InterfaceSupportsErrorInfo nên trở S_OK chỉ dành cho những giao diện trên lớp của bạn mà thực sự sử dụng SetErrorInfo trở về thông tin lỗi cho người gọi, và chỉ những giao diện.

Ví dụ: giả sử bạn có một lớp thực hiện giao diện bạn đã viết có tên là IFoo có phương thức DoSomething. Nếu ai đó tạo ra một thể hiện của lớp học của bạn và gọi IFoo::DoSomething, họ có nghĩa vụ phải làm như sau nếu DoSomething trả về một thất bại HRESULT (diễn giải từ các trang MSDN khác nhau, nhưng tôi bắt đầu từ đây: http://msdn.microsoft.com/en-us/library/ms221510.aspx):

  • Gọi QueryInterface trên con trỏ IFoo để có được giao diện ISupportErrorInfo cho các đối tượng được thực hiện IFoo

  • Nếu đối tượng gọi không thực hiện ISupportErrorInfo, sau đó người gọi sẽ có để xử lý lỗi dựa trên giá trị HRESULT hoặc chuyển nó lên ngăn xếp cuộc gọi.

  • Nếu đối tượng được gọi thực hiện ISupportErrorInfo, thì người gọi phải gọi ISupportErrorInfo::InterfaceSupportsErrorInfo, chuyển qua một REFIID cho giao diện trả về lỗi. Trong trường hợp này, phương thức DoSomething của giao diện IFoo trả lại lỗi, vì vậy bạn sẽ vượt qua REFIID_IFoo (giả định rằng nó được xác định) thành InterfaceSupportsErrorInfo.

  • Nếu InterfaceSupportsErrorInfo lợi nhuận S_OK, sau đó người gọi biết vào thời điểm này mà nó có thể lấy thông tin chi tiết hơn về lỗi bằng cách gọi GetErrorInfo.Nếu InterfaceSupportsErrorInfo trả về S_FALSE, người gọi có thể giả định giao diện được gọi không cung cấp thông tin lỗi chi tiết và sẽ phải dựa vào HRESULT được trả về để tìm hiểu điều gì đã xảy ra.

Lý do cho/phức tạp API lỗi xử lý hơi khó hiểu này có vẻ là sự linh hoạt (như xa tôi như tôi có thể nói nào Đây là COM sau khi tất cả;.). Với thiết kế này, một lớp có thể hỗ trợ nhiều giao diện, nhưng không phải mọi giao diện đều được yêu cầu sử dụng SetErrorInfo để trả về thông tin lỗi từ các phương thức của nó. Bạn có thể chắc chắn, chọn giao diện trên lớp của bạn trả về thông tin lỗi chi tiết qua SetErrorInfo, trong khi các giao diện khác có thể tiếp tục sử dụng bình thường HRESULT s để chỉ ra lỗi. Tóm lại, giao diện ISupportErrorInfo là cách để thông báo mã gọi điện thoại mà ít nhất một trong các giao diện mà lớp của bạn triển khai có thể trả về thông tin lỗi chi tiết và phương thức InterfaceSupportsErrorInfo cho người gọi biết giao diện đã cho là một trong những giao diện đó hay không. . Nếu có, thì người gọi có thể truy xuất thông tin lỗi chi tiết bằng cách gọi GetErrorInfo.

+0

"Nếu đối tượng được gọi thực hiện ISupportErrorInfo, thì người gọi được yêu cầu QueryInterface cho ISupportErrorInfo" Đây có thể là lỗi, vì người gọi chỉ DID gọi trước để xác định xem giao diện này có được hỗ trợ ngay từ đầu không? Không nên người gọi sau đó gọi 'ISupportErrorInfo :: InterfaceSupportsErrorInfo' trực tiếp mà không cần phải gọi QI lần thứ hai? –

+0

@FelixDombek Tôi đồng ý. Tôi đã chỉnh sửa bài đăng để xóa cuộc gọi 'QueryInterface' thừa. –

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