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
.
Nguồn
2008-10-06 04:40:21
"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? –
@FelixDombek Tôi đồng ý. Tôi đã chỉnh sửa bài đăng để xóa cuộc gọi 'QueryInterface' thừa. –