This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
tutorial:dlllibrary [2018/12/23 21:20] admin |
tutorial:dlllibrary [2019/03/15 10:42] (current) admin |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| | Linux | .so | | | Linux | .so | | ||
| | MacOS X | .dylib | | | MacOS X | .dylib | | ||
| - | \\ \\ | + | \\ |
| =====การสร้าง Shared Library===== | =====การสร้าง Shared Library===== | ||
| ใน Lazarus IDE เราสามารถสร้าง Shared Library ไว้ใช้งานสำหรับ Window, Linux และ MacOS X ได้ทั้งหมดครับ โดยการเลือกเมนู \\ | ใน Lazarus IDE เราสามารถสร้าง Shared Library ไว้ใช้งานสำหรับ Window, Linux และ MacOS X ได้ทั้งหมดครับ โดยการเลือกเมนู \\ | ||
| Line 47: | Line 47: | ||
| Run >> Compile | Run >> Compile | ||
| - | เมื่อทำการ compile เสร็จเรียบร้อย เราจะได้ไฟล์ .dll ที่พร้อมใช้งานครับ | + | เมื่อทำการ compile เสร็จเรียบร้อย เราจะได้ไฟล์ .dll ที่พร้อมใช้งานครับ ให้นำไฟล์ .dll ไปไว้ใน folder เดียวกับไฟล์ Project เราได้เลย |
| <hidden Example-1: Create .dll Library> | <hidden Example-1: Create .dll Library> | ||
| Line 84: | Line 84: | ||
| <hidden Example-2: Static Calling .dll Library> | <hidden Example-2: Static Calling .dll Library> | ||
| - | **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ | + | **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe (จาก Example-1) เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ |
| __ข้อสังเกต__: ชื่อตัวแปร Argument ของในโปรแกรมนี้ ไม่ตรงกับใน .dll \\ | __ข้อสังเกต__: ชื่อตัวแปร Argument ของในโปรแกรมนี้ ไม่ตรงกับใน .dll \\ | ||
| *ไฟล์นี้ ใช้ PipeArea1(const D,Di:double):double \\ | *ไฟล์นี้ ใช้ PipeArea1(const D,Di:double):double \\ | ||
| Line 118: | Line 118: | ||
| <hidden Example-3: Dynamic Calling .dll Library> | <hidden Example-3: Dynamic Calling .dll Library> | ||
| - | **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ | + | **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe (จาก Example-1) เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ |
| __ข้อสังเกต__: มีดังนี้ \\ | __ข้อสังเกต__: มีดังนี้ \\ | ||
| *จะต้องมี unit ชื่อ Dynlibs\\ | *จะต้องมี unit ชื่อ Dynlibs\\ | ||
| - | *จะต้องมีการเรียกใช้ function เป็นตัวแปร หรือที่เรียกว่า Procedural Type และจะต้องระบุ Calling Convention ตามหลังด้วย (ยกเว้น Default Calling)\\ | + | *จะต้องมีการเรียกใช้ function เป็นตัวแปร หรือที่เรียกว่า Procedural Type \\ |
| - | <sxh delphi;> | + | <sxh delphi;highlight: [8,13-14,20-35,42]> |
| - | program StaticCalling_PIPEDLL; | + | program DynamicCalling_PIPEDLL; |
| - | //This example demonstrates the simple use of static calling .dll library. | + | //This example demonstrates the simple use of static/Dynamic calling. |
| //For calling convention, register is used by default. | //For calling convention, register is used by default. | ||
| Line 183: | Line 183: | ||
| | oldfpccall | 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 มีทั้งเรื่องทิศทางการใส่ค่าตัวแปร และการกำจัดค่าของตัวแปรใน 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 ใน .dll ไม่ตรงกับการเรียกใช้ในไฟล์ .exe ก็อาจทำให้เกิดการใส่ตัวแปรในแต่ละ Argument ของ Procedure/Function สลับกันได้ จะนำไปสู่การคำนวณที่ผิดพลาดอย่างแน่นอน | ||
| \\ \\ | \\ \\ | ||
| - | **__หมายเหตุ__** - การไม่ระบุ Calling Convention นั้น จะหมายถึงการเรียกใช้งานแบบ default ซึ่งตัว default สำหรับ FPC คือ register | + | **__หมายเหตุ__** - การไม่ระบุ Calling Convention นั้น จะหมายถึงการเรียกใช้งานแบบ default ซึ่ง default calling convention สำหรับ FPC คือ register |
| - | <hidden Example-3: Static Calling .dll Library using stdcall as calling convention> | + | <hidden Example-4: Static Calling .dll Library using stdcall as calling convention> |
| **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ | **ตัวอย่าง** การเรียก Library ชื่อว่า Pipe เพื่อเก็บฟังก์ชั่นคำนวณหาพื้นที่หน้าตัดท่อ\\ | ||
| - | __ข้อสังเกต__: จะต้องมีการระบุ Calling Convention ทั้งใน .dll และโปรแกรมหลัก \\ | + | __ข้อสังเกต__: เราจะใช้ Calling ที่ชื่อว่า stdcall ซึ่งจะต้องมีการระบุ Calling Convention ทั้งใน .dll และโปรแกรมหลัก \\ |
| <sxh delphi;highlight: [8,13]> | <sxh delphi;highlight: [8,13]> | ||