Chương 1: Kiến thức cần chuẩn bị với WIN API

tuhocvba

Administrator
Thành viên BQT
Chương 1: Kiến thức cần chuẩn bị với WIN API
1-1: Win API là gì?
1-2 Có thể sử dụng Win API
1-3 API phát triển cùng với sự tiến hóa của Windows
1-4 Code
1-5 Thư viện
1-6 DLL
1-7 Win API
 

tuhocvba

Administrator
Thành viên BQT
1-1 Win API là gì?
Win API là thuật ngữ sử dụng đối với Windows 32 bit như Windows XP hay Win 7 và Windows 64 bit như Windows 8.1, Windows 10.
Vậy thì tóm lại Win API là gì nhỉ?
Nó là từ viết tắt của các chữ cái đầu trong chữ Application Programming Interface. Đó là các tính năng được dùng cho các chương trình Program hay ứng dụng Application.
Trước hết ta làm rõ Interface nghĩa là gì nhé. Đây là thuật ngữ được dùng trong công nghệ thông tin (IT), ví dụ computer để có thể hiểu được máy in printer thì nó phải có driver để giao tiếp được với máy tin printer, thì cái driver này cũng chính là interface. Hoặc là computer chơi nhạc thì phải có giao diện để giao tiếp với người dùng, vậy giao diện giao tiếp với người dùng đó cũng có thể nói đó là interface. Chúng ta thỉnh thoảng vẫn nghe, cái ứng dụng này có giao diện người dùng (user interface) thật là thiếu thân thiện.
Vậy thì bây giờ chúng ta đặt nó vào trong câu chuyện VBA, chúng ta sẽ thấy rằng: Các chương trình program gọi các thủ tục Sub hay function. Nhờ có các thủ tục con này, mà chúng ta không cần phải viết code cho chúng trong program của chúng ta nữa. Đây cũng là interface: các chương trinh giao tiếp với nhau (gọi nhau).
API cũng vậy, nó chứa rất nhiều hàm hay thủ tục mà chúng ta có thể gọi từ trong API để sử dụng trong chương trình của chúng ta. Chú ý rằng các hàm và thủ tục này thì lại không tồn tại trong Module, tức là chúng ta không hề viết code cho chúng, mà chúng có sẵn, ta chỉ gọi ra để chúng làm việc giúp chương trình của ta. Chúng thường được cất trong các file DLL, mà các file DLL này thì tồn tại sẵn trong quá trình cài đặt windows.
Interface mà ta thường thấy, các chương trình trong các module giao tiếp với nhau.
Bạn cần đăng nhập để thấy đính kèm

Interface trong trường hợp chương trình gọi các hàm hay thủ tục từ file DLL ra để sử dụng:
Bạn cần đăng nhập để thấy đính kèm
 

Euler

Mod
Thành viên BQT
1-1 Win API là gì?-chúng ta cùng nhau làm rõ những điều còn mơ hồ ở bài viết trước
Khái niệm interface: Khái niệm này còn khá mơ hồ, dựa trên sự hiểu biết của mình, mình trình bày bổ sung như sau:
Bạn cần đăng nhập để thấy đính kèm

Máy tính không thể can thiệp vào bên trong máy in. Cái máy in hoạt động như thế nào thì chỉ có nhà sản xuất biết thôi. Địa chỉ byte, bit, sử dụng các tín hiệu như thế nào, độ dài tín hiệu ra sao để điều khiển bên trong máy in thì chỉ có nhà sản xuất máy in biết, máy tính không làm sao biết được. Vì vậy, máy tính không thể điều khiển vào bên trong máy in.
Người sản xuất máy in phải cung cấp Driver, nói cách khác là tập hợp các hàm và thủ tục để có thể can thiệp vào bên trong máy in mà họ sản xuất ra, tương ứng với đường mũi tên màu đỏ ở trên, từ đó máy tính mới có thể giao tiếp và ra lệnh cho máy in được. Như vậy, bạn hiểu Interface là môi trường ngay bên ngoài, được xây dựng để can thiệp vào bên trong của một bộ phận hay thiết bị nào đó.
Tương tự như vậy, trong việc xây dựng chương trình, ta chia ra làm các khối chức năng, thì khi đó interface sẽ là nơi mà hai khối chức năng có thể giao tiếp được với nhau.
Bạn cần đăng nhập để thấy đính kèm


Trong khuôn khổ API mà chúng ta muốn nói tới thì Interface chính là các hàm hay thủ tục thường được cất trong các file DLL trên máy tính, chúng ta muốn sử dụng các chương trình này như là một interface để giao tiếp sâu hơn với máy tính, làm cho chương trình của chúng ta tiện lợi hơn.
 

tuhocvba

Administrator
Thành viên BQT
1-2 Có thể sử dụng Win API
Vậy thì, tóm lại phương thức sử dụng Win API rút cuộc là cái gì nhỉ? Ở chương này, chúng ta sẽ cùng nhau tìm hiểu cặn kẽ con đường để chúng ta đi vào nơi muốn đến-làm sao có thể sử dụng Win API.
Windows tự bản thân nó là tập hợp rất nhiều hàm hay thủ tục. Này nhé, khi bạn copy file thì phải có chương trình thực hiện điều đó, khi chúng ta xóa file hay dọn dẹp ổ cứng thì cũng có những chương trình thực hiện điều đó. Tất cả những yêu cầu của người dùng đều được Windows thực hiện thông qua thủ tục hay hàm.
Ở đây có điểm quan trọng, hệ điều hành Windows công khai các hàm hay thủ tục ra bên ngoài thông qua các file DLL. Kết quả là chương trình của chúng ta có thể truy cập vào bên trong các file DLL mà Windows cung cấp này, và như vậy chúng ta có thể sử dụng các hàm API trong các file DLL đó.
Nói cách khác, phương thức sử dụng Win API đó là chúng ta sử dụng các tính năng hữu ích mà Windows cung cấp vào chương trình của chúng ta.
Ví dụ, Windows cho chúng ta kiểm tra dung lượng ổ đĩa còn trống. Vậy thì chương trình VBA của chúng ta cũng có thể kiểm tra dung lượng ổ đĩa còn trống bằng việc gọi hàm API nào đó mà chúng đảm đương việc kiểm tra ổ đĩa còn trống ra sao.
Bạn cần đăng nhập để thấy đính kèm


CHÚ Ý: API không phải là Win API.

Thông thường, khi nói API thì nó có ý nghĩa là Win API. Tuy nhiên, khi phát triển chương trình, chúng ta có thể sử dụng tất cả những hàm API có thể dùng, ví dụ bạn có thể sử dụng hàm API mà twitter đã công khai cung cấp ra bên ngoài, hoặc một trang web chứng khoán cung cấp hàm API để truy xuất dữ liệu web của họ nhanh hơn ... Như vậy API là tất cả các hàm Win API và các hàm API khác do nơi khác cung cấp mà chúng ta có thể sử dụng. Như vậy API thực chất là có nghĩa rộng hơn Win API đấy nhé. Trong khuôn khổ box kiến thức này, bây giờ chúng ta thống nhất với nhau, khi nói tới API là chúng tôi muốn nói tới Win API nhé.
 

giaiphapvba

Administrator
Thành viên BQT
1-3 API phát triển cùng với sự tiến hóa của Windows
API được công khai bắt đầu từ Windows 3.1 16bit vào năm 1990. Thời đó chỉ có phiên bản windows 16 bit cho nên nó được gọi là Windows API (chưa phân biệt 32 bit, 64 bit như hiện nay).
Tuy nhiên, vào tháng 5 năm 1993, Windows NT 3.1 32 bit được phát hành, lúc này có hai phiên bản API tồn tại, và từ đó chúng ta còn thấy Windows tiếp tục viết nên lịch sử khi OS được nâng cấp liên tục, Windows 95 32 bit được phát hành, và lúc này người ta phân tách ra là Win 16 API và Win 32 API.
Cho tới ngày nay chúng ta thấy Windows 8 64bit đã được ra đời, và như vậy còn có them Win 64 API. Giống như phần mềm Excel thì hệ điều hành Windows cũng vậy, nếu chúng ta chỉ sử dụng thì chẳng thấy đâu là khác biệt nhưng về mặt chương trình program (code) thì đương nhiên việc khai báo hàm sẽ có sự khác nhau.
Nhìn chung thì Win 16 API cho tới Win 32 API thì không có sự thay đổi gì nhưng giữa 32bit và 64 bit thì có sự khác nhau rõ ràng mà chúng ta sẽ đề cập ở chương 2.

Trong thực tế ở nước ta hiện nay, thì việc sử dụng WIN 7 trở lên là nhiều. Và vì vậy tôi nghĩ chúng ta cũng chỉ cần quan tâm 32 bit và 64 bit, do đó tôi không muốn đi sâu vào lịch sử trên, mà chỉ muốn tòm lược khái quát để các bạn nắm được lịch sử của nó. Cũng như trong tương lai API sẽ còn tiến hóa là khả năng rất cao, do đó kiến thức API chẳng bao giờ là có điểm dừng.

Cũng cần chú ý với các bạn rằng, Windows XP đã kết thúc và Win 16 API cũng đã kết thúc. Do đó bạn không cần lo lắng nếu mình chỉ nắm các hàm API 32 bit và 64 bit thì có ổn không, không có vấn đề gì cả. Hãy bỏ qua Win 16 API.

Dưới đây là lịch sử phát triển windows OS cùng với API tương ứng:
Năm
Windows OS
bit
Type API
1992​
Windows 3.1
16​
Windows API (win 16 API)
1993​
Windows NT 3.1
32​
Win 32 API
1995​
Windows 95
32​
Win 32 API
1998​
Windows 98
32​
Win 32 API
1999​
Windows 98 SE
32​
Win 32 API
2000​
Windows 2000
32​
Win 32 API
2000​
Windows Me
32​
Win 32 API
2001​
Windows XP
32​
Win 32 API
2003​
Windows XP 64bit Edition
64​
Win 64 API
2007​
Windows Vista
32​
Win 32 API
2009​
Windows 7
64​
Win 64 API
2012​
Windows 8
64​
Win 64 API
2013​
Windows 8.1
64​
Win 64 API
2015​
Windows 10
64​
Win 64 API
 

vbano1

SMod
Thành viên BQT
1-4 Tái sử dụng code
Giả sử như bây giờ tôi phải nhập thông tin nhân viên gồm ngày tháng năm sinh, giới tính,… Cứ năm này qua năm khác, mỗi lần phải nhập như vậy thật là phiền hà và tốn công tốn sức. Nhưng nếu ta lưu dữ liệu thành database, và sau này mỗi lần cần, thì máy tính sẽ tìm kiếm và nhập cho chúng ta, đó chẳng phải là giảm chi phí thời gian, và nâng cao hiệu suất làm việc hay sao?

Cùng chung cách nghĩ đó, có những đoạn code cứ sử dung đi sử dụng lại, mà hầu hết các chương trình đều cần, vậy chẳng phải là nên xây dựng một thư viện các hàm thiết yếu, khi cần thì chỉ việc gọi chúng ra phục vụ cho ta, sẽ không mất công phải gõ code lại, như vậy thật tuyệt vời phải không nào?

Vào khoảng những năm 1940, thế hệ đi trước đã bắt đầu nghĩ tới điều đó. Đầu tiên là các lệnh hợp ngữ Assembly được mọi người tập hợp lại, đây là bước khởi đầu cho suy nghĩ hình thành nên thư viện để tái sử dụng code.

Và năm 1951, những người nghiên cứu của đại học Cambridge University đã mở ra một đại kỷ nguyên về việc tái sử dụng code. Rất nhiều file được hình thành để lưu trữ các thủ tục và hàm có tính ứng dụng cao cho nhiều chương trình, và sau đó người ta gọi là thư viện (Library).

Bây giờ nếu nói về năm 1951, có lẽ chúng ta coi đó là câu chuyện của ngày xưa, nhưng ngày nay, ý tưởng ấy vẫn được sử dụng, và hiện tại người ta vẫn không ngừng bổ sung thêm vào Library các hàm và thủ tục thiết yếu, có tính ứng dụng cao cho nhiều chương trình.
 

tuhocvba

Administrator
Thành viên BQT
1-5 Thư viện Library
DLL là nơi lưu trữ các hàm API.
Chúng ta có thể gọi một chương trình program (hàm hay thủ tục) từ Library. Library này thông thường có hai loại là file có đuôi .lib (Static Link Library) và .dll (Dynamic Link Library).

Trường hợp .lib, khi complie (biên dịch) chương trình (program) ra mã máy, thì bản thân file .lib cũng là một phần của Application (ứng dụng). Như vậy ta thấy rằng, ứng dụng Application bao gồm cả file .lib do đó mà dung lượng của Application cũng trở nên lớn. Đây chính là vấn đề của .lib .
Ta ví dụ ứng dụng A (Application A) và ứng dụng B (Application B) cùng sử dụng một file lib[X].
Bạn cần đăng nhập để thấy đính kèm

Như vậy thật là lãng phí dung lượng ổ đĩa khi phải lưu trữ cả Application A và Application B như thế này.
Ngoài ra, khi hai Application cùng thực thi đồng thời, thì sẽ phát sinh bộ nhớ rất lãng phí.

Tuy nhiên, chúng ta có cách để giải quyết vấn đề này của .lib, đó là chúng ta không kết hợp Library vào Application nữa, mà tách bạch ra Application là Application, và Library là Library. Có nghĩa là khi biên dịch (Complie) thì chúng là các file độc lập riêng rẽ. Như vậy khi các application dù có thực thi đồng thời, nếu như chúng tham chiếu tới thư viện Library thì việc lãng phí bộ nhớ sẽ không xảy ra.

Và đó là lý do người ta nghĩ ra Dynamic Link (đường dẫn động), kết quả là chúng ta có các file .dll sẽ giải quyết vấn đề của .lib như đã nói ở trên.

Các hàm API được cung cấp thông qua các file .dll, và nó được biên dịch độc lập với các ứng dụng mà các bạn đang tạo nên. Khi chương trình ứng dụng của bạn được biên dịch và thực thi, chúng gọi tới các hàm API, ta tưởng tượng rằng chương trình của bạn được link tham chiếu tới file .dll . Cái này được gọi là mapping (tức là ánh xạ).
Tham khảo thêm:
 

vbano1

SMod
Thành viên BQT
1-6 Các file DLL chủ yếu mà Windows cung cấp cho chúng ta
Thư viện Library của Windows chứa rất nhiều file .dll, ở đây tôi liệt kê những file .dll hay được dùng nhất. Các file .dll thường được cất trong đường dẫn C:\Windows\System32 , tuy nhiên để có thể nhìn thấy file, rất có thể bạn phải bỏ ẩn thư mục, đây là thư mục quan trọng nên thường thì sẽ mặc định bị ẩn đi.
DLLNội dung
Advapi32.dllHỗ trợ rất nhiều hàm API (ở mức độ chuyên sâu cao-Advanced), liên quan tới security, registry
Comdlg32.dllThư viện API common dialog
Gdi32.dllThư viện API về đồ họa ( Graphics Device Interface)
Kernel32.dllHỗ trợ Windows API nền tảng 32bit
Lz32.dll32 bit nén (tối nghĩa, sẽ cập nhật khi hiểu rõ nghĩa)
Mpr.dllThư viện Multiple Provider Router
Netapi32.dllThư viện 32 bit-Network
Shell32.dllThư viện 32 bit shell
User32.dllUser Interface
Version.dllThư viện Version
Winmm.dllThư viện Windows multimedia
Winspool.drvNơi chứa các hàm API làm việc với máy in, Printer interface

Danh sách thì nhiều như vậy, nhưng chúng ta chủ yếu sẽ quan tâm 3 file dll sau: Kernel32.dll, User32.dll, Gdi32.dll , chúng thường được gọi là trung tâm của Windows Library.

Kernel32.dll là file DLL thao tác với lõi Windows, nó chứa các hàm API ở cấp độ thấp (thường được sử dụng) quản lý bộ nhớ (memory) và tác vụ (task).

User32.dll quản lý Window. Nó là hàm cơ bản để quản lý cửa sổ. cho người dùng nhập dữ liệu... Nó chứa các hàm xử lý menu, định giờ, truyền tin,…

Gdi32.dll quản lý giao diện đồ họa.
Tham khảo thêm:
 

Euler

Mod
Thành viên BQT
1-7 Sự mở rộng và phát triển của Win API
Thật khó có thể nói là Windows có bao nhiêu file .dll, nếu truy cập vào thư mục WINDOWS\SYSTEM32 thì ta thấy có rất nhiều file .dll ở đây.
Về lịch sử máy tính, ban đầu họ không công khai các tài liệu kỹ thuật. Chúng ta không đi chi tiết về vấn đề này, nhưng lịch sử computer và OS (hệ điều hành máy tính) thì IBM và Microsoft có một lịch sử cạnh tranh với nhau nhưng để hệ điều hành OS và phần cứng Hardware tương tác tốt với nhau, thì cần phải công khai tài liệu kỹ thuật (WOSA).

WOSA (Windows Open Services Architecture): Là một tập hợp các giao diện lập trình ứng dụng trên Windows của Microsoft nhằm mục đích cho phép các ứng dụng từ các nhà sản xuất khác nhau có thể kết nối với nhau qua mạng. WOSA bào gồm Open Database Connectivity (ODBC), Messaging Application Programming Interface (MAPI), Telephony Application Programming Interface (TAPI), Windows Sockets (Winsock) và Microsoft Remote Procedure Calls (RPC).
Nguồn:

Cùng với việc gia tăng các file .dll thì các hàm API cũng càng ngày càng được mở rộng nhiều hơn. Sau khi phát hành Windows95, số hàm API ước chừng khoảng 1800, với Windows 98 thì số lượng hàm API ước chừng khoàng 5000. Với Windows 10 thì số hàm API là bao nhiêu? Rất tiếc là chúng ta không có tài liệu nào nói về điều này. Tóm lại, sự mở rộng và phát triển API sẽ còn tiếp tục, và chúng ta hãy nhận thức rõ về điều này, việc cập nhật kiến thức thường xuyên là quan trọng, vì vậy, trong học thuật, hãy giữ thái độ khiêm tốn, có rất nhiều điều chúng ta chưa biết, hoặc những thứ chúng ta biết đã lạc hậu so với tri thức chung mà thế giới đang có.

Như vậy đây cũng là bài viết cuối cùng kết thúc chương 1, chúng tôi đã giới thiệu cho các bạn những điều cơ bản nhất về Win API. Nếu có điều nào còn mơ hồ, hãy cứ bình tĩnh, đừng nóng vội. Trước hết, ở chương 1 này, chúng tôi chỉ muốn các bạn hiểu Win API là gì, nó có lịch sử ra sao.
 
Top