2010-08-23 5 views

Trả lời

4

Giống như những người khác đã đề cập, cách duy nhất là QueryInterface cho tất cả các giao diện có thể có. Và đây chính xác là những gì mà công cụ của Microsoft OleView thực hiện cho bạn.

1

Không có cách nào. Ý tưởng đằng sau giao diện COM là bạn hỏi đối tượng - "hãy giao cho tôi giao diện XYZ nếu bạn hỗ trợ nó) và đối tượng quyết định cách phản hồi - cung cấp tham chiếu đến chính nó hoặc hiển thị giao diện của một số đối tượng bên trong v.v. Vì vậy, bạn có thể ' t biết giao diện nào đối tượng "hỗ trợ" mà không hỏi đối tượng như được mô tả ở trên Đây là quyết định thiết kế của các nhà thiết kế COM.

2

Thật không may, đó không phải là thứ COM được thiết kế cho ở mức COM cơ bản, bạn chỉ có thể ask an object whether it supports một giao diện được xác định UUID cụ thể, một tại một thời điểm Vì có rất nhiều UUID tiềm năng, nên có một danh sách đầy đủ theo cách đó sẽ tốn khá nhiều thời gian! không có cách nào để truy cập các danh sách đó từ bên ngoài và thậm chí nếu có, bạn chỉ có thể nhận được một tên có lập trình của giao diện bằng cách tìm kiếm UUID của họ trong sổ đăng ký, không phải lúc nào cũng đáng tin cậy.

ActiveX objects (a tricky term!) có xu hướng hỗ trợ tự động hóa thông qua IDispatch. Nếu các đối tượng được xử lý tốt, bạn có thể get some information on the methods chúng hỗ trợ thông qua GetTypeInfo(). Điều này sẽ không bao gồm tên của các giao diện (nếu có) các phương pháp thuộc về.

Để tóm tắt, COM khá nghèo ở siêu dữ liệu đối tượng.

+0

Cảm ơn câu trả lời rất chi tiết. Tuy nhiên, tôi đang tìm kiếm một giải pháp thực tế mà câu trả lời của Paul đã cung cấp cho tôi, vì vậy tôi đã chấp nhận câu trả lời đó. –