DLL ของ Windows สามารถเรียกคืนชื่อไฟล์ของมันเองได้หรือไม่?

เมื่อโปรแกรมใน Windows คุณอาจพบว่าตนเองอยู่ในสถานการณ์ที่จำเป็นต้องทราบชื่อไฟล์ของ Dynamic Link Library (DLL) ที่กำลังใช้งานอยู่ ในขณะที่ไฟล์ที่สามารถเรียกใช้งาน (EXEs) จะมีการเข้าถึงสตริงคำสั่งที่เรียกใช้งานพวกมัน (พร้อมกับเส้นทางไฟล์ของพวกมัน) DLLs ที่ถูกเรียกผ่าน LoadLibrary จะไม่สืบทอดข้อมูลนี้ สิ่งนี้อาจเป็นความท้าทายสำหรับนักพัฒนาที่ต้องการรับเส้นทางและชื่อไฟล์ของ DLL ของตน ในบทความนี้ เราจะสำรวจวิธีแก้ปัญหาที่เหมาะสมสำหรับการเขียนโปรแกรม Delphi ที่ช่วยให้คุณเรียกคืนข้อมูลที่สำคัญนี้ได้

ความท้าทาย

DLLs ไม่ได้ถูกเรียกใช้งานในลักษณะเดียวกับ EXEs ซึ่งหมายความว่าพวกเขาขาดการเข้าถึงพารามิเตอร์บรรทัดคำสั่งหรือลักษณะของเส้นทางไฟล์ ความจำเป็นในการกำหนดชื่อไฟล์ของ DLL อาจเกิดขึ้นจากหลายเหตุผล รวมถึง:

  • การบันทึก: ติดตามโมดูลที่ทำงานอยู่ในแอปพลิเคชันสำหรับวัตถุประสงค์ในการแก้ไขข้อผิดพลาด
  • การกำหนดค่า: โหลดทรัพยากรหรือการกำหนดค่าที่เพิ่มเติมตามตำแหน่งของ DLL
  • การจัดการแบบไดนามิก: ให้มั่นใจว่าส่วนประกอบกำลังโหลดเวอร์ชันที่ถูกต้องของ DLL

ไม่ว่าความกระตือรือร้นจะเป็นอะไร คุณต้องมีวิธีในการเรียกคืนชื่อไฟล์ DLL ในขณะที่มันกำลังทำงาน นี่คือที่ฟังก์ชัน API ของ Windows GetModuleFileName มีบทบาท

วิธีแก้ปัญหา: การใช้ GetModuleFileName ใน Delphi

วิธีที่มีประสิทธิภาพที่สุดในการรับชื่อไฟล์ DLL คือการใช้ฟังก์ชัน GetModuleFileName จาก Windows API ฟังก์ชันนี้จะเรียกคืนเส้นทางทั้งหมดของไฟล์ที่สามารถเรียกใช้งานของโมดูลที่ระบุ รวมถึง DLLs

ขั้นตอนการนำไปปฏิบัติ

ด้านล่างนี้เป็นภาพรวมที่กระชับเกี่ยวกับวิธีการนำวิธีแก้ไขนี้ไปใช้ใน Delphi:

  1. การประกาศตัวแปร: ตั้งค่าอาร์เรย์เพื่อเก็บชื่อไฟล์และเตรียมมันให้พร้อมใช้งาน
  2. เรียก GetModuleFileName: ใช้ฟังก์ชัน API นี้เพื่อเติมอาร์เรย์ด้วยเส้นทางและชื่อไฟล์ของ DLL

ตัวอย่างโค้ด

นี่คือตัวอย่างฟังก์ชันที่แสดงวิธีการทำเช่นนี้ใน Delphi:

function GetModuleName: string;
var
  szFileName: array[0..MAX_PATH] of Char;
begin
  FillChar(szFileName, SizeOf(szFileName), #0);  // เคลียร์บัฟเฟอร์
  GetModuleFileName(hInstance, szFileName, MAX_PATH); // รับชื่อไฟล์
  Result := szFileName; // ส่งกลับชื่อไฟล์เป็นสตริง
end;

การตีความโค้ด

  • ฟังก์ชัน FillChar: ฟังก์ชันนี้ใช้ในการเริ่มต้นอาร์เรย์ szFileName เพื่อให้แน่ใจว่ามันว่างเปล่าก่อนที่จะพยายามเติมมันด้วยชื่อไฟล์ของโมดูล
  • hInstance: ตัวแปรนี้เป็นตัวแปรทั่วโลกที่ให้โHandle อินสแตนซ์ของโมดูลปัจจุบัน (DLL) ที่กำลังถูกเรียกใช้งาน
  • MAX_PATH: ค่านี้กำหนดความยาวสูงสุดของเส้นทาง (260 ตัวอักษร) เพื่อให้แน่ใจว่าบัฟเฟอร์มีพื้นที่เพียงพอสำหรับชื่อไฟล์ที่ได้รับ

โดยการเรียกใช้ฟังก์ชัน GetModuleName ข้างต้นภายใน DLL ของคุณ คุณจะได้รับเส้นทางและชื่อไฟล์ทั้งหมด ทำให้คุณสามารถใช้ข้อมูลนั้นตามต้องการได้

สรุป

โดยสรุป ในขณะที่ DLLs ไม่มีการเข้าถึงพารามิเตอร์บรรทัดคำสั่งที่เรียกใช้งานได้โดยตรง คุณสามารถเรียกคืนชื่อไฟล์ของพวกเขาได้อย่างง่ายดายโดยใช้ฟังก์ชัน GetModuleFileName จาก Windows API โดยการนำโค้ดง่าย ๆ ที่ให้ไว้ข้างต้นไปใช้ใน Delphi คุณสามารถเพิ่มฟังก์ชันการทำงานและความสามารถในการจัดการข้อมูลของแอปพลิเคชันของคุณได้

อย่าลืมทดสอบการนำไปปฏิบัติเพื่อให้แน่ใจว่ามันตรงตามความต้องการเฉพาะของคุณ โชคดีในการเขียนโค้ด!