OK, tôi nghi ngờ tôi sẽ gặp khó khăn ngay cả khi đặt điều này trong các từ vì sự hiểu biết của tôi về COM và căn hộ không thực sự đạt đến công việc ;-)Làm thế nào để đảm bảo không có quyền truy cập lại vào máy chủ COM chính-STA của tôi (C++)?
Tôi có một máy chủ COM/thành phần (C++) bao bọc một số mã cũ. Do các giới hạn của mã kế thừa này, tôi cần đảm bảo rằng các phương pháp của thành phần COM là:
- chỉ được gọi trên một chuỗi duy nhất.
- đây luôn là chủ đề giống nhau cho tất cả các phiên bản của máy chủ.
- (mà tôi chỉ nhận ra sau) không có cuộc gọi lại.
Hai số đầu tiên tôi đạt được bằng cách đăng ký máy chủ với ThreadingModel = "".
Thứ ba là một vấn đề mà tôi đã bất ngờ thậm chí gặp phải.
Máy chủ đang được một khách hàng đa luồng sử dụng mà tôi không có quyền kiểm soát. Nó tạo ra nhiều cá thể của máy chủ/thành phần trên các luồng khác nhau và gọi phương thức DoSomething() của chúng.
Điều này dẫn đến việc chọn hành vi treo và treo và tôi đã thấy các dấu vết ngăn xếp chứa hai lệnh gọi tới DoSomething() trên cả chuỗi STA chính, nhưng đối với các phiên bản khác nhau của máy chủ.
Ban đầu tôi thậm chí không nghĩ rằng điều này là có thể, nhưng bây giờ tôi có một sự hiểu biết một phần và tôi cần phải biết nếu/làm thế nào nó có thể được ngăn chặn.
Đọc của tôi cho thấy rằng tôi có thể cần phải sử dụng IMessageFilter theo một số thời trang, nhưng tôi không chắc liệu đây có phải là thứ có thể thực hiện ở phía máy chủ hay không hoặc do khách hàng thực hiện.
Ai đó có thể trợ giúp?
Hãy lưu ý rằng tôi đang tìm kiếm xem có câu trả lời nào ở cấp COM hay không, thay vì tìm kiếm các đề xuất về cách thay đổi cách mã máy chủ tương tác với mã cũ (ví dụ: riêng của chủ đề và thực hiện của riêng tôi (non-COM) marshalling của các cuộc gọi từ tất cả các trường hợp của máy chủ vào chủ đề đó).