Tóm lại COM (Mô hình đối tượng thành phần) là gì? [đóng cửa]


89

Có vẻ như các đối tượng COM là các đối tượng sử dụng chung được quản lý bởi hệ điều hành. Các đối tượng tuân theo một giao diện nghiêm ngặt và cho phép bạn truy vấn các đối tượng để xác định thông tin. Đây có phải là những gì đối tượng COM là?

c++  com 

Câu trả lời:


111

COM là một cơ chế cho phép sử dụng lại các đối tượng (hoặc đúng hơn là các thành phần), độc lập với ngôn ngữ được sử dụng bởi lập trình viên đã triển khai thành phần và lập trình viên sử dụng nó, và không phụ thuộc vào việc liệu thành phần đã được triển khai trong chương trình của khách hàng ở nơi khác trên máy (hoặc mạng).

Nói chung, mỗi thành phần COM cung cấp một triển khai của một hoặc nhiều giao diện. Các giao diện đó được xác định theo cách trung lập về ngôn ngữ bằng cách sử dụng Ngôn ngữ Định nghĩa Giao diện (IDL) . Ví dụ, một trong những giao diện cơ bản trong COM, IUnknown , được định nghĩa như sau:

interface IUnknown
{
   virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
   virtual ULONG AddRef(void) = 0;
   virtual ULONG Release(void) = 0;
};

Giao diện nhỏ này là cơ bản trong COM, vì mỗi thành phần COM phải triển khai nó. Nó xác định hai khía cạnh quan trọng của máy COM:

  • QueryInterfacecho phép mã gọi để có được một triển khai cho một giao diện đã biết. Trong COM, các giao diện được tham chiếu bởi GUID (còn được gọi là Bộ nhận dạng giao diện, IID). Nếu một đối tượng triển khai một số giao diện, thì đó là cách mã máy khách nhận được tham chiếu đến mỗi giao diện đó. Nó hoạt động như một loại toán tử truyền, nếu bạn muốn.
  • AddRef()Release()thực hiện cơ chế quản lý bộ nhớ cho các đối tượng COM. Như tên gọi của chúng cho thấy, mô hình phổ biến nhất là cơ chế đếm tham chiếu, trong đó một thể hiện bị hủy sau khi ứng dụng khách cuối cùng đã giải phóng tham chiếu tới nó.

Tất cả các thành phần COM được đăng ký với hệ thống khi cài đặt. Nếu một lập trình viên muốn sử dụng một thành phần nhất định, anh ta cần phải:

  • Đảm bảo rằng thành phần được cài đặt ở một vị trí có thể tiếp cận. Hầu hết thời gian nó nằm trên hệ thống của ứng dụng đang chạy, nhưng COM + cũng cho phép các thành phần tồn tại trên các máy tính từ xa.
  • Biết GUID của thành phần đã cho. Với GUID này, khách hàng có thể yêu cầu hệ thống khởi tạo thành phần (trong C, hàm để thực hiện việc này được gọi CoCreateInstance()). Bạn có thể xem trong sổ đăng ký theo HKEY_CLASSES_ROOT\CLSID: mỗi GUID trong đó (có thể là) một mã định danh cho một thành phần hoặc giao diện COM và các mục nhập bên dưới khóa đó cho hệ thống biết cách cài đặt nó.

Bộ máy COM cực kỳ phức tạp. Ví dụ, việc triển khai hoặc sử dụng các thành phần COM trong C đòi hỏi rất nhiều công việc, nhưng các ngôn ngữ cấp cao hơn như Visual Basic đã làm rất nhiều để dễ dàng triển khai và sử dụng các thành phần COM. Tuy nhiên, lợi ích là rất thực tế. Nó giúp bạn có thể viết một ứng dụng trong Visual Basic, nhưng vẫn triển khai các thuật toán quan trọng về hiệu suất trong C hoặc C ++ dưới dạng các đối tượng COM, có thể được sử dụng trực tiếp từ mã VB. Hệ thống xử lý các đối số gọi phương thức sắp xếp , chuyển chúng qua các luồng, quy trình và kết nối mạng khi cần thiết để mã máy khách có ấn tượng như đang sử dụng một đối tượng bình thường.

Nhiều phần cơ bản của Windows dựa trên COM. Ví dụ, Windows Explorer (trình quản lý tệp) về cơ bản là một trình bao trống. Nó định nghĩa một loạt các Giao diện COM để điều hướng và hiển thị phân cấp cây, và tất cả mã thực sự hiển thị "Máy tính của tôi", các ổ đĩa, thư mục và tệp là một tập hợp các thành phần COM triển khai các giao diện đó.

Với sự ra đời của .NET, COM đang dần trở nên lỗi thời.


10
Nguồn cho dòng cuối cùng?
Shad

32

COM là một cơ chế được phát triển để cho phép mọi người phân phối các tệp nhị phân có thể được sử dụng lại ngay cả khi người gọi đang sử dụng trình biên dịch C ++ của nhà cung cấp khác hoặc (cuối cùng) một ngôn ngữ khác hoàn toàn.

Nếu bạn muốn giới thiệu tốt về COM, hãy đọc Essential COM của Don Box .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.