2009-10-28 23 views
5

xem xét mã của chúng tôi Tôi đã tìm thấy một định nghĩa tò mò trong một file .idl:Bất kỳ ý nghĩa nào trong việc đánh dấu một giao diện xuất phát từ IUnknown là dual trong IDL?

[ 
    object, 
    uuid(uuidhere), 
    dual, 
    nonextensible, 
    oleautomation, 
    hidden 
] 
interface IOurInterface : IUnknown { 
    //methods here 
}; 

Làm thế nào một giao diện có thể bắt nguồn trực tiếp từ IUnknown có thể là một giao diện kép? Mọi thứ có bị hỏng nếu tôi xóa thuộc tính dual không?

Trả lời

3

Trong this answer đến một câu hỏi khác liên quan đến marshaling user voyce điểm để this article rằng về cơ bản tình trạng sau đây:

Khi giao diện bất kỳ (IDispatch có nguồn gốc từ hay không) được đánh dấu hoặc dual hoặc oleautomation (hoặc cả hai) nó được xử lý đặc biệt khi RegisterTypeLib() được gọi (thường được thực hiện bởi DllRegisterServer). Đối với mỗi giao diện như vậy, khóa HKCR \ Interface {InterfaceId} được tạo ra trong đó lớp {00020424-0000-0000-C0000-000000000046} được tham chiếu là proxy/stub. Id lớp này tương ứng với marshaller typelib còn được gọi là marshaller oleautomation.

+0

Ah vâng, đúng vậy. Kể từ khi bạn đã có 'oleautomation' tôi figured đó là tiềm ẩn ... Tôi không biết các chi tiết chính xác, mặc dù, vì vậy cảm ơn cho việc theo dõi! –

+0

Và tôi vẫn nghĩ rằng bạn nên đảm bảo rằng đối tượng hiện không đáp ứng với QI cho 'IDispatch' trước khi bạn xóa nó. –

+0

Có, tôi hoàn toàn đồng ý về phản hồi QI với IDispatch. – sharptooth

1

Tôi không thể nhìn thấy một lý do đó mà sẽ làm việc, đưa ra các tài liệu ở đây: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

Giao diện được xác định bởi thuộc tính kép phải phù hợp với Tự động hóa và được bắt nguồn từ IDispatch. Thuộc tính này không phải là được phép trên dispinterfaces.

Có thể thuộc tính [dual] hoàn toàn thêm IDispatch vào giao diện.

Những gì bạn có thể làm là kiểm tra mã triển khai giao diện (giả sử đây là ATL) nếu nó xuất phát từ IDispatchImpl. Nếu vậy, nó thực sự đáp ứng với QI cho IDispatch và có thể được sử dụng như vậy.

Một cách khác là khởi tạo đối tượng đang triển khai IOurInterface và QI cho đối tượng IDispatch - nếu thành công, có thể bạn không thể xóa nó.

Thực ra, hãy suy nghĩ về điều đó, có thể [dual] về mặt kỹ thuật không yêu cầu bạn lấy được từ IDispatch miễn là bạn triển khai cả giao diện tùy chỉnh và IDispatch?

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