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
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.
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.
- 1. Làm thế nào để kết thúc sự kiện COM không có giao diện
- 2. Làm cách nào để phát triển giao diện COM?
- 3. JBAS014544: Không tìm thấy EJB có giao diện
- 4. Làm thế nào để tìm thấy trong Eclipse lớp học nào thực hiện nhiều giao diện?
- 5. "Không thể tìm thấy khai báo giao diện cho NSObject"?
- 6. Làm thế nào để bạn triển khai giao diện IDynamicObject của C# 4?
- 7. Làm thế nào để bạn tìm thấy Leapyear trong VBA?
- 8. .NET - Bạn có thể trên giao diện hay không và khi nào bạn không nên giao diện
- 9. Làm thế nào để giao diện truy vấn Powershell trên một đối tượng COM
- 10. Làm thế nào để bạn tìm thấy vị trí của các đóng góp của menu?
- 11. Làm thế nào tôi có thể tìm thấy điểm giao nhau của ba mặt phẳng?
- 12. Làm thế nào tôi có thể tìm thấy giao điểm của hai truy vấn Django?
- 13. Làm thế nào để bạn sử dụng PyObjC để tắt và trên các giao diện không dây của máy Mac?
- 14. Làm thế nào để giải phóng một Giao diện?
- 15. Làm thế nào để khởi tạo một giao diện mà có kiểu aguments của các loại khác Interface
- 16. Cho COM DLL, trích xuất tất cả các lớp CLSID và tên giao diện tương ứng
- 17. Làm thế nào để có được loại đối tượng COM
- 18. Làm cách nào để bạn kiểm tra giao diện?
- 19. Bạn sẽ thiết kế giao diện người dùng tìm kiếm tốt như thế nào?
- 20. Làm thế nào để bạn tăng một biến giao trong smarty mà không hiển thị nó
- 21. Làm thế nào để tìm ra một id prog COM?
- 22. Typelib Generation và cài đặt với WiX
- 23. Làm thế nào để bạn xác minh giao diện kiểu gõ trong python?
- 24. Làm thế nào để đại diện cho một Enum trong một giao diện khi bạn không thể
- 25. Làm thế nào để bạn xây dựng một Visual Studio như giao diện người dùng?
- 26. Làm cách nào để tải một typelib để phân tích cú pháp trong C#?
- 27. android-studio không thể tìm thấy giao diện trợ giúp để sử dụng trong lớp
- 28. Làm thế nào bạn có thể tìm thấy số bộ xử lý mà một chuỗi đang chạy?
- 29. Làm cách nào để nhanh chóng tìm thấy (các) cách triển khai phương thức của giao diện?
- 30. Có giao diện nào an toàn không?
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
@ 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