2010-01-22 36 views
5

Tôi đã theo 'hướng dẫn' về cách hiển thị khuôn khổ .NET thông qua COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspxhttp://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx). Mọi thứ đều hoạt động ngoại trừ phần sự kiện. Khi tôi thêm sự kiện vào giao diện C# cáC++ mã C sau đây được tạo:Đăng ký các trình xử lý cho sự kiện .NET COM trong C++

struct __declspec(uuid("...")) 
_MessageEventHandler : IDispatch 
{}; 

struct __declspec(uuid("...")) 
IConnection : IDispatch 
{ 
    virtual HRESULT __stdcall add_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
    virtual HRESULT __stdcall remove_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
} 

Vấn đề là tôi đã không tìm thấy bất kỳ thông tin về cách sử dụng điều này trong C++. Tôi có cần xuất phát từ _MessageEventHandler và triển khai operator() không? Hoặc cái gì khác hoàn toàn?

(Lưu ý rằng đối với thời điểm tôi cũng đang cố gắng tiếp cận tờ chi hơn của việc sử dụng IConnectionPointContainer và IConnectionPoint.)

+0

Bạn có thể dự kiến ​​sẽ xuất phát từ '_MessageEventHandler' và nhận cuộc gọi trên' IDispatch :: Invoke() 'cho sự kiện - nhưng câu hỏi là với những gì' DISPID'? –

Trả lời

2

Nó đã được một thời gian dài kể từ khi tôi sử dụng COM và tại thời điểm đó tôi đã sử dụng Visual C++ 6.0 . Tôi nhớ rằng việc thực hiện các điểm chìm cho các điểm kết nối COM không phải là một quá trình đơn giản. Có nhiều cách để thực hiện chúng, tùy thuộc nếu bạn sử dụng MFC hoặc ATL. Có lẽ có những cách dễ dàng hơn bây giờ. Dưới đây là vài liên kết có thể giúp bạn:

Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - số lượng lớn các bài viết về COM
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II

+0

Thx. Liên kết đầu tiên cho tôi thấy 'phần còn thiếu' :-) –

1

IDispatch được sử dụng cho các ngôn ngữ ràng buộc thời gian chạy như VB, bạn sẽ không bình thường cần phải làm điều này cho một ngôn ngữ gõ mạnh như C#. Khi bạn gọi một phương thức thông qua IDispatch, những gì bạn thực sự làm là xây dựng một mảng chứa id phương thức (được gọi là dispid) và các tham số, sau đó trao cho một hàm tìm kiếm thông qua một bảng các phương thức bằng cách phân loại, khi nó tìm thấy một, nó sử dụng mảng tham số của bạn để xây dựng một callstack và sau đó gọi phương thức. (Đây là một sự đơn giản, dĩ nhiên).

Vì vậy, biết rằng một lớp thực hiện IDispatch cho bạn hầu như không có gì.

Vì vậy, đây là ether dẫn sai hoặc bạn thiếu tuyên bố cho bảng công văn MessageEventHandler.

Hoàn toàn không ngạc nhiên khi bạn không thể tìm ra cách thực hiện từ điều này, bạn đang thiếu một số thông tin quan trọng.

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