2010-03-02 29 views
7

Có thể tìm thấy tất cả các giao diện (các lớp, tham số, vv ..) thường được đăng ký với Mô hình đối tượng thành phần (COM) TypeLib mặc dù TypeLib hoàn toàn trống không? Nếu vậy làm thế nào bạn sẽ đi về việc này? Tôi tin rằng một thuật ngữ khác cho điều này là "COM ẩn danh". Tôi chắc chắn rằng các giao diện có thể truy cập tồn tại cho COM này bởi vì tôi có một ứng dụng đang sử dụng một lớp không được liệt kê trong TypeLib.Làm thế nào để bạn tìm thấy giao diện của COM mà không có typelib?

Trả lời

8

Nếu thư viện kiểu trống, thì không có cách nào để bạn có thể tìm thông tin về các loại trong thư viện COM.

Bạn cần ít nhất mục nhập bằng đồng xu để đánh dấu việc triển khai IUnknown.

Nếu có, thì bạn có thể tạo các phiên bản của lớp và sau đó gọi QueryInterface trên IUnknown để thực hiện IDispatch (nếu có).

Nếu giao diện IDispatch tồn tại, bạn có thể gọi GetTypeInfo để nhận thông tin về các giao diện được triển khai.

Nếu bạn cần thực hiện các cuộc gọi đến IDispatch bị trễ, thì bạn cần phải gọi số Invoke method.

Lưu ý, bạn đề cập đến thư viện kiểu, nhưng thực tế phổ biến cho các máy chủ COM trong quá trình nhúng thư viện kiểu trong dll là việc triển khai các loại được trình bày trong thư viện. Bạn có chắc chắn rằng bạn chưa kiểm tra điều đó không? Hoặc bạn có chắc là bạn có thư viện kiểu và nó thực sự trống không?

Nếu loại lib thực sự trống và dll không chứa nó, hoàn toàn có thể là loại lib là "riêng tư" theo nghĩa là các khách hàng khác được biên dịch dựa vào nó. COM không cần một loại-lib lúc chạy nhất thiết. Mẫu để trưng ra triển khai IClassFactory interface là xuất một hàm DLL chuẩn với chữ ký nổi tiếng.

Người ta có thể dễ dàng gọi LoadLibrary, sau đó gọi GetProcAddress và truyền kết quả đến IClassFactory. Từ đó, họ sẽ sử dụng GUID riêng và IID mà họ biết (không phải từ thư viện kiểu) cũng như các giao diện COM mà họ đã định nghĩa riêng và làm việc từ đó.

Lý do duy nhất tôi có thể nghĩ về điều gì đó như thế này là một hình thức làm xáo trộn và/hoặc giải quyết các vấn đề về quyền riêng tư/bảo mật, chỉ cho phép khách hàng mà nhà sản xuất máy chủ chấp thuận gọi nó.

Nó không giúp bạn, nhưng có thể giải thích tại sao bạn đang nhìn thấy một thư viện kiểu mà không có thông tin trong đó và đồng thời, xem các khách hàng khác tiêu thụ thư viện.

+0

Cảm ơn câu trả lời nhanh, tôi sẽ phải thực hiện thêm một số công việc đào bới. Nhưng có tôi chắc chắn rằng TypeLib là không đầy đủ bởi vì tôi có một chương trình đó là truy cập vào một lớp học trong COM mà không phải là trong TypeLib. – rook

+0

@ The Rook: Tôi đã cập nhật câu trả lời của mình để phản ánh lý do tại sao bạn có thể thấy hành vi này. – casperOne

5

Không sử dụng thư viện kiểu trong lập trình COM là khá phổ biến. Bất kỳ ngôn ngữ kịch bản nào, nó sử dụng IDispatch để khám phá các phương thức và thuộc tính được hỗ trợ trong thời gian chạy. IDispatch :: GetIDsOfNames() hoặc IDispatch :: GetTypeInfo() nhận được quả bóng lăn. Điều này được gọi là cuối ràng buộc. Nó chậm, nhưng điều đó không quan trọng bằng ngôn ngữ kịch bản.

Một cách tiêu chuẩn khác là thông qua các tệp tiêu đề được tạo bởi MIDL từ tệp .idl mô tả giao diện và coclasses. Bạn sẽ tìm thấy nhiều người trong số họ trong Windows SDK bao gồm thư mục, mshtml.h ví dụ. Nhưng điều này chỉ phù hợp với mã C/C++ không được quản lý.

Sử dụng COM mà không có thư viện kiểu trong ngôn ngữ được quản lý như C# thì khó nhưng không phải là không thể. VB.NET là ngôn ngữ tốt hơn, nó hỗ trợ cuối ràng buộc ra khỏi hộp.C# sẽ trở nên tốt hơn khi phiên bản 4.0 đến, nó có từ khóa "động" mới.

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