Shared Library คือ แหล่งเก็บ subprogram หรือ Procedure/function ที่ได้ถูก compiled เรียบร้อยแล้วและพร้อมให้ถูกเรียกใช้งาน
นามสกุลของ Shared Library จะแตกต่างกันไป ขึ้นอยู่กับ Operating System สรุปได้ตามตารางต่อไปนี้
Operating System (OS) | Library Extension |
---|---|
Window | .dll |
Linux | .so |
MacOS X | .dylib |
ใน Lazarus IDE เราสามารถสร้าง Shared Library ไว้ใช้งานสำหรับ Window, Linux และ MacOS X ได้ทั้งหมดครับ โดยการเลือกเมนู
File >> New >> Library
นามสกุลของ Shared Library ที่ถูก Compiled แล้วจะเป็นไปตาม OS ที่เราใช้งานในขณะนั้น
อย่างไรก็ตาม ในส่วนของรายละเอียดการสร้างและใช้งาน library ในที่นี้จะขอพูดถึงแต่ .dll ละกันครับ
ข้อควรระวัง -
เนื่องจาก Shared Library เป็น Code ที่ถูก Complied เรียบร้อยแล้ว ดังนั้นหากท่านใช้ Lazarus IDE เวอร์ชั่น 32bit สร้าง library ขึ้นมาสักอัน Library ดังกล่าวจะไม่สามารถเรียกใช้งานบน Lazarus IDE - 64bit ได้ครับ
สำหรับ Lazarus IDE บน Window หลังจากสร้างไฟล์ใหม่ที่เป็น Library ขึ้นมาแล้ว จะมีหน้าต่าง text editor ขึ้นมาให้พิมพ์ code ได้เหมือนกับการสร้างโปรเจคต์แบบ Program หรือ Simple Program ครับ แต่ต่างกันคือจะมีคำว่า Library ขึ้นมาแทนคำว่า Program
การเขียน Library ไม่ยากครับ ให้ยึดรูปแบบดังนี้ครับ
library LibraryName; {$mode objfpc}{$H+} uses SysUtils, Classes; function FunctionName(Arg1, Arg2:real):real; {Calling Convention} begin result := Arg1 + Ag2; end; exports FunctionName; begin end.
หลังจากที่เราเขียน code ลงไปในไฟล์ Library แล้ว ก็ให้ไปที่เมนูแล้วเลือก
Run >> Compile
เมื่อทำการ compile เสร็จเรียบร้อย เราจะได้ไฟล์ .dll ที่พร้อมใช้งานครับ ให้นำไฟล์ .dll ไปไว้ใน folder เดียวกับไฟล์ Project เราได้เลย
การเรียกใช้งาน Shared Library สามารถเรียกได้ 2 แบบ ดังนี้
หมายเหตุ: ทั้งสองแบบ ต้องการไฟล์ .dll แนบไปใช้งานกับไฟล์ .exe ด้วยทุกครั้ง
ในทุกๆการใช้งาน Shared Library จะต้องมีการระบุรูปแบบการเรียกใช้งาน หรือ Calling Convention เสมอ โดย Calling Convention สำหรับ FPC สรุปได้ดังนี้
Keyword | Variable Push Order | Stack Cleaned by |
---|---|---|
default | LTR | Callee |
register | LTR | Callee |
cdecl | RTR | Caller |
interupt | RTR | Callee |
pascal | LTR | Callee |
safecall | RTR | Callee |
stdcall | RTR | Callee |
oldfpccall | RTR | Callee |
จากตารางข้างบนอธิบายถึงความต่างของแต่ละ Calling Convention มีทั้งเรื่องทิศทางการใส่ค่าตัวแปร และการกำจัดค่าของตัวแปรใน Ram จะเห็นได้ว่า default, register และ pascal จะมีการใส่ค่าตัวแปรแบบ “ซ้ายไปขวา” หรือ LTR (Left-to-Right) ในขณะที่ cdecl, interupt, safecall, stdcall และ oldfpccall จะใส่ค่าตัวแปรแบบ “ขวาไปซ้าย” หรือ RTL (Right-to-Left)
ข้อควรระวัง - หากเราระบุ Calling Convention ใน .dll ไม่ตรงกับการเรียกใช้ในไฟล์ .exe ก็อาจทำให้เกิดการใส่ตัวแปรในแต่ละ Argument ของ Procedure/Function สลับกันได้ จะนำไปสู่การคำนวณที่ผิดพลาดอย่างแน่นอน
หมายเหตุ - การไม่ระบุ Calling Convention นั้น จะหมายถึงการเรียกใช้งานแบบ default ซึ่ง default calling convention สำหรับ FPC คือ register