thongkorn โพสต์ 2017-10-26 23:04:37

มาทำความรู้จักกับ Application Programming Interface (API)

Application Programming Interface หรือ API คำๆนี้ค่อนข้างจะถูกนำมาใช้งานกันเยอะมากในปัจจุบัน ทำให้คนรุ่นใหม่แบบแอดมิน (บุ๋ย ... 5555+) ค่อนข้างจะงงและสับสนเล็กน้อย โดยเฉพาะสาย Web Application เอาคำนี้มาใช้ร่วมกันกับ Win Application ซึ่งแอดมินยังแอบคิดในใจว่าพวกสายเว็บเขาคิดหาคำอื่นมาใช้ไม่ได้อีกแล้วหรือยังไง 5555+ ... ขอสรุปสั้นๆให้สำหรับสาย Win กับคำว่า API คือ การนำเอาขีดความสามารถในตัวระบบปฏิบัติการ Windows มาใช้งานให้เกิดประสิทธิภาพมากยิ่งขึ้น เพื่อเสริมสมรรถนะและขีดความสามารถให้กับแอพพลิเคชั่นของเรา ... ส่วนสาย Web ก็จะมีความหมายที่คล้ายๆกัน แต่แยกออกไปแล้วแต่ผู้ผลิตเขาจะอนุเคราะห์ให้มา เช่น Google API หรือ Facebook API เป็นต้น

Windows API แท้จริงแล้วก็คือ แก่นของ Windows หรือ Windows API เปรียบเสมือนกับ MS-DOS.SYS สำหรับระบบปฏิบัติการ (Operating System - OS) ของ MS-DOS นั่นเอง โดยที่มันจะเก็บอยู่ในรูปแบบของ Dynamics Link Libraries อยู่ในไฟล์ที่มีนามสกุล DLL ซึ่งในขณะที่ Windows กำลังรันอยู่ ไฟล์เหล่านี้จะถูกโหลดขึ้นมาด้วย และคงอยู่ในหน่วยความจำอยู่อย่างนั้น แต่ละโปรแกรมย่อยใน API จะมีตัวตน (Instance) เพียงตัวเดียว ไม่ว่าจะมีกี่โปรแกรมเรียกใช้มันก็ตามที การทำงานในลักษณะนี้เรียกว่า Dynamic Linking ซึ่งแตกต่างจากการเรียกโปรแกรมย่อย ข้อดีของการทำ Dynamic Linking ก็คือ ประหยัดทรัพยากรระบบ ซึ่งในที่นี้ก็คือ หน่วยความจำ และ ฮาร์ดดิสต์ เนื่องจากแต่ละโปรแกรม ใช้โค้ดจากโปรแกรมย่อยร่วมกัน ตามที่ได้กล่าวมาแล้ว ข้อดีอีกข้อหนึ่ง คือ มีมาตรฐานการติดต่อผู้ใช้เหมือนกัน เราจะสังเกตได้ว่า เมนูของแต่ละโปรแกรมของ Windows มีลักษณะเหมือนกัน ไดอะล็อกซ์สำหรับจัดเก็บไฟล์ หรือ เปิดไฟล์ก็มีรูปร่างเหมือนกัน ทั้งนี้ก็เพราะการเรียกใช้โปรแกรมย่อย API ชุดเดียวกันนั่นเอง
http://www.g2gnet.com/webboard/images/vb6/ApiTextViewer.gif
การเรียกใช้งาน API Text Viewer

http://www.g2gnet.com/webboard/images/vb6/ApiViewer.gif
ตัวอย่างในการเรียกใช้งาน API ด้วย SendMessage

การประกาศโปรแกรมย่อย API
สามารถเขียนไว้ที่ส่วนของการ Declaration เหมือนการประกาศตัวแปรในตัวโมดูล (Module) ใดโมดูลหนึ่งก็ได้ แต่โดยทั่วไปจะไว้รวมกันที่ใดที่หนึ่งในโมดูล .BAS เราอาจสร้างโมดูลขึ้นมาโมดูลหนึ่ง สำหรับจัดเก็บการประกาศฟังค์ชั่น และ ซับรูทีนของ API โดยเฉพาะก็ได้ ในการทำงานของ Windows นั้น Control หรือ ที่เรียกกันว่า Object แต่ละตัวนั้น มีการสื่อสารกันด้วยเมสเสจ (Message) เช่น เมื่อเราใช้ Method Clear กับลิสต์บ็อกซ์ (ListBox) จะเกิด Message "ลบรายการของตัวเองทั้งหมด" ไปให้กับ ListBox ตัวนั้น เป็นต้น แต่ Microsoft Visual Basic ไม่สามารถส่ง Message เองได้ ตัวมันจะต้องใช้ฟังค์ชั่น API เพื่อส่ง Message ออกไปยัง Control (หรือ Object) โดยใช้ฟังค์ชั่น SendMessageซึ่งจะช่วยเพิ่มเติมขีดความสามารถให้กับ Visual Basic ได้ในหลายๆด้าน ...

ข้อมูลเพิ่มเติมจาก MSDN

ตัวอย่างการใช้งาน API ขั้นพื้นฐาน ...
การประกาศฟังค์ชั่นของ SendMessage มีดังนี้คือPrivate Declare Function SendMessage Lib "User32" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    lParam As Any _
    ) As Longเมื่อ :
hWnd คือ Handle ของคอนโทรลปลายทางที่เราต้องการส่ง Message ไปให้
wMsg คือ ตัวเมสเสจที่การส่ง
wParam และ lParam คือ พารามิเตอร์เสริม ซึ่งมีหน้าที่ และ ความหมายแตกต่างกันไปใน Message แต่ละชนิด

ตัวอย่างการค้นหาคำใน ListBox ด้วยการใช้ API (Visual Basic 6.0 - SP6)
http://www.g2gnet.com/webboard/images/vb6/apisample.png
พื้นฐานทั่วไปของ ListBox Control มันเป็นการนำข้อมูลมาแสดงผลเท่านั้น แต่ไม่สามารถทำการค้นหาตัวมันเองได้ ดังนั้นเราจึงต้องนำ API มาใช้งาน โดยอาศัยเทคนิคของฟังค์ชั่น SendMessage (ปกติแล้ว Control หรือ Object แต่ละตัวนั้นมีการพูดคุยหรือติดต่อสื่อสารกันได้ ก็เพราะ SendMessage นี่แหละครับ) ด้วย LB_FINDSTRING (ListBox Find String - &H18F) สำหรับ ListBox เพื่อระบุตำแหน่งในส่วนที่ตรงกันกับตัวอักษรที่เราคีย์เข้าไป ดังนั้น Message ที่เราส่งไปยัง List Box มันก็คือ ค่าเลขจำนวนเต็มคงที่ (Constant) ในที่นี้ก็คือ 18F ฐานสิบหกนั่นเอง โดยที่ฟังค์ชั่น:

SendMessage(hWnd, LB_FINDSTRING, wParam, lParam)
Option Explicit

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    lParam As Any _
    ) As Long
   
Const LB_FINDSTRING = &H18F

'// ส่วนของโค้ดที่จะอยู่ในฟอร์ม -Form1
Private Sub Form_Load()
    List1.Clear
    ' เพิ่มรายการ (Item) เข้าไปไว้ใน ListBox
   
    List1.AddItem "Apples"
    List1.AddItem "Banana"
    List1.AddItem "Bread"
    List1.AddItem "Break"
    Text1.Text = ""
End Sub

'// เกิดเหตุการณ์เปลี่ยนแปลงใน TextBox

Private Sub Text1_Change()
    List1.ListIndex = SendMessage(List1.hWnd, LB_FINDSTRING, -1, ByVal Text1.Text)
End SubConslusion: การใช้งาน Win API ค่อนข้างยากต่อการทำความเข้าใจพอสมควร แต่ก็ต้องค่อยๆศึกษาเรียนรู้กันไป ครั้นพอสักระยะเราจะจับจุดมันได้เองแหละครับ ... สวัสดี

หน้า: [1]
ดูในรูปแบบกติ: มาทำความรู้จักกับ Application Programming Interface (API)