Hiểu COM là gì?

Component Object Model (COM)

Khi COM bắt đầu được nhắc đến, thì phải mất một thời gian khá dài tôi mới hiểu được COM là gì và tầm quan trọng của nó.

COM là một khái niệm rất trừu tượng, vì đại đa số những người lập trình không “thấy” COM. Khi chúng ta viết một dll hay một OCX trong VB là chúng ta đã làm một COM-object đó. Bởi vậy nhiều người tuy đã lập trình nhiều năm cũng không biết COM là gì, mà thật ra cũng không cần biêt nếu bạn không làm những chương trình đặc biệt, họac bạn muốn dùng những component viết bằng những ngôn ngữ khác như C và Java.

COM là gì?

[external_link_head]

COM là nền tảng “object model” cho ActiveX controls và OLE(Object Linking and Embedding ).

COM làm cho những chức năng trong một object có thể được những components và chương trình khác sử dụng. Nói một cách dễ hiểu hơn thì COM là một dao diện đứng ở giữa (giống như một thông dich viên) để cho 2 components viết bằng 2 ngôn ngữ khác nhau có thể hiểu nhau.

COM dùng vào việc gì?

Tất cả những ActiveX và rất nhiều components trong cách chương trình đều có sự hiện diện của COM, đủ thấy tầm quan trong của nó. Nhờ COM bạn có thể viết một COM-object trong VB (một .ocx chẳng hạn) rồi sau đó dùng nó trong những chương trình khác, thí dụ như trong Excel, Word, Access họac tất cả những chương trình có COM interface.

Nhưng tất nhiên COM không chỉ có như vậy. Bạn cứ thử nghĩ nếu công ty của bạn có nhiều lập trình viên mà mỗi người giỏi về một ngôn ngữ. Thí dụ bạn giỏi về C họac Java và tôi giỏi về VB. Làm một GUI (Graphic User Interface) trong C thì rất là tốn nhiều công, nhưng code của C thì rất là nhanh và làm được những việc mà VB không có thể làm được họac làm được nhưng tốc độ yếu, thi dụ như làm game 3D. Nhưng ngược lại làm GUI trong VB thì lại rất dễ và đẹp.

Với sự giúp đỡ của COM chúng ta có thể làm một COM-interface (người thông dich) với những methods trong C-components, sau đó là GUI trong VB và Implements COM-interface, sau đó trong VB chỉ việc gọi những methods trong C-components.

Như vậy chúng ta đã lấy những cái hay nhất của những ngôn ngữ để làm ra một chương trình hay nhờ COM. Cái lợi nữa là một CT có thể có các lập trình viên sử dụng ngôn ngữ khác nhau.

Nguyên tắc cơ bản của COM

[external_link offset=1]

I. Interfaces

để cho các components khác có thể “thấy” và dùng những chức năng của COM.

Interfaces giống như một chỗ trên bộ nhớ có những con trỏ đến các methods của một object. Ai đã dùng interface (TD: trong VB) se dễ hiểu vê interface hơn.

mỗi interface nằm trên nền tảng của một COM-interface gọi là IUnknown, interface này sẽ cho phép đi đến những interface khác của object đó.

mỗi interface có một khóa interface ID gọi là IID.

II. IUnknown

có 3 methods:

QueryInterface – giúp tìm đúng interface.

AddRef – đếm những object references (reference counting).

Release – cũng để đếm object references.

III. Reference Counting

khi một object không dùng nữa thì phải xóa nó khỏi bộ nhớ. Reference counting dùng để kiểm tra xem object đó còn hay không.

AddRef và Release dùng như tên của chúng, để đặt và xóa một reference.

IV. QueryInterface

Dùng để hỏi một object về một interface thì phải dùng QueryInterface . Để có thể tìm đựợc interface thì object đó phải dùng IID của interface đó. QueryInterface sẽ trả lại một con trỏ đến interface đó và đồng thời gọi AddRef.

Gọi một QueryInterface trong C thì như thế này:

PHP Code:

HRESULT QueryInterface(REFIID interface_idLPVOID FAR *iface);Gọi một Interface trong COM thì phải đi qua những bước nhất định đề có thể dùng COM objectsThí dụ sau dùng C++:HRESULT retValue CoInitialize(NULL);

if (retValue == S_OKthen{CoCreateInstance(CLSID_SOMEAPPNULLCLSCTX_LOCAL_SERVERIID_IUnknown,

(void**)&pIUnknown);retValue pIUnknown->QueryInterface(IID_SOMEINTERFACE,

(void**)&pISomeInterface);

if (retValue == S_OKthen{pISomeInterface->Method1();pISomeInterface->Method2();/* When finished with the interface, call its Release() method! */pISomeInterface->Release();

}

[external_link offset=2]

else

{/* Perform some default operation */DisableMenuItem(InterfaceMenu);

}CoUninitialize();

Vâng nhìn vào là thấy dội rồi đúng không các bạn (chắc không còn có người chê là dễ nữa đâu ), nhưng thật ra thì những code này cũng giống như khi chúng ta dùng winAPI, vì nó là như vậy chúng ta chi gọi những cái đã được định sẵn. Nhưng nói chung chúng ta không cần hiểu những code trên, đó chỉ là thí dụ để các bạn có khái niêm về nó thôi.

Dùng COM object trong Java

Bởi vì COM và Java gần giống nhau và Microsoft cũng làm cho những người dùng Java không phải đau đầu khi muốn dùng một COM-object, vì vậy một chương trình “Java Type Library Wizard” sẽ giúp người dùng Java làm Interface classes cho một COM-object. Khi chạy chương trình đó và cho nó biết COM object nào bạn muốn làm ra những interface class thì nó sẽ làm ra những class cần thiết để có thể gọi nhưng methods trong C/C++…..

Nguồn: http://www.khkt.net/chu-de/17832-com…-object-model/

[external_footer]