1
Đặt vấn đề
Những năm gần đây trong khoa học công nghệ đã có những bớc phát triển đột
phá, đặc biệt là trong công nghệ thông tin. Những ứng dụng hiệu quả của lĩnh vực
này nhanh chóng xâm nhập vào mọi hoạt động khác nhau của cuộc sống.
Thật vậy, trong lĩnh vực y-sinh mà cụ thể trong y-tế đã xuất hiện các phơng
pháp mới với thiết bị kỹ thuật tiên tiến có sự trợ giúp đắc lực của công nghệ thông
tin nhằm phục vụ chẩn đoán và điều trị bệnh. Có thể thấy rằng một trong những
công việc thờng xuyên phải làm là đo lờng các tham số phản ánh trạng thái của cơ
thể. Chính vì vậy để đáp ứng đợc nhu cầu này trên thực tế đã xuất hiện rất nhiều
chủng loại thiết bị kỹ thuật y tế khác nhau nh: máy điện tim, máy điện não, máy
siêu âm, máy chụp cát lớp, máy chiếu xạ, máy phân tích xét nghiệm vv trong đó
việc ứng dụng công nghệ thông tin đã đóng góp đáng kể cho ngành y tế, tạo điều
kiện thực hiện tốt các nhiệm vụ của ngành một cách nhanh chóng, chất lợng.
Nh vậy công nghệ máy tính, kỹ thuật điện tử và công nghệ phần mềm đã trở nên
những công cụ vô cùng quan trọng, không thể thiếu đợc trong các thiết bị điện tử y-
sinh hiện đại. Chúng là những bộ phận cấu thành nên hệ thống thiết bị, giúp thực
hiện những nhiệm vụ đặc biệt mà con ngời không thể thực hiện đợc hoặc nếu thực
hiện thì rất tốn kém và mất rất nhiều thời gian và thậm chí ảnh hởng đến tính mạng.
Đa số các thiết bị điện tử y-sinh hiện đại đều có hệ thống máy tính thu thập và xử lý
số liệu đo lờng y-sinh phục vụ việc phân tích chẩn đoán và ra quyết định điều trị. Vì
vậy xây dựng hệ thống thu thập số liệu đo lờng y-sinh có sự trợ giúp của máy tính và
công nghệ phần mềm là một trong những yêu cầu thiết yếu của ngành y tế trong nớc
nói chung và ở trong quân đội nói riêng.
Hiện nay hầu hết các phần mềm thu thập số liệu đo lờng nói chung đều đợc xây
dựng và phát triển dựa trên cơ sở các công nghệ COM, OLE, ActiveX. Do đó hiển
nhiên là cần tiến hành nghiên cứu các công nghệ này và các kỹ thuật phát triển phần
2
mềm dựa trên chúng đồng thời nghiên cứu bản chất, đặc điểm của các tín hiệu điện
sinh học để từ đó xây dựng hệ thống máy tính thu thập số liệu đo lờng y-sinh.
Với ý đồ nh trên, tôi đã chọn đề tài nghiên cứu " ứ
!"#$", cụ thể là nhằm xây
dựng hệ thống thu thập số liệu 16 kênh tín hiệu từ thiết bị điện não đồ EEG-7400
của hãng NIHON KOHDEN (Nhật bản) thông qua card thu thập số liệu đa kênh
AX5210H của hãng AXIOM. Hệ thống này có ý nghĩa lớn đối với việc phân tích,
chẩn đoán điện não đồ trong các bệnh viện. Để thực hiện nhiệm vụ này luận văn sẽ
giải quyết những nội dung chính sau:
%&'()*!+
Tìm hiểu các khái niệm và đặc điểm cơ bản của công nghệ COM, OLE,
ActiveX. Đặc biệt chú trọng đến công nghệ COM và vấn đề lập trình theo giao diện-
một phong cách lập trình của COM. Bản chất và những u điểm bên trong của COM
sẽ đợc bộc lộ thông qua việc xem xét các đoạn mã lệnh trong C/ C
++
, Java hoặc
Visual Basic.
%,' T-!$./0#1234!$
Tìm hiểu bản chất, đặc điểm của tín hiệu điện sinh học và đặc điểm đo lờng các
chỉ tiêu y-sinh. Tạp âm, nhiễu trong tín hiệu điện sinh học, các bộ khuyếch đại tín
hiệu điện sinh học và các phơng pháp lọc nhiễu đợc đề cập đến ở đây.
Chơng 1 và chơng 2 sẽ làm cơ sở để tiến hành nghiên cứu và tìm hiểu các vấn
đề trong chơng 3.
%5' ứ!67
$!$
Xem xét tổ chức hệ thống phần cứng thu thập các kênh tín hiệu từ thiết bị điện
não đồ EEG-7400. Sử dụng công nghệ COM, OLE, ActiveX xây dựng mô hình,
thuật toán và chơng trình thu thập số liệu đồng thời 16 kênh tín hiệu điện não. Do
công nghệ COM cho phép tận dụng thế mạnh của các ngôn ngữ lập trình khác nhau,
3
nên chơng trình sẽ đợc xây dựng dựa trên cả hai ngôn ngữ Visual Basic và Visual C
+
+
. Visual Basic sẽ đợc sử dụng để thiết kế giao diện chơng trình và giải quyết các
nhiệm vụ ở mức cao (mức ngời dùng), còn Visual C
++
sẽ giải quyết các vấn đề ở mức
thấp (mức phần cứng).
89":!6; Trong phần này sẽ tổng kết các vấn đề đã đợc nghiên cứu tìm
hiểu trong luận văn và đa ra kết luận về đánh giá kết quả cũng nh các hớng phát
triển tiếp theo.
Chơng 1
Tổng quan về công nghệ COM, OLE, ACTIVEX
1.1 Những vấn đề cơ bản về COM
1.1.1 COM là gì?
Trớc hết COM là chữ viết tắt trong thuật ngữ tiếng Anh: 17<=
1 nghiã là 1>?/79. Có rất nhiều cách hiểu khác nhau về
thuật ngữ này, dới đây nêu ra một vài quan niệm về COM :
COM là kiến trúc phần mềm cho phép xây dựng các hệ thống và các ứng dụng
từ các thành phần cung cấp bởi các dịch vụ phần mền khác nhau. Nó cũng là kiến
trúc cơ sở để xây dựng nền tảng cho các dịch vụ phần mềm ở mức cao hơn.
COM là một đặc tính dùng để viết các phần mềm có khả năng tái sử dụng chạy
trên các hệ thống máy tính đợc xây dựng dựa trên cơ sở là các thành phần của nó.
COM là một cấu trúc hạ tầng phức tạp cho phép các khách hàng và các đối t-
ợng giao tiếp thông qua quá trình và phạm vi của máy chủ.
COM là một phong cách lập trình chứa tập các quy tắc cần thiết để làm việc
trong môi trờng lấy Microsoft làm trọng tâm(làm nhân).
vv.
4
Nhng có lẽ các cách hiểu khác nhau về COM nh vậy có thể thâu tóm lại trong
một khái niệm tổng quát nh sau: /1@A#B*!:2C
D7D<BD>/1ED@2F.
Trong hệ thống phần mềm máy tính, COM dựa trên việc tái sử dụng dới dạng
mã nhị phân, gọi là tái sử dụng nhị phân, có nghiã là các thành phần (chơng trình
phần mềm) của COM có thể sử dụng lại ở mọi nơi trong một PC hay một mạng
LAN hoặc một hệ thống thông tin lớn mà không cần biết về mã chơng trình nguồn
đã xây dựng lên nó, tức là không phụ thuộc vào mã nguồn. Đây là một trong những
khía cạnh có ý nghĩa vô cùng to lớn của COM.
COM đợc xây dựng dựa trên lập trình theo giao diện. Đây là một phong cách lập
trình mà giao diện đợc tách ra khỏi quá trình thực thi của đối tợng thành phần- là
một hay một vài đoạn mã nằm ở nơi nào đó trong bộ nhớ. Lập trình giao diện đã đợc
khám phá trong các ngôn ngữ nh C/ C
++
và SmallTalk bởi các nhà phát triển phần
mềm khi họ phát hiện ra rằng việc sử dụng các giao diện riêng biệt sẽ cho phép họ
bảo trì và mở rộng các ứng dụng lớn một cách dễ dàng hơn. Các giao diện giải
quyết đợc nhiều vấn đề liên quan đến việc tái sử dụng mã trong lập trình hớng đối t-
ợng. Điểm mạnh của lập trình hớng đối tợng OOP(<=D8DD+11)
là cho phép kế thừa mã thực thi. Kiểu kế thừa này thờng tạo ra sự ảnh hởng, phụ
thuộc cứng lẫn nhau giữa các thành phần trong hệ thống, vì vậy gây ra nhiều khó
khăn khi bảo trì và mở rộng cho một hệ thống lớn. Mặc dù Visual Basic không hỗ
trợ tính thừa kế mã thực thi nhng từ Visual Basic 5.0 trở đi đã bổ xung, hỗ trợ việc
GH+/2+ngời dùng. Sau đây sẽ đi tìm hiểu về lập trình
theo giao diện, một phong cách lập trình trong COM.
1.1.2 Lập trình theo giao diện
a/.Các lớp, các đối tợng và client
5
Trong mục này ta coi là đã làm quen với một ngôn ngữ lập trình hớng đối tợng,
chẳng hạn nh C/C
++
. Vì vậy các khái niệm: +$$<= (lớp, đối tợng,
khách) trong ngôn ngữ sẽ không đợc đề cập lại ở đây. Sau đây chúng ta sẽ tìm hiểu
mối quan hệ giữa một client và một lớp.
Trong mô hình hớng đối tợng một client thờng sử dụng một đối tợng đợc tạo ra
từ một lớp. Trong Visual Basic, client thờng tạo ra đối tợng bằng cách dùng toán tử
IJ đi sau tên của một lớp. Sau khi đối tợng đã đợc tạo ra, client sử dụng đối tợng
bằng cách truy cập đến một trong các thuộc tính và phơng thức có sẵn của nó thông
qua một biến, đó là một tham chiếu dựa vào lớp để truy cập các /4!
của một đối tợng. Ví dụ, giả sử ta có một lớp , đoạn mã lệnh trong Visual Basic
dới đây sẽ tạo ra đối tợng K và sử dụng các thuộc tính và phơng thức của nó:
Dim Dog as Cdog ' L+<21@<:?
Set Dog=IJ Cdog ' MD+1@?N4/K
Dog.Name="Snoopy" ' (D!67:1@!@-
Dog.Park ' (.1@7%O
Trong ví dụ này rõ ràng việc truyền thông giữa client và đối tợng đợc thực hiện
thông qua việc truy cập đến một tập các thuộc tính tiềm ẩn và các phơng thức chung
và tập hợp này đợc biết đến nh là một +!của đối tợng.
Một ích lợi to lớn của lớp là cho phép tái sử dụng mã, có nghĩa là có thể dùng
lớp ở mọi chỗ trong một ứng dụng, giúp giảm tối thiểu mã thừa. Ngoài ra, các thuộc
tính và các phơng thức của lớp có thể loại bỏ đợc nếu nó không phải là !@-/
7%O!. Việc cải tiến các phơng thức của lớp chỉ đòi hỏi cú pháp gọi nó
không đợc thay đổi. Có nghĩa là chừng nào giao diện chung vẫn đợc giữ nguyên thì
có thể tạo ra bất kỳ sự thay đổi nào để cải tiến, thay đổi mã của một lớp mà không
làm ảnh hởng đến mã của client. Tuy nhiên một khi đã đa vào giao diện chung của
lớp một thuộc tính hoặc một phơng thức thì chúng ta không thể loại bỏ chúng đợc,
6
khía cạnh này mang tính chất cội nguồn, có nghĩa là giao diện chung phải đợc thiết
kế thật cẩn thận ngay từ đầu và sử dụng các quy tắc mà lớp đề ra. Từ đó cho phép
cải tiến, mở rộng mã đối tợng mà không phải viết lại mã client bằng cách sửa các lỗi
và nâng cấp thực hiện các phơng thức. Các client mới đợc xây dựng sau khi lớp đợc
sửa đổi hoặc nâng cấp có thể lấy đợc các u việt của bất cứ những gì đợc bổ xung vào
giao diện.
Ví dụ, hãy tởng tợng một phơng thức PD đợc thực hiện sau khi kết thúc
phơng thức sủa Q+D" của chó, phơng thức PD đợc định nghĩa trong lớp
với tham số là số nguyên 16 bit cho phép client yêu cầu số lần lăn của chó sau khi
kết thúc sủa:
Public Sub RollOver( ByRef Rolls as Integer)
'RS+7%O/E
End Sub
Mã thực hiện trong client nh sau:
Dim Dog As Cdog, Rolls As Integer
Set Dog = New Cdog
Rolls=2000
Dog.RollOver Rolls
Khi client chỉ yêu cầu số lần lăn nằm trong khoảng số nguyên 16 bit nh trong ví
dụ trên thì ứng xử diễn ra bình thờng. Nhng khi client nuốn kích hoạt phơng thức
PD với giá trị nằm ngoài khoảng giá trị của số nguyên 16 bit thì sao? Lúc này
phải thay đổi kiểu tham số của phơng thức PD cho phù hợp với yêu cầu của
client, chẳng hạn sử dụng kiểu số nguyên dài 32 bít (TDD). Đây là vấn đề
nan giải thuộc về thiết kế và chỉ có hai cách để giải quyết các vấn đề nh thế, đó là:
thay đổi dấu hiệu của phơng thức sau đó viết lại toàn bộ mã của client gọi đến nó
hoặc để nguyên mọi thứ nh vậy và tìm cách loại bỏ các hạn chế của thiết kế ban đầu.
7
Tuy nhiên với mục đích bảo trì và mở rộng, có một cách trong thiết kế là không định
nghĩa một phơng thức hay một thuộc tính ở trong giao diện chung nếu nó không đợc
coi là sẽ tồn tại lâu dài. Vì vậy các lập trình viên có kinh nghiệm thờng khai báo
toàn bộ tiềm năng dữ liệu ở kiểu thuộc tính riêng (8D+) và cho phép truy cập vào
trạng thái của đối tợng thông qua các phơng thức chung (8!<), mà bất kỳ thành
viên nào đợc khai báo kiểu riêng đều có thể thay đổi hoặc loại bỏ đợc, do đó ngăn
chặn đợc mọi sự phụ thuộc của client vào việc xắp xếp dữ liệu thực của lớp.
b/.Kế thừa thực thi
Đây là đặc điểm rất phổ biến của OOP trong các ngôn ngữ C
++
, SmallTalk và
Java. Kế thừa thực thi là một trong những cách để có đợc sự tái sử dụng mã trong
mô hình hớng đối tợng. Trong kế thừa thực thi khi một lớp đợc định nghĩa nó có thể
dùng lại mã của một lớp khác. Visual Basic hiện thời cha đợc hỗ trợ tính chất kế
thừa thực thi, do đó lấy Java để làm ví dụ giải thích kế thừa thực thi là nh thế nào.
Xét lớp Cdog của Java nh sau:
Class Cdog
{
Public String Name;UU(DM2S+NV$+W
Public void Bark()UUX/S+N
{/*Mã thực thi phơng thức ở đây*/}
Public void RollOver(int Rolls)UUX/S+N
{/*Mã thực thi phơng thức ở đây*/}
}
Lớp Cdog ở trên đợc xem nh là F7D4, lớp Cbeagle sau đây, đợc gọi là F7F
mở rộng lớp Cdog. Nó kế thừa toàn bộ các tiềm năng và phơng thức của lớp Cdog,
tức là lớp Cbeagle có thể dùng lại tất cả những gì mà Cdog có:
// Subclass
8
Class CBeagle extends CDog
{
// Trạng thái chó Beagle:
// (!@-Y4Y?":Z+Z.
Public String Color; UU(!@-1F41/V1/!W
// ứng xử của chó Beagle:
// 8%OPDVW?":Z+Z
// ẩn thực thi phơng thức Bark() của lớp Cdog:
Public void Bark()
{/* Mã thực thi phơng thức Bark() cho lớp CBeagle */}
// Cbeagle mở rộng CDog bởi việc thêm phơng thức mới:
Public void FetchSlippers()
{/* Mã thực thi phơng thức mới FetchSlippers ()*/}
}
Trong đoạn mã trên chỉ ra rằng: có thể mở rộng đó bằng cách loại bỏ mã
thực thi phơng thức của nó nh trong trờng hợp phơng thức Q+D" và có thể thêm vào
phơng thức mới nh phơng thức [\77D$. Kế thừa thực thi đợc sử dụng chỉ khi
tồn tại mối quan hệ "là"(is a) giữa lớp trên và lớp dới, trong ví dụ trên chúng ta có
thể nói "con chó săn là một con chó(a beagle is a dog)", vì vậy nó đã áp dụng kế
thừa thực thi và đợc mô tả nh trên hình 1.1.
Tơng tự nh vậy cũng có thể bổ xung thêm các tiềm năng mới khi định nghĩa lớp
dới. Nếu ta tiếp tục định nghĩa một lớp mới sử dụng lại mã của lớp Cbeagle và cứ
nh vậy vv thì sẽ hình thành nên cái gọi là thứ bậc kế thừa trong đó chứa các mức kế
thừa đợc mô tả trên hình 2.2 giữa lớp trên và lớp dới. Đến đây chúng ta thấy rằng chỉ
cần một biến đổi đơn lẻ ở các lớp trên, các lớp dới thứ bậc kế thừa sẽ tự động thừa h-
ởng các thay đổi này.
9
H×nh 1.1-KÕ thõa thùc thi cho phÐp mét líp t¸i sö dông tr¹ng th¸i vµ øng xö
cña mét líp kh¸c
H×nh 1.2-Thø bËc kÕ thõa chØ ra c¸c mèi quan hÖ gi÷a c¸c líp trªn vµ c¸c líp
díi trong mét øng dông
Cdog
Bark
RollOver
Name
Cbeagle
Bark
Color
Cbeagle kÕ thõa tõ Cdog
Cbeagle
Bark
FetchSlippers
Name
Cterrier
Bark
ChaseCar
Name
Cboxer
Bark
ScareMailman
Name
Cdog
Bark
RollOver
Name
10
Tóm lại, tính kế thừa thực thi cho phép một lớp tái sử dụng mã của một lớp khác
và nếu tính chất này đợc sử dụng một cách đúng đắn thì nó sẽ trở thành một phơng
pháp rất hiệu quả để bảo trì và mở rộng mã.
*.(-+>#V81D7$1W: đây là một đặc điểm rất quan trọng khác
nữa của OOP, cho phép một client có thể tham chiếu nhiều đối tợng khác nhau theo
cùng một cách thức cho dù chúng đợc tạo ra từ các lớp khác nhau và có những ứng
xử khác nhau, nhng tất nhiên các lớp này phải đợc mở rộng cùng từ một lớp nào đó.
Hình dới đây mô tả một client có thể sử dụng tham chiếu để truyền thông với
ba kiểu đối tợng:
Hình 1.3-Kế thừa thực thi mang tính đa hình
Xét đoạn mã Java sau:
// Phơng thức này chấp nhận tất cả các đối tợng tợng tơng thích với lớp ://
Public void MakeDogBark(CDog Dog)
{
Dog.Bark() // 2?"2+!N#$]27O"2+! //
}
<+
object
DDD
object
<D
object
Client
Tham chiếu dựa trên Cdog
11
Trong đoạn mã này, client tham khảo đến lớp K khi biết chắc rằng lớp này đ-
ợc mở rộng từ lớp (thể hiện trong phần khai báo của phơng thức
MakeDogBark). Client không cần quan tâm đến việc các lớp dới K có dùng mã
thực thi của phơng thức Q+D" của lớp trên cấp hay nó thực hiện phơng thức này
bởi mã thực thi riêng của nó, mà chỉ đơn giản gọi phơng thức bằng cú pháp gọi đã đ-
ợc định nghĩa trong lớp (chúng ta đã biết rằng, khi một lớp dới đợc mở rộng từ
một lớp trên thì cú pháp gọi của các phơng thức thừa kế từ lớp trên trong lớp dới vẫn
phải dữ nguyên nh cũ). Từ đây có thể nêu ra một số vấn đề liên quan đến kế thừa
thực thi nh sau:
Kế thừa thực thi phá vỡ sự trọn vẹn của các thành viên mang tính chất riêng.
Các ngôn ngữ hỗ trợ tính kế thừa thực thi cung cấp một mức truy cập có bảo vệ cho
các tính chất riêng và tính chất chung: trong trờng hợp các thuộc tính và các phơng
thức đợc đánh dấu bảo vệ thì nó là ẩn đối với client nhng vẫn truy cập đợc bởi các
lớp dới. Do mối quan hệ mật thiết giữa lớp trên và lớp dới dẫn đến hình thành nên
một loạt các quan hệ phụ thuộc cứng.
Kế thừa thực thi có phong cách phát triển thuộc kiểu tái sử dụng hộp trắng, các
lớp trong thứ bậc kế thừa có quan hệ chặt chẽ với nhau. Trong các ứng dụng việc
thay đổi ký hiệu của một thuộc tính hoặc phơng thức ở tầng trên có thể phá vỡ hàng
chục hoặc hàng trăm lớp đang kế thừa ở tầng dới. Mặt khác sự bất định trong các
giao diện chung đợc bảo vệ của các lớp trên chủ chốt thờng dẫn đến khó khăn cho
việc mở rộng hệ thống.
Những điều trình bày ở trên chỉ ra rằng kế thừa thực thi chỉ có hiệu quả trong
những hoàn cảnh thích hợp, nó đợc sử dụng tốt nhất trong các ứng dụng nhỏ và các
tình huống đợc kiểm soát. Còn trên thực tế, việc tạo ra một thứ bậc kế thừa lớn, phức
tạp để thoả mãn các yêu cầu của một ứng dụng là vợt quá tầm với của tất cả, ngoại
12
trừ các lập trình viên có kinh nghiệm trong lập trình hớng đối tợng. Chính vì hạn chế
nh vậy của kế thừa thực thi mà đã trì hoãn trong thời gian dài sự phát triển của các
hệ thống lớn. Để khắc phục các kỹ s lập trình đã tìm ra đợc các phơng pháp tái sử
dụng mã mà không làm tổn hại đến khả năng mở rộng của các hệ thống lớn. Một
trong những phơng pháp đó đã xuất hiện trong phong cách lập trình giao diện cơ sở
và phát triển theo kiểu cấu thành đối tợng. Trong kiểu lập trình này, giao diện chung
đợc tách ra khỏi quá trình thực thi của đối tợng.
c/.Tách biệt giao diện khỏi quá trình thực thi
Phân tách giữa giao diện và thực thi là để hình thành nên việc tái sử dụng hộp
đen, đây cũng là một cách để cấu thành lên một đối tợng. Có nghĩa là giao diện sẽ
trở thành thuộc tầng trên cùng, nó là một kiểu dữ liệu độc lập đợc định nghĩa trên
chính nó và giao diện chung đợc định nghĩa bên trong của định nghiã lớp, đây là
một sự phát triển mạnh của OOP. Trong giao diện sẽ chứa tập các ký hiệu định
nghĩa cú pháp gọi chung đáp ứng các yêu cầu của client và nh vậy giao diện là một
tầng trung gian giữa client và các lớp thực thi, tách biệt các lớp với client sử dụng
nó. Ta có thể hình dung giao diện chung nh là một cam kết giữa client với các lớp.
Có thể dùng giao diện để tạo một tham chiếu đến đối tợng nhng không thể tạo đối t-
ợng từ giao diện. Điều này hoàn toàn có lý bởi vì một đối tợng đợc tạo ra đòi hỏi
phải có các tài nguyên dữ liệu và các thực thi phơng thức mà những thứ này lại
không có trong giao diện.
Có thể nhiều lớp thực thi cùng một giao diện: một giao diện định nghĩa cú pháp
gọi chính xác và cung cấp ngữ nghĩa không xác định trớc cho các phơng thức, điều
này cho phép mỗi tác giả của lớp tự do xác định ứng xử của đối tợng phù hợp với
từng phơng thức, phù hợp với yêu cầu riêng của mình.
*.Tính hai mặt của kế thừa: nh vậy giờ đây có hai loại kế thừa, đó là kế thừa
thực thi và kế thừa giao diện. Cả hai đều đem lại hai tính chất quan trọng là tính chất
13
tái sử dụng mã và tính đa hình thể, mỗi một kiểu kế thừa đều có những u điểm và
hạn chế riêng:
Kế thừa thực thi dựa trên tái sử dụng hộp trắng, do đó nó mạnh hơn rất nhiều
so với kế thừa giao diện trong việc tái sử dụng trạng thái và các phơng thức. Tuy
nhiên việc tái sử dụng này thờng phải trả giá cho các hạn chế khi mở rộng các hệ
thống lớn.
Kế thừa giao diện dựa trên việc tái sử dụng hộp đen, có nghĩa là giao diện
chung của lớp không hề biết gì về các mã thực thi các phơng thức. Mã thực thi đợc
đặt trong các lớp tách biệt khỏi giao diện cho phép thiết kế các ứng dụng kiểu leo
thang, phát triển dần dần. Vì vậy kiểu kế thừa này giải quyết đợc nhiều hạn chế liên
quan đến tái sử dụng hộp trắng.
Trên đây đã trình bày tóm tắt những khái niệm về lập trình theo giao diện. Để có
đợc sự hiểu biết sâu sắc, thành thạo với kiểu lập trình này đòi hỏi phải tốn nhiều thời
gian. ở đây không đi sâu vào phong cách lập trình này mà chỉ lợc qua để có một cái
nhìn chung về những kiến thức căn bản phục vụ việc hiểu những phần dới đây, đặc
biệt là về COM.
Các ngành công nghiệp đã chấp nhận phong cách lập trình theo giao diện do
những giới hạn của việc sử dụng tham chiếu dựa theo lớp và kế thừa thực thi. COM
đợc hình thành dựa trên các khái niệm cốt lõi của lập trình theo giao diện:
COM yêu cầu sự tách biệt về hình thức giữa giao diện và thực thi, nghĩa là nó
đòi hỏi các client truyền thông với các đối tợng thông qua các tham chiếu giao diện.
Điều này đảm bảo rằng các client không bao giờ xây dựng các ràng buộc với các lớp
phục vụ cho các đối tợng và cho phép các lập trình viên COM xem mã đối tợng của
họ mà không lo ngại về sự phá vỡ mã của client.
14
Các client có thể nhận đợc các thông tin kiểu thời gian chạy từ các đối tợng
bằng cách chất vấn thờng xuyên và hỏi xem đối tợng có hỗ trợ giao diện không. Nếu
không hỗ trợ, client có thể phát hiện điều này và bỏ qua đối tợng một cách dễ dàng.
Điều này cho phép các lập trình viên xem lại các thành phần và các ứng dụng một
cách độc lập. Các client cũ và các đối tợng cũ vẫn có thể làm việc nhịp nhàng với
các client mới và các đối tợng mới: đây chính là chìa khoá để tạo phiên bản trong
COM. Tuy nhiên COM phải làm việc xuyên qua các thành phần nhị phân và nó phải
giải quyết rất nhiều vấn đề tại mức vật lý để lấy đợc những ích lợi của lập trình theo
giao diện. Tiếp sau đây chúng ta sẽ điểm qua một số đặc trng tiêu biểu của COM,
rồi xem xét các thành phần bên trong của nó ở mục tiếp theo.
1.1.3 Các đặc trng chủ yếu của COM
COM cho phép các nhà lập trình có thể gửi đi các tệp nhị phân của mình mà
vẫn giấu đợc các thuật toán thực hiện ở bên trong. Đặc tính tái sử dụng mã nhị phân
của COM cho phép loại trừ đợc nhiều vấn đề xẩy ra trong khi biên dịch lại các ch-
ơng trình hoặc hệ thống chơng trình cải tiến và phát triển trên cơ sở sử dụng lại mã
nguồn. Điều này thể hiện ở chỗ: sự cải tiến và phát triển hệ thống chơng trình chủ
yếu chỉ tác động vào các thành phần COM hoặc biên dịch lại các thành phần của
COM dựa trên các thành phần COM đã có. Ví dụ đối với một phần mềm ứng dụng
đợc xây dựng dựa trên các mô hình COM, khi muốn thay đổi (chẳng hạn nh sửa
lỗi, vv) trong chơng trình thì chỉ cần tác động đến th viện liên kết động ( các tệp
dạng FileName.DLL) của nó, do các thành phần mô hình COM đợc chứa trong đó.
Các th viện này sẽ đợc biên dịch lại và đợc đa trở lại môi trờng mà không phơng hại
đến bất kỳ một ứng dụng nào đang sử dụng nó (các ứng dụng này đợc gọi là các
khách hàng). Điều này khoa học và hiệu quả hơn hẳn so với các chơng trình phần
15
mềm, hệ thống chơng trình đợc xây dựng dựa trên việc tái sử dụng mã nguồn, trong
đó mỗi một sự thay đổi nhỏ đều đòi hỏi phải biên dịch lại từng dòng lệnh trong ứng
dụng, một công việc vô cùng nặng nhọc và gây nhiều khó khăn và tốn kém cho việc
bảo trì, phát triển và mở rộng hệ thống.
Các thành phần COM cơ sở có thể đợc xây dựng trên các ^67D>
@67"2+!. Đặc điểm quý báu này của mô hình đối tợng thành phần có ý
nghĩa vô cùng to lớn trong việc tập trung lực lợng và trí tuệ của các lập trình viên ở
mọi nơi, đặc biệt khi tiến hành xây dựng các hệ thống hoặc các dự án phần mềm
lớn. Mỗi lập trình viên hoặc một nhóm lập trình có nhiệm vụ xây dựng lên các thành
phần khác nhau của hệ thống trên ngôn ngữ lập trình riêng, phụ thuộc vào chuyên
môn và khả năng thực thi của họ. Chẳng hạn đối với nhóm yêu cầu mã chơng trình
hệ thống ở mức thấp thì có thể sử dụng ngôn ngữ C
++
hoặc hợp ngữ (Assembler), với
yêu cầu quản trị cơ sở dữ liệu của hệ thống có thể sử dụng ngôn ngữ lập trình nh
Visual Basic để đạt đợc hiệu quả cao hơn. Đặc điểm này quyết định sự tồn tại của
các hãng phần mềm lớn và họ đã khai thác khía cạnh tuyệt vời này của COM để sử
dụng một cách hiệu quả các nhóm lập trình hiện có của mình.
Các thành phần của COM đợc tạo ra dựa trên kiểu lập trình hớng đối tợng
OPP, có nghĩa là mô hình đối tợng thành phần liên quan đến quá trình giao tiếp giữa
các khách hàng và các đối tợng. Lập trình kiểu OOP cho phép việc tái sử dụng nhị
phân của COM đạt hiệu quả cao hơn so với các kiểu lập trình khác. Các client và các
lớp của COM thờng tồn tại trong các tệp nhị phân riêng biệt, chúng sẽ đợc kết nối
với nhau trong thời gian chạy.
16
COM có khả năng liên quá trình, điều này cho phép tạo ra các đối tợng trong
các qúa trình hoàn toàn tách biệt và trên các máy tính ở xa. Đây là công nghệ cốt lõi
sử dụng trong lập trình phân tán. Việc kết hợp sức mạnh của cả hai kiểu lập trình h-
ớng đối tợng và lập trình phân tán sẽ tạo ra một mô hình lập trình mạnh hơn rất
nhiều.
COM tạo ra khả năng nh nhau cho các client và các đối tợng cho dù chúng
đang giao thiệp với một máy chủ liên tiến trình hoặc một máy chủ ngoài tiến trình.
Đây là đặc tính cực mạnh của COM đợc gọi là tính chất "D$!GD-Y. Toàn bộ
các công việc phức tạp để chuẩn bị, gửi, nhận các gói tin của mạng đợc thực hiện
bởi cơ sở hạ tầng phân tán của COM.
Trớc đây khi cha xuất hiện công nghệ COM, các nhà lập trình xây dựng các
phần mềm ứng dụng lớn bằng cách biên dịch và liên kết hàng nghìn tệp mã nguồn
đơn lẻ để tạo ra 1@_ .EXE(ứng dụng nguyên khối) chạy độc lập, điều này dẫn
đến kích thớc của các tệp thực hiện lớn và mất nhiều thời gian khi chạy. Ngoài ra
mỗi khi thực hiện một sửa đổi bất kỳ vào mã nguồn của chơng trình đòi hỏi toàn bộ
ứng dụng phải đợc biên dịch lại từ đầu, điều này gây nên nhiều trở ngại cho việc duy
trì, sửa chữa, bổ xung, cải tiến và phát triển phần mềm ứng dụng. Phát triển thành
phần cơ bản đã giải quyết đợc các khó khăn đó và nhiều vấn đề khác liên quan đến
kiểu lập trình ứng dụng nguyên khối nh đã nêu ra ở trên. Các thành phần nhị phân
cho phép cập nhật đến nó một cách độc lập và có thể sử dụng ngay, do đó làm đơn
giản hơn việc duy trì và mở rộng ứng dụng sau khi đã đợc cài đặt trong sản phẩm.
Với các tính chất đã nêu trên đây, COM thực sự là một công nghệ thành phần cơ
bản có ý nghĩa to lớn trong việc phát triển các phần mềm ứng dụng và các hệ thống
thông tin lớn.
17
1.1.4 Các thành phần cơ bản của COM
Trớc khi xem xét các thành phần cơ bản của COM, ta tìm hiểu về một số khái
niệm quan trọng liên quan đến mô hình đối tợng thành phần:
Chuẩn nhị phân(Binary Standard):
Chuẩn nhị phân là một khái niệm vô cùng quan trọng, là một trong những yếu tố
quyết định sự tồn của COM. Đối với bất kỳ một nền cơ sở nào đợc đa ra(sự kết hợp
của phần cứng và hệ điều hành), COM đều có một cách thức chuẩn để bố trí các
<BO`BVtable (Virtual function table) trong bộ nhớ và một cách thức
chuẩn để gọi các chức năng thông qua con trỏ Vtable. Cấu trúc bảng chức năng ảo
Vtable trong bộ nhớ đợc gọi là "!aG7" bởi vì ở mức nhị phân nó hoàn
toàn đợc xác định bởi giao diện riêng biệt và môi trờng nền. Vtable không phụ thuộc
vào ngôn ngữ lập trình hoặc công cụ để tạo ra nó, vì vậy bất kỳ ngôn ngữ nào có khả
năng gọi các hàm thông qua con trỏ (nh ngôn ngữ C/C
++
, Small Talk, Ada, và thậm
chí cả Basic) đều có thể đợc sử dụng để tạo ra các thành phần có khả năng tơng tác
với nhau thông qua Vtable, tức là thông qua chuẩn nhị phân. Sự thực hiện hai hớng
kép(khách hàng giữ một con trỏ trỏ đến một con trỏ Vtable) cho phép Vtable chia sẻ
với nhiều đối tợng (trờng hợp cụ thể của lớp) đợc tạo ra từ cùng một lớp. Trong một
hệ thống với hàng trăm đối tợng, sự chia sẻ trong Vtable có thể giảm đáng kể yêu
cầu về dung lợng bộ nhớ. Nguyên lý bảng chức năng ảo Vtable trong mô hình COM
đợc thể hiện trên hình 1.4.
Client
Variable
Component
Object
Vtable pointer
(Private object
data)
Pointer to function
Pointer to function
Pointer to function
Function(pObj,ag1,ag2 )
{
}
Vtable
18
Hình 1.4-Client liên kết với đối tợng thông qua Vtable
Đối tợng và thành phần (Object, Component):
Để dễ hiểu, trong COM, một đối tợng là một vài đoạn mã đã đợc biên dịch nhằm
cung cấp một vài dịch vụ cho hệ thống. Để tránh nhầm lẫn, tốt nhất có thể xem một
đối tơng COM nh là một "đối tợng thành phần"(Component Object) hoặc đơn giản
hơn là một "thành phần"(Component). Điều này cho phép phân biệt các đối tợng
COM với các đối tợng dạng mã nguồn của ngôn ngữ lập trình hớng đối tợng OPP ví
dụ nh của ngôn ngữ C
++
. Các đối tợng thành phần hỗ trợ một giao diện cơ sở gọi là
Tb"J (phần sau sẽ tìm hiểu về giao diện này) đồng hành với tất cả các giao
diện khác, phụ thuộc vào các chức năng mà đối tợng thành phần muốn lộ ra.
Các đối tợng thành phần thờng có một vài dữ liệu kết hợp. Không giống các đối
tợng của C
++
, các đối tợng thành phần COM không bao giờ cho phép truy cập đầy đủ
trực tiếp đến một đối tợng khác mà luôn phải thông qua các Dc+. Đây
là đặc trng cơ bản của mô hình đối tợng thành phần COM, bởi ví nó cho phép COM
hoàn toàn duy trì đợc việc thâu tóm và xử lý dữ liệu-một yêu cầu cơ bản của một
chuẩn phần mềm thành phần thực sự. Khi toàn bộ sự truy cập dữ liệu thông qua các
phơng thức nằm ở một đối tợng trung gian(Proxy Object) thì nó cho phép thể hiện
tính "trong suốt "(thể hiện ở các lời gọi ngang quá trình hoặc ngang qua mạng)
Nh vậy với những tính chất trên đây, mô hình đối tợng thành phần là chuẩn nhị
phân nó đợc xây dựng dựa trên phong cách lập trình theo giao diện, trong đó những
yếu tố cơ bản gồm , +, F7 và ?. Các lớp đợc định nghĩa trong
các tệp nhị phân (ví dụ nh các th viện liên kết động DLL) gọi là các $DD. Chúng
cung cấp các khả năng cho client và tạo ra sự kết nối, tham chiếu giữa client với các
đối tợng có mã nhị phân tơng ứng trong tệp. Sau khi client đã kết nối đợc với một
đối tợng, để đạt đợc mục tiêu nó chỉ cần kích hoạt một phơng thức nào đó của đối t-
19
ợng, tất nhiên điều này chỉ thực hiện đợc trong các môi trờng lập trình hớng đối tợng
(OOP).
Trên đây là một vài khái niệm cơ bản trong mô hình đối tợng thành phần. Dới
đây sẽ lần lợt đi vào tìm hiểu các thành phần cơ bản trong COM:
a/.Đối tợng
Đối tợng có ba đặc trng cơ bản, gồm: 6MDM2/2/O
d (phơng thức hoạt động). Nhận dạng là đặc trng mang tính duy nhất để nhận ra
đối tợng từ nhiều đối tợng khác. Trạng thái là sự kết hợp dữ liệu với một đối tợng
riêng biệt. Hành vi ứng xử là thiết lập một phơng thức để hỏi hoặc vận dụng một
trạng thái của một đối tợng.
Cách tiếp cận để xây dựng mô hình đối tợng trong môi trờng máy tính và hệ
thống truyền thông đòi hỏi phải có phơng pháp định vị đợc các thành phần của đối t-
ợng một cách chính xác và có tổ chức, chính vì vậy COM đã đa ra mô hình đối tợng
thông qua một giao diện chung và sự thực thi của chúng. Các chơng trình ứng dụng
chỉ có thể tơng tác với các đối tợng thông qua giao diện chung bởi con trỏ giao diện.
Đặc tính của đối tợng bằng cách này hay cách khác đợc liên hệ với con trỏ này, còn
việc đối tợng đợc định vị ở đâu hoặc nó đợc bố trí nh thế nào trong bộ nhớ sẽ không
đợc COM quan tâm đến. Tiếp theo đây xem xét sâu hơn về giao diện trong COM.
b/.Giao diện
Giao diện là một cấu trúc dữ liệu trung gian giữa mã của client và sự thực thi của
đối tợng mà thông qua đó client có thể sử dụng các dịch vụ của đối tợng. Do đó có
thể nói: giao diện là tập hợp các thành viên có quan hệ với nhau xác định chức năng
và cách thức hoạt động cho phép client truy cập thực thi đối tợng, công việc này có
thể diễn ra cục bộ hoặc từ xa. Trong giao diện không mô tả tỉ mỉ các phơng thức tiến
hành mà chỉ cung cấp các thông tin đặc trng phục vụ cho thiết lập các thao tác,
chẳng hạn nh các định nghĩa chính xác cú pháp của các phơng thức, định nghĩa ngữ
20
nghĩa học của giao diện vv. Tuy nhiên một giao diện trong COM cần phải tuân theo
nguyên tắc sau:
i).Các giao diện đều bắt nguồn( thừa kế) từ giao diện đặc biệt Tb"J.
ii).Giao diện chỉ có một từ định danh duy nhất dùng để nhận dạng.
iii).Giao diện không thể sửa đổi một khi đã đợc sinh ra.
Giao diện IUnknown:
Nh đã nói ở trên, các đối tợng thành phần đều hỗ trợ giao diện Tb"J là giao
diện cơ sở của tất cả các giao diện khác. Giao diện Tb"J có ba phơng thức:
e!DTD_+P_/P+$' Có thể mô tả giao diện này nh sau:
Interface IUnknown
{
virtual HRESULT QueryInterface(IID& iid, void** ppvObj) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
}
Tất cả các giao diện phải bắt nguồn trực tiếp hoặc gián tiếp từ giao diện
Tb"J- giao diện gốc, có nghĩa là một giao diện bất kỳ để thực hiện một đối t-
ợng COM đều phải kế thừa toàn bộ các phơng thức nhận đợc từ giao diện
Tb"J, bao gồm: e!DTD_+P_/P+$. Hình 1.5 minh hoạ ba
phơng thức của giao diện Tb"J luôn luôn xuất hiện ở trên cùng của bảng chức
năng ảo do con trỏ Vtable chỉ tới.
Client
Object
Client
QueryInterface
AddRef
Release
Method1
Method2
Method3
IUnknown
21
Hình 1.5-Các phơng thức của
IUnknown bao giờ cũng nằm trên cùng
Để có đợc tính không phụ thuộc vào ngôn ngữ lập trình, COM phải cung cấp
một cách thức chung để tạo ra các thông tin về các giao diện và các lớp thành phần
+$$ trên cùng của nó, đó chính là ngôn ngữ định nghĩa giao diện TK (Interface
Definition Language). Có nghĩa là các ngôn ngữ tơng thích COM có thể sử dụng
TK để thực hiện hoặc sử dụng các định nghĩa từ một file nguồn TK và các file
nguồn này phải đợc dịch bởi D$_TK(MIDL). Trình biên dịch của Microsoft
MIDL sinh ra một vài file nguồn kiểu C và C
++
và một cơ sở dữ liệu nhị phân đặc
biệt đợc gọi là "7<D+DY(th viện kiểu ) trong đó mô tả các giao diện, các
+$$ và các tài nguyên đi kèm. Mỗi một giao diện đợc định nghĩa bởi một tập hợp
các phơng thức, mỗi một +$$ đợc định nghĩa trong một hay nhiều giao diện. Các
file kiểu th viện có thể có những loại mang đuôi mở rộng: .TLB, .DLL, .EXE, .OLB
và .OCX. Dới đây là một ví dụ khi mô tả một giao diện COM trong ngôn ngữ IDL:
Import "Unknwn.idl";
[ object, uuid(4411B7FE-EE28-11ce-9054-080036F12502) ]
interface ISome : IUnknown
{
HRESULT SomeMethod(void);
QueryInterface
AddRef
Release
Method1
Method2
Method3
22
};
[ object, uuid(4411B7FD-EE28-11ce-9054-080036F12502) ]
interface ISomeOther : ISome
{
HRESULT SomeOtherethod([in]long l);
};
Trong đó giao diện ISome bao gồm bốn phơng thức:
QueryInterface,
AddRef, Release, và SomeMethod, còn giao diện ISomeOther gồm năm phơng thức,
trong đó gồm tất cả các phơng thức của giao diện ISome và thêm một phơng thức
mới SomeOtherMethod. Chúng ta thấy rằng các giao diện ở trên bao giờ cũng có tất
cả các phơng thức của giao diện gốc Tb"J.
Nh vậy, Tb"J cung cấp ba đặc tính cơ bản gồm: !F+2
G74<B+/*!Bf+$S+?. Các tính chất này
đạt đợc nhờ ba phơng thức:
Phơng thức P_ thực hiện tăng tổng số tham khảo đến đối tợng lên 1 khi
một giao diện hoặc một ứng dụng khác tự nó nối kết với đối tợng.
Phơng thức e!DTD_+ hỏi đối tợng về các đặc tả mà nó cung cấp thông
qua các con trỏ giao diện.
Phơng thức P+$ thực hiện giảm 1 tổng số tham khảo đến đối tợng, tổng số
bằng 0 có nghĩa là đối tợng đợc tự do.
Trong đó Tb"J;;P_ và Tb"J;;P+$ là hai phơng thức duy trì
tổng số tham khảo đến đối tợng, nó đợc dùng để quản lý thời gian tồn tại của đối t-
ợng. Ví dụ nếu tạo một đối tợng KD8+ thì tổng số tham khảo sẽ đợc tăng lên 1.
Mỗi khi một hàm trả về một con trỏ chỉ tới một giao diện cho đối tợng, thì hàm đó
phải thực hiện phơng thức P_ thông qua con trỏ để tăng tổng số tham khảo đến
23
đối tợng. Hai phơng thức P_ và P+$ phải tơng đồng với nhau, có nghĩa là
phải thực hiện phơng thức P+$ trớc khi có thể huỷ bỏ một con trỏ. Khi tổng số
tham khảo đến đối tợng bằng 0 có nghĩa là đối tợng đó đã bị hủy và tất cả các giao
diện liên quan đến nó trở nên không hợp lệ.
Tb"J;;e!DTD_+, phơng thức này dùng để điều hớng đối tợng, nó xác
định liệu một đối tợng thành phần có đợc hỗ trợ bởi một giao diện xác định hay
không, giao diện này đợc xác định bởi từ định danh TTK (Interface IDentifier) do
client đa đến. Nếu đối tợng hỗ trợ giao diện thì phơng thức e!DTD_+ sẽ trả về
một con trỏ chỉ tới giao diện đó, và sau đó có thể sử dụng các phơng thức của giao
diện để giao tiếp với đối tợng. Nếu e!DTD_+ thực hiện thành công trả về một
con trỏ chỉ tới giao diện nó sẽ kết thúc bởi gọi phơng thức P_ để tăng tổng số
tham khảo, cho nên ứng dụng phải gọi phơng thức P+$ để giảm tổng số tham
khảo trớc khi huỷ con trỏ chỉ tới giao diện .
Phiên bản của giao diện muốn chỉ ra rằng việc sửa đổi một giao diện đã đa ra là
rất tối kị, thậm chí sự thay đổi số lợng phơng thức trong giao diện cũng có thể gây ra
nguy hiểm cho các ứng dụng. Để tránh khỏi những vấn đề này, các giao diện COM
không đợc thay đổi về trật tự. Sự tồn tại của các client hoàn toàn độc lập với giao
diện do đó chúng không chú ý tới có hay không sự thực thi của các thành phần mới.
Nếu một khách hàng mới ngẫu nhiên truy cập vào các thành phần cũ hơn, nó có thể
dùng e!DTD_+ để dò tìm thật an toàn xác định thành phần đó không đợc hỗ
trợ bởi giao diện mới và không cho phép sử dụng các đặc tính mới.
Đến đây có thể thấy rằng, các công việc cần làm đối với một đối tợng hỗ trợ bởi
một giao diện là: tạo ra, sử dụng và giải phóng chúng. Tạo ra đối tợng để nhận đợc
một con trỏ giao diện, dùng con trỏ giao diện để tìm và thực hiện các phơng thức
của đối tợng và cuối cùng là giải phóng đối tợng thông qua con trỏ giao diện.
24
Chú ý rằng trong Visual Basic không bao giờ thấy đợc giao diện
IUnknown một
cách trực tiếp, Visual Basic ẩn tất cả mã liên quan đến IUnknown. Khi làm
việc với Visual Basic, chúng ta không phải để ý nhiều về quản lý thời
gian sống của đối tợng, chỉ cần nhớ một điều là: giữ các tham khảo đến
đối tợng nếu muốn duy trì đối tợng và loại bỏ các tham khảo khi không còn
dùng đến đối tợng nữa. Visual Basic sẽ tự động làm việc với IUnknown, hãy
xem xét đoạn mã sau trong Visual Basic, giả sử rằng đã có giao diện IDog:
Sub CreateAndUseDog()
Dim Dog As IDog
Set Dog = New CBeagle '
P_!@
IUnknown
?.'
Dim Dog2 As IDog
Set Dog2 = Dog ' P_!@
IUnknown
?.'
Set Dog2 = Nothing '
P+$!@
IUnknown
?.'
End Sub
Bên trong Visual Basic sẽ tự động thực hiện
AddRef
và
Release
để quản lý
tổng số tham khảo chuẩn và một đối tợng trong Visual Basic đợc duy trì chạy
nếu client vẫn nối đến nó.
Còn đối với phơng thức
QueryInterface
cũng bị Visual Basic ẩn mã, nó sẽ
đợc Visual Basic thầm lặng gọi đến khi ấn định một đối tợng vào một kiểu
tham khảo xác định.
Ví dụ:
Dim Dog As IDog
Set Dog = New CBeagle
' Để đến một giao diện khác:
Dim WonderDog As IWonderDog
Set WonderDog = Dog 'g/e!DTD_+?.'
WonderDog.FetchSlippers
25
Đặc điểm của giao diện:
Giao diện là một cách để thể hiện các thuộc tính và chức năng của đối tợng
thành phần, cần phân biệt những điểm sau:
Một giao diện không phải là một lớp: trong khi một lớp có khả năng cụ thể hoá
để hình thành lên một đối tợng thành phần thì một giao diện không thể tự nó để trở
thành đối tợng đợc, bởi vì nó bao gồm những thứ không thể thi hành trực tiếp. Ngoài
ra các lớp đối tợng thành phần khác nhau có thể thi hành khác nhau đối với một giao
diện, phù hợp với các định nghĩa trong giao diện. Vì vậy nguyên lý đa hình thái cơ
bản áp dụng một cách đầy đủ vào các đối tợng thành phần này.
Một giao diện không phải là một đối tợng thành phần: một giao diện chỉ là một
nhóm các liên hệ của các chức năng và là một chuẩn nhị phân để các khách hàng và
các đối tợng thành phần truyền thông với nhau. Đối tợng thành phần có thể thi hành
trong bất kỳ ngôn ngữ nào, với điều kiện là nó có khả năng cung cấp các con trỏ chỉ
tới các hàm thành viên trong giao diện.
Các client chỉ tơng tác với các con trỏ giao diện: khi một khách hàng đã truy
cập đến một đối tợng thành phần, khi đó không có gì hơn bằng một con trỏ mà
thông qua nó khách hàng có thể truy cập đến các tiềm năng trong giao diện, con trỏ
đó đợc gọi là con trỏ giao diện. Nó không biết gì về các dữ liệu hoặc mã thực thi của
các đối tợng thành phần, điều này là trái ngợc với các đối tợng trong ngôn ngữ C
++
.
Trong COM các khách hàng chỉ gọi các phơng thức trong giao diện thông qua một
con trỏ. Sự thâu tóm này cho phép COM cung cấp một chuẩn nhị phân hiệu quả cho
phép có đợc đặc tính "D$!GD-"
Các đối tợng thành phần có thể thực hiện nhiều giao diện: đó là khi lớp hỗ trợ
cho nhiều hơn một tập các dịch vụ. Mỗi tập các dịch vụ thuộc một giao diện, do vậy