Đối tượng COM

Một phần của tài liệu He_thong_dieu_khien_phan_tan (Trang 42 - 45)

1: op () broker_A broker_B

6.4.2 Đối tượng COM

Một đối tượng COM có thể được lập trình bằng một ngôn ngữ thông dụng như C, C++ hoặc VB. Một đối tượng có thể cung cấp nhiều giao diện. Tất cả

© 2005, Hồng Minh Sơn các đối tượng COM đều có một giao diện cơ bản là IUnknown. Đây là giao diện cơ sở cho tất cả các giao diện khác trong COM mà mọi đối tượng phải hỗ trợ. Bên cạnh đó, đối tượng cũng có khả năng thực thi nhiều giao diện khác. Các đối tượng với nhiều giao diện có thể cung cấp các con trỏ truy nhập vào nhiều bảng chứa các hàm. Các con trỏ này có thể gọi được con trỏ giao diện. Trong COM, giao diện là một bảng các con trỏ ( giống như vtable trong C++) vào các hàm được thực hiện bởi đối tượng.

Hình 6-3: Mơ hình một ₫ối tượng COM

Trong thực tế, một con trỏ trỏ đến một giao diện là một con trỏ tới một con trỏ trỏ tới bảng các con trỏ vào các hàm thành viên. Tuy nhiên, để tránh cách diễn đạt quanh co này khi nói về giao diện người ta thường sử dụng thuật ngữ con trỏ giao diện để thay thế. Khi đó sự thực thi giao diện đơn giản là dùng con trỏ trỏ tới mảng các con trỏ tới các hàm. Hình 6-4 sau minh họa cho điều này.

Giao diện IUnknown

Như đã trình bày ở trên, mọi đối tượng COM, khơng có sự loại trừ, đều hỗ trợ giao diện IUnknown. Giao diện này có ba phương thức AddRef(), Release() và QueryInterface(). Tất cả các giao diện khác đều dẫn xuất từ giao diện

IUnknown và đều có các con trỏ đến các phương thức này.

Hai phương thức đầu tính tốn số đếm tham chiếu để điều khiển thời gian sống của đối tượng. Khi đối tượng được tạo lần đầu, ta cần gọi phương thức AddRef() của đối tượng để tăng số đếm. Khi khơng cịn cần tới đối tượng, ta gọi phương thức Release() để giảm số đếm tham chiếu. Khi người dùng cuối cùng gọi phương thức Release(), số đếm giảm về 0 thì đối tượng sẽ tự huỷ.

Đ i t ng IUnknown Các giao di n khác B A

© 2005, Hồng Minh Sơn

Hình 6-4: Sự thực thi con trỏ giao diện

Ta có thể thấy rõ vấn đề hơn qua sự thực thi đơn giản hai phương thức IUnknown::AddRef() và IUnknown::Release() dưới đây:

//tăng biến thành viên chứa số đếm tham chiếu ULONG IUnknown::AddRef() {

return ++m_RefCount; }

//giảm biến chứa số đếm tham chiếu, nếu bằng 0 thì huỷ đối tượng ULONG IUnknown::Release() { --m_RefCout; if (m_RefCount == 0) { delete this; return 0; } return m_RefCount; }

Khi ta có một con trỏ đến đối tượng thì thực chất, những gì ta có chỉ là một con trỏ đến một trong số các giao diện của nó, cịn đó là giao diện nào thì lại phụ thuộc vào cách mà ta có con trỏ đó. Từ con trỏ vào một giao diện, ta có thể truy cập được con trỏ vào các giao diện khác mà đối tượng hỗ trợ. Đối tượng có thể hoặc khơng hỗ trợ giao diện mà ta quan tâm, nhưng mọi đối tượng đều được đảm bảo hỗ trợ giao diện Iunknown nên ta có thể yêu cầu các giao diện khác qua phương thức IUnknow::QueryInterface().

Các giao diện được định danh bởi các IIDs (Interface IDs) ví dụ như IID_IUnknown của giao diện IUnknown. Khi ta gọi phương thức QueryInterface(), ta gửi IID của giao diện mà ta cần cho nó và một con trỏ đến tham số đầu ra. Nếu đối tượng hỗ trợ giao diện yêu cầu, nó sẽ trả lại đoạn mã báo thành công S_OK (định nghĩa là 0) và đặt vào tham số đầu ra mà ta cung cấp con trỏ đến giao diện yêu cầu. Nếu đối tượng không hỗ trợ giao diện này nó báo lỗi và đặt tham số đầu ra là NULL. Ta xét một sự thực thi đơn giản sau:

HRESULT IUnknown::QueryInterface (REFIID riid , LPVOID * ppv) { //kiểm tra IID xem đối tượng có hỗ trợ giao diện u cầu khơng,

pointer

Interface Function Table Interface Pointer Pointer to Function1 Function1(...) { ... } Pointer to Function2 Pointer to Function3 ... Function2(...) { ... } Function3(...) { ... } ...

© 2005, Hồng Minh Sơn

//nếu hỗ trợ ta tăng số đếm tham chiếu, đưa vào biến đầu ra cung cấp // một con trỏ đến giao diện, và báo rằng đã thành công

if (riid == IDD_IUnknow) { AddRef();

*ppv = (LPVOID) this; return S_OK;

}

//nếu không hỗ trợ giao diện ta đặt biến đầu ra cung cấp là NULL và // trả về một mã thông báo lỗi else { *ppv = NULL; return E_NOINTERFACE; } }

Quan hệ giữa ₫ối tượng và các giao diện

Các client chỉ kết nối qua con trỏ tới các giao diện. Khi một client truy

nhập vào một đối tượng, client chỉ đơn thuần thông qua con trỏ giao diện. Con trỏ giấu đi nội dung của thao tác bên trong, ta không thể thấy chi tiết về đối tượng mà chỉ có thể thấy thơng tin về trạng thái của chúng.

Đối tượng có thể thực thi nhiều giao diện. Một lớp thực thi đối tượng có thể

thực thi nhiều giao diện, ví dụ qua phương pháp đa thừa kế.

Một phần của tài liệu He_thong_dieu_khien_phan_tan (Trang 42 - 45)

Tải bản đầy đủ (PDF)

(106 trang)