Chương 2: Cùng khám phá thế giới bên trong của Windows

tuhocvba

Administrator
Thành viên BQT
2-1 Vai trò của OS
2-2 Đa nhiệm và ưu tiên
2-3 Tiến trình và phân luồng
2-4 CPU
2-5 Windows
2-6 messege
2-7 Chi tiết bên trong
2-8 Tổng kết
 

tuhocvba

Administrator
Thành viên BQT
2-1 Vai trò của OS
OS hiểu là hệ điều hành, nó quản lý toàn bộ phần cứng và các ứng dụng trên máy tính.
Ví dụ, nhờ có hệ điều hành mà chúng ta có thể nhập công thức trên excel, hoặc thực hiện các thao tác copy và paste trên word. Người dùng có thể thao tác tùy ý, và phần cứng sẽ thực thi mệnh lệnh đó. Tuy nhiên, ứng dụng Excel hay word không truyền đạt trực tiếp mệnh lệnh từ người dùng tới phần cứng. Ứng dụng Application (Excel hay Word) nhận chỉ thị từ người dùng, và truyền đạt chỉ thị đó cho hệ điều hành OS, hệ điều hành OS lại tiếp tục truyền đạt chỉ thị đó tới phần cứng, và máy tính lúc này mới bắt đầu thực thi thao tác theo mong muốn của người dùng.
Bạn cần đăng nhập để thấy đính kèm


Như vậy mặc dù nói là OS nhưng cũng có rất nhiều loại OS (hệ điều hành) khác nhau. Ví dụ Windows, UNIX, MacOS... Nhưng trong khuôn khổ VBA API mà chúng ta muốn hướng tới, thì tất nhiên OS mà chúng ta quan tâm là Windows. Đây cũng là hệ điều hành phổ biến dùng trong các công ty, nhà máy và xí nghiệp. Tất nhiên về cơ bản, chúng ta sẽ chỉ bàn tới Windows từ Windows95 trở đi. Các thế hệ Windows 3.1 trở về trước, chúng ta sẽ không quan tâm. Lý do là Windows 3.1 trở về trước là hệ điều hành 16bit, trong khi đó như đã nói, chúng ta sẽ chỉ quan tâm từ hệ điều hành 32 bit trở đi, cụ thể hiện tại chúng ta có 32 bit và 64 bit.
 

giaiphapvba

Administrator
Thành viên BQT
2-2 Đa nhiệm và tính ưu tiên
Windows là hệ điều hành có thể thực thi nhiều chương trình program đồng thời và lTaiên tục.
Hệ điều hành mà có thể thực thi đồng thời nhiều chương trình cùng một lúc, ta gọi môi trường đó là đa nhiệm.
Một chương trình thưc thi một xử lý công việc nào đó (task-nhiệm vụ), thì nó là một đơn vị nhiệm vụ. Vậy thực hiện nhiều nhiệm vụ (công việc) một lúc thì gọi là đa nhiệm.
Ta ví dụ, ta vừa thao tác Excel, vừa kiểm tra được có mail gửi tới hay không,... do đó Windows được gọi là hệ điều hành đa nhiệm.
Tuy nhiên, cho dù Windows 3.1 và 32/64bit đều là các phiên bản Windows đa nhiệm, nhưng cấu tạo bên trong của chúng hoàn toàn khác nhau.
Trước Windows 3.1 là thời đại của MS-DOS, đây là hệ điều hành đơn nhiệm, không thể cùng lúc làm hai công việc.

Windows3.1 là hệ điều hành đa nhiệm không có tính ưu tiên. Hệ điều hành kiểu này thì CPU sẽ chỉ cho một chương trình chiếm hữu. Tức là, nếu chương trình A đang chiếm hữu CPU, thì các chương trình khác như chương trình B không thể nào giành lấy CPU để hoạt động. Tóm lại, chỉ có chương trình A hoạt động, nếu chương trình A chưa được giải phóng thì các chương trình khác không thể thực thi.

Windows 32/64 bit thì lại là hệ điều hành đa nhiệm có tính ưu tiên. Chúng ta thường nói rằng, CPU có thể xử lý đồng thời nhiều chương trình một lúc, tuy nhiên ở đây có sự nhầm lẫn. Thực ra Windows sẽ thực thi các chương trình tuần tự luân phiên nhau trong cac khoảng thời gian rất ngắn. Kết quả phản ánh vào mắt chúng ta thì cứ như thể các chương trình được thực thi đồng thời. Khoảng thời gian rất ngắn mà chúng ta vừa nói tới, với windows95 thì đó là 20ms. Đối với hệ điều hành như Windows 10 thì chúng tôi chưa tìm thấy tài liệu nào nói tới khoảng thời gian này là bao nhiêu, chỉ biết là rất ngắn.
Bạn cần đăng nhập để thấy đính kèm


Dịch phần này quả thực rất khó, các thuật ngữ không phải là thuần nhật, mà sử dụng các từ phiên âm từ tiếng anh sang cách đọc nhật, không rõ từ tiếng anh nguyên gốc là gì. Nếu các bạn có phát hiện gì hãy phản hồi lại cho chúng tôi biết. Trong khuôn khổ topic này, tôi muốn các bạn hiểu cách hoạt động của Windows hiện nay, các chương trình nói là thực hiện đồng thời, nhưng thực ra chúng được thay phiên nhau hoạt đông xen kẽ so le nhau như hình minh họa cuối cùng trong bài viết này đã minh họa.
 

Euler

Administrator
Thành viên BQT
2-3 Tiến trình và phân luồng
Tiến trình được chia ra thành các luồng.
Ở thời đại Windows 3.1, các chương trình đang được thực thi được gọi là các task (nhiệm vụ). Và từ chương trình (program), chúng sẽ được phân ra thành các Module. Quả là một câu chuyện khó hiểu phải không.
Thế này nhé, khi mọi người dùng Internet Explorer để xem tin tức, trong lúc đó mọi người cũng thực hiện download từ một website nào đó. Nếu nói như vậy, chắc là ai cũng đã từng làm rồi phải không nào. Trường hợp như vậy, CPU sẽ xử lý việc download file, mà ta gọi là tiến trình (process). Tuy nhiên tiến trình này không phải là một cái, tại sao CPU lại có thể xử lý đồng thời việc download file và load web để ta xem tin tức.
Process là con đường thực thi mệnh lệnh của người dùng tới OS. Và để các con đường thực thi này không giao thoa ảnh hưởng chồng lấn lên nhau, chúng phân thành nhiều con đường dưới hình thức độc lập mà ta gọi là luồng (thread).
Bạn cần đăng nhập để thấy đính kèm

Tóm lại, giống như bài viết trước đã nói, thì hệ điều hành Windows sẽ luân phiên tiến hành các luồng trong các khoảng thời gian ngắn, không có chuyện tiến hành đồng thời các luồng cùng một lúc.
Khi khởi động Process, thì tối thiểu sẽ luôn có một con đường thực thi (luồng) được đảm bảo. Nói tóm lại, dù ít thế nào đi nữa thì cũng luôn tồn tại tối thiểu một luồng được hình thành.
Câu chuyện đa nhiệm, phân luồng là câu chuyện chẳng có mấy ý nghĩa với người dùng VBA. Vì VBA không thể tạo ra tiến trình đa nhiệm.
 

vbano1

SMod
Thành viên BQT
2-4 Để chương trình khác không chiếm dụng CPU

Với Windows 3.1, chương trình đang chiếm hữu CPU sẽ quyết định khi nào giải phóng CPU. OS không ra mệnh lệnh giải phóng CPU. Đây là đặc thù của thế giới đa nhiệm không ưu tiên. Chương trình phải có dòng code để giải phóng CPU.

Thế nhưng, với Windows 32/64 bit thì sẽ khác, chiếm dụng CPU hay giải phóng CPU sẽ do phía OS (hệ điều hành) quyết định. Windows sẽ giải phóng chương trình đang chiếm hữu CPU một cách định kỳ. OS sẽ phán đoán thời gian nào thì giải phóng, thời gian nào thì dừng tạm thời chương trình đang hoạt động, để chương trình cũng có thể hoạt động, nó phải giải phóng CPU, thoát toàn bộ các regyster CPU đang sử dụng và lưu thông tin đó lại. Chương trình không cần phải bận tâm tới việc giải phóng CPU. Như vậy trách nhiệm của chương trình đã được OS gánh vác cho ít nhiều.
 

tuhocvba

Administrator
Thành viên BQT
2-5 Window-Windows cung cấp 3 chức năng.
Nói tới Window thì chúng ta cần phải hiểu nó có 3 cửa sổ mà chúng ta cần phân biệt. Ứng với mỗi cửa sổ thì lại có các chức năng khác nhau.
Windows đầu tiên mà ta nói tới, đó chính là màn hình destop của chúng ta. Trên đó có thanh taskbar.
Với Excel thì Window lúc này là màn hình giao diện ứng dụng Excel mà trên đó có thanh Menu...
Window nói một cách đơn giản là màn hình hiển thị mà chúng ta nhìn thấy.
UserForm của Excel cũng là một Window.
Bạn cần đăng nhập để thấy đính kèm


WindowClass là định nghĩa cho những thứ chúng ta nhìn thấy ngoài cửa sổ, như nút bấm, hoặc là những thứ thao tác người dùng.
Giá trị định nghĩaNội dung
BUTTONNút bấm
COMBOBOXLà một list danh sách, khi người dùng click vào sẽ sổ ra danh sách để người dùng lựa chọn.
EDITLà một cửa sổ con mà người dùng có thể nhập text vào.
LISTBOXLà một list danh sách được hiển thị.
SCROLLBARThanh cuộn
MDICLIENTTiếp nhận thông báo điều khiển cửa sổ con của ứng dụng MDI (lời người dịch: chưa rõ)
STATICHiểu đơn giản đây là Field của Text, Box, hoặc là đính các Label lên các control khác… (lời người dịch: chưa rõ)
 

vbano1

SMod
Thành viên BQT
2-5 Window-Windows cung cấp 3 chức năng.
(tiếp theo)
WindowStyle: WindowStyle được định nghĩa là tên của những thao tác, hay những gì các bạn nhìn thấy mà windowclass không thể chỉ định được.
Ta ví dụ, nếu nói BUTTON ta hiểu là nút bấm nhưng nó là loại nút bấm nào? Nó có thể là Radio Button hoặc CheckBoxButton. Như vậy để định nghĩa là loại BUTTON nào thì chúng ta không thể dùng WindowClass, mà phải thông qua WindowStyle để chỉ định cho máy tính hiểu.
Bạn cần đăng nhập để thấy đính kèm

Bạn cần đăng nhập để thấy đính kèm

Bạn cần đăng nhập để thấy đính kèm

Bạn cần đăng nhập để thấy đính kèm

(Còn nữa)
 

tuhocvba

Administrator
Thành viên BQT
2-5 Window-Windows cung cấp 3 chức năng.
(tiếp theo)
Window Name: Người dùng nhận thức về cửa sổ window thông qua tên của nó. Thông thường được xác định dựa vào dòng tiêu đề title trên các window.

Vị trí, kích cỡ, thứ tự hiển thị (ZOrder): Window có các thuộc tính để xác định vị trí (tọa độ tương đối được xác định lấy gốc tọa độ là góc trái phía trên của màn hình máy tính), Kích cỡ (size), thứ tự hiển thị (Z Order)-trường hợp có nhiều cửa sổ thì cần xác định mức độ ưu tiên cửa sổ nào hiển thị lên phía trước.

Tổng kết:
Giải phóng Object và Close Handle

Thế giới bên trong Windows, việc định nghĩa rõ ràng Object thật là khó. Không biết là dùng ngôn từ như thế nào để mô tả, có thể nói thế này, đó là các mã nhị phân (binary code) trong bộ nhớ (memory).
Chúng như những chiếc bánh răng có liên kết với nhau. Code của Window, file, hay bit map, font, âm thanh... sẽ chiếm một vùng nhớ nào đó.
Ví dụ như là, khi các bạn dùng Paint, GDI_OBJECT sẽ được tạo, tài nguyên hệ thống sẽ bị hao hụt đi một chút. Và để quản lý bộ nhớ, tiến trình thực thi (process), khi đó sẽ xuất hiện KERNEL OBJECT.
Object, Handle chiếm dụng bộ nhớ. Do đó những thứ không cần thiết sẽ được giải phóng, sẽ phải đóng handle không cần thiết. Khi tiến trình xử lý thực thi kết thúc, đương nhiên các Object sẽ được giải phóng, handle sẽ được đóng (close). Nhưng ở cấp độ thread thì sẽ không được xử lý. (Người dịch: Chưa rõ đoạn này).
Tóm lại, ở đây tôi muốn nhấn mạnh, nếu không có thói quen giải phóng Object và close handle, thì chúng ta sẽ tiêu tốn bộ nhớ một cách vô ích.
 

vbano1

SMod
Thành viên BQT
2-6 Message-Windows cung cấp 3 chức năng.
Ở phần đầu của chương 2 này, chúng ta đã được giới thiệu về OS (hệ điều hành), Application (ứng dụng), hardware (phần cứng).
Bây giờ, bạn đang sử dụng Excel. Và bạn click chuột. Không phải là Excel, Windows sẽ tìm kiếm và nhận biết ra chuột đã được click, nó tiếp nhận thông báo (tin nhắn-message) rằng có sự kiện như thế đã xảy ra. Thông báo hay tin nhắn (message) đó được gửi tới vùng nhớ đệm buf hay còn được gọi là hàng đợi tin nhắn ( ).
Đường link tham khảo tôi đính kèm ở trên là tiếng anh, các bạn có thể dùng google translate để dịch. Tôi không tìm thấy bài viết nào bằng tiếng việt (Lời người dịch).
Windows xử lý hàng trăm chủng loại tin nhắn như sự kiện di chuyển chuột, đã ấn phím trên bàn phím, hay thay đổi kích thước cửa sổ window... Vì thế, tin nhắn sẽ được biểu hiện dưới dạng số. Các tin nhắn này đều được định nghĩa bằng các hằng số có tên mang ý nghĩa giúp các bạn dễ hình dung. Tôi không thể nào giới thiệu hết tất cả, dưới đây là các message thường gặp. Tôi đã tổng hợp ở đây và giới thiệu tới các bạn.
Tên messageGiá trị (Hex)Ý nghĩa
WM_CREATE&H1Tạo Window
WM_SIZE&H5Thay đổi kích thước (size)
WM_CLOSE&H10Window đã kết thúc
WM_KEYDOWN&H100key (không phải system key) được ấn
WM_KEYUP&H101key (không phải system key) được nhả ra
WM_LBUTTONDOWN&H201Chuột trái được ấn
WM_LBUTTONUP&H202Chuột trái được nhả ra
WM_LBUTTONDBLCLK&H203Chuột trái được double click
WM_RBUTTONDOWN&H204Chuột phải được ấn
WM_RBUTTONUP&H205Chuột phải được nhả ra

Application sẽ lấy tuần tự các message được gửi tới. Lúc này, message mà lấy được này nó thuộc về Window (cửa sổ) nào lại là một vấn đề, để nhận thức được điều này cần phải biết message thuộc về window handle nào.

Note: Trong message, phần mở rộng của message còn có 2 tham số. Tham số này được thêm vào khi mà nếu chỉ dựa vào phần mở rộng của message thì thông tin không đủ.
Bạn cần đăng nhập để thấy đính kèm

(Còn nữa)
 

Euler

Administrator
Thành viên BQT
2-6 Message-Windows cung cấp 3 chức năng.
(Tiếp theo)
Tin nhắn (message) đầu tiên sẽ được chuyển tới hàng đợi tin nhắn, và nó cần có lý do thì mới được chuyển tới cửa sổ ứng dụng Window (Appliacation). Giả sử, window (cửa sổ ứng dụng này) đang trực tiếp xử lý một tin nhắn (message) thì có một message khác được gửi tới, lúc này window (cửa sổ ứng dụng đang nói tới) không thể tiếp nhận tin nhắn được gửi tới này, và thế là việc xử lý đối với tin nhắn này sẽ không được diễn ra.
Tất nhiên điều này sẽ diễn ra bên trong hệ thống (system). Ta ví dụ, thỉnh thoảng chúng ta dùng Excel và Word. Chúng ta có lúc cảm thấy phản ứng từ hệ thống có lúc đơ đơ. Điều này là vì, ứng dụng (application) lấy tin nhắn (message) từ hàng đợi tin nhắn bị mất thời gian. Hiện tượng đơ đơ khi khởi động ứng dụng thỉnh thoảng vẫn diễn ra. Windows (hệ điều hành) chỉ lấy được một tin nhắn từ hàng đợi tin nhắn, sau đó mới tới quá trình xử lý cho cửa sổ Window (cửa sổ ứng dụng) khác. Tất nhiên, cửa sổ tiếp theo mà ta nói tới này có thể được xử lý đồng thời với cửa sổ window đang được xử lý trước đó. Điều này có thể là hiện thực nếu Windows của chúng ta có chức năng đa nhiệm.

Hàm API cất tin nhắn vào hàng đợi tin nhắn là PostMessage. Tuy nhiên, tùy vào điều kiện hoàn cảnh, mà các tin nhắn từ hàng đợi sẽ được lấy ra tuần tự. Có trường hợp tin nhắn vào hàng đợi sau nhưng lại được xử lý trước là cũng có. Trường hợp như thế có thể hiểu là tin nhắn không được cất trong hàng đợi mà được gửi trực tiếp tới Window (cửa sổ ứng dụng). Để làm được điều đó, ta có hàm API là SendMessage.

Tổng kết:
Trong thực tế, VBA hoàn toàn có thể lấy tin nhắn đáng ra nên gửi tới cửa sổ A rồi gửi tới cửa sổ B.
Kỹ thuật SubClass này nếu không nhầm, nó giành cho người ở level cao đối với WIN API. Để sử dụng SubClass, ta phải trao cho WIN API con trỏ mà ta chỉ định cho hàm. Khi đó, ta có toán tử AddressOf của hàm CallBack.
Tuy nhiên đối với cá nhân chúng ta, thực ra hầu như chúng ta không có cơ hội sử dụng AddressOf trong VBA.
(Phần tổng kết này khá tối nghĩa, nếu có điều kiện thì các bạn google tìm hiểu thêm về AddressOf nhé-Lời người dịch).
 

NhanSu

SMod
Thành viên BQT
Tổng kết:
Trong thực tế, VBA hoàn toàn có thể lấy tin nhắn đáng ra nên gửi tới cửa sổ A rồi gửi tới cửa sổ B.
Kỹ thuật SubClass này nếu không nhầm, nó giành cho người ở level cao đối với WIN API. Để sử dụng SubClass, ta phải trao cho WIN API con trỏ mà ta chỉ định cho hàm. Khi đó, ta có toán tử AddressOf của hàm CallBack.
Tuy nhiên đối với cá nhân chúng ta, thực ra hầu như chúng ta không có cơ hội sử dụng AddressOf trong VBA.
Nếu lấy tin nhắn đáng lẽ gửi cho cửa sổ A rồi gửi tới cửa sổ B là kỹ thuật hook chứ nhỉ. Điều này mình đã viết ở chủ đề lý giải về DefWindowProc. Mỗi lớp cửa sổ có một hàm xử lý thông điệp riêng gọi là hàm WinProc, hàm này sẽ xử lý một số thông điệp, số còn lại sẽ gọi hàm mặc định của windows là DefWindowProc (Default Window Procedure). Kỹ thuật subclass sẽ thay thế hàm WinProc bằng hàm của ta, ví dụ là MyWinProc. Để làm điều này, ta sử dụng hàm API SetWindowLong, cung cấp cho hàm API tham số là handle của cửa sổ và địa chỉ của hàm MyWinProc (chính là AddressOf(MyWinProc), MyWinProc là hàm callback). Lúc này thông điệp mà windows gửi cho cửa sổ sẽ được xử lý bởi hàm MyWinProc.
Kỹ thuật hook thì phức tạp hơn, hook chặn thông điệp trước khi nó được gửi đến cửa sổ, ví dụ dùng kỹ thuật hook xác định thông điệp này sẽ gửi đến cửa sổ A, ta có thể sửa, xóa thông điệp hoặc gửi cho cửa sổ B. Một ví dụ về chuơng trình sử dụng hook thường gặp là unikey.
 

Euler

Administrator
Thành viên BQT
Cảm ơn @NhanSu . Đây là nội dung trong bản dịch mà mình đã truyền tải cho các bạn. Các bạn nếu có kiến thức thì cứ bổ sung và phản hồi trong topic này nhé. Mình rất tiếc là mình không đủ kiến thức để phản biện. Theo nội dung đã truyền tải thì là SubClass. Mình cũng chưa biết nó là gì. Và hiện tại thì bạn đọc tạm thời bỏ qua cũng được.

Năng lực ngôn ngữ cũng hạn chế. Chương 1 & Chương 2 cũng là những chương khó dịch nhất, người dịch cần có kiến thức thì dịch mới sát được.
Từ Chương 3 trở đi mới dễ thở hơn, vì chúng ta làm việc với code và kiểm nghiệm kết quả của code.

Về bản gốc, mình rất tiếc không thể post lên đây để các bạn tham khảo, vì đây là vấn đề rất nhạy cảm-bản quyền. Vậy, bằng kiến thức và kinh nghiệm, mọi người cứ cho ý kiến trực tiếp trong topic này cho tới khi diễn đàn đăng tải bản dịch phần tiếp theo.

Vậy, cho các bạn 1 tuần để đưa ra tất cả các ý kiến cần thiết, hậu bối có thêm các thông tin tham khảo.
 

NhanSu

SMod
Thành viên BQT
Điểm khác nhau căn bản giữa subclass và hook là subclass sửa đổi thủ tục xử lý thông điệp mà cửa sổ nhận được còn hook xử lý thông điệp trước khi thông điệp được gửi đến cửa sổ, hook có thể toàn quyền sửa xóa hoặc gửi đến cửa sổ khác. Subclass ảnh hưởng đến 1 cửa sổ hoặc 1 lớp cửa sổ nhất định, hook ảnh hưởng đến toàn bộ hệ thống.
Ví dụ cụ thể đối với unikey, vì sử dụng hook nên các ký tự nhập từ bàn phím sẽ được chuyển thành tiếng Việt rồi mới chuyển cho cửa sổ nhận, và mọi cửa sổ như word, excel, textbox đều chịu ảnh hưởng, việc này không làm được bằng subclass vì ta không thể sửa đổi tất cả các thủ tục WinProc của các lớp cửa sổ được.
 
2-7 Device context - Windows cung cấp 3 chức năng
Chức năng thứ nhất chúng ta đã biết là Window (cửa sổ).
Chức năng thứ hai là message (tin nhắn).
Và chức năng thứ ba là Device context. Đây chính là nội dung bài học lần này.

Device context-ngữ cảnh thiết bị: chứa các thông tin cần thiết cho việc vẽ lên Window hay Device (một thiết bị nào đó).
(Lời người dịch bổ sung thêm: Để có thể giao tiếp được với máy in, hay card đồ họa... Nhờ có Device context, bạn có thể truyền thông tin vẽ, thông tin này được phản ánh tới máy in).
:
Để hiển thị cùng một hình ảnh trên màn hình thì tùy vào phần cứng mà mỗi máy tính sẽ có cách thức cấu hình riêng biệt. Tuy nhiên, người lập trình ko phải lo về điều đó, bạn có thể đưa ra cách vẽ thông qua các tập lệnh thao tác trên DC (chẳng hạn LineTo, ArcTo, Polygon...), và hình ảnh nhận được sẽ gần như được đảm bảo là như nhau trên mọi thiết bị phần cứng hỗ trợ hệ điều hành Windows.

Cụ thể trên Windows có 4 cái Device Context là: Display, Print, memory, .
DisplayVẽ lên màn hình hiển thị
PrintVẽ lên giấy của máy in
MemoryVẽ nên hình ảnh trên bộ nhớ để gửi tới thiết bị
Metafile
Nào, bây giờ hãy thử suy nghĩ xem tại sao Device context lại cần thiết như vậy.
Thực sự thì output của graphic không phải là thứ đơn giản mà chúng ta có thể tưởng tượng được.
Đầu tiên, mệnh lệnh điều khiển màn hình hiển thị hay máy in là khác nhau.
Ngoài ra, riêng về màn hình hiển thị cũng đã có vô số loại. Người dùng có thể tùy ý thiết định độ phân giải, màu sắc.
Với máy in thì câu chuyện cũng tương tự. Chúng ta cũng có rất nhiều loại máy in.
Cần phải sử dụng code như thế nào để có thể xuất ra đồ họa như nhau cho các thiết bị đủ các thể loại như thế kia?
Và thế là các thiết bị này và máy tính của chúng ta phải giao tiếp với nhau thông qua các hàm API. Đây chính là Device Context.
Chẳng hạn khi bạn mua máy in, đi kèm sẽ có đĩa CD-ROM. Chúng ta vẫn thường gọi là Device Driver hoặc ngắn gọn là Driver.

Nhờ có Device Context, chúng ta không phải quan tâm cấu trúc bên trong của chiếc máy in ra sao, code cho chúng như thế nào, chúng ta chỉ việc ra lệnh thông qua các hàm API để điều khiển các thiết bị này.
 
Top