יש להשלים ערך זה: בערך זה חסר תוכן מהותי. ייתכן שתמצאו פירוט בדף השיחה.
הנכם מוזמנים להשלים את החלקים החסרים ולהסיר הודעה זו. שקלו ליצור כותרות לפרקים הדורשים השלמה, ולהעביר את התבנית אליהם.

Dynamic-Link Libraryעברית: ספריית קישור-דינמי), או בראשי-תיבות DLL, הוא מימוש של רעיון הספרייה המשותפת במערכות ההפעלה חלונות של מיקרוסופט ובמערכת ההפעלה OS/2. קובץ DLL בנוי כקובץ Portable Executable ‏(PE), ונבדל מקובץ הרצה רגיל של חלונות (קובץ EXE) רק על ידי ביט אחד ב-header. כמו כל קובץ PE, קובץ DLL יכול להכיל קוד מקור מהודר (פונקציות), נתונים ומשאבים.

Dynamic-Link Library
סיומת קובץ .dll
סוג מדיה באינטרנט application/vnd.microsoft.portable-executable
UTI com.microsoft.windows-dynamic-link-library
מפתח מיקרוסופט עריכת הנתון בוויקינתונים
לעריכה בוויקינתונים שמשמש מקור לחלק מהמידע בתבנית

במובן הרחב, גם קבצים שמכילים אך ורק נתונים, כגון ספריות צלמיות (icons) וספריות גופנים, יכולים להיקרא קובצי DLL.

מלבד סיומת ה-DLL, שמות קבצים ממשפחה זו עשויים להסתיים באחת מהסיומות הבאות: OCX – ספריית ActiveX, וכן DRV – ספריית מנהל התקן. קובצי DLL רבים של מערכת ההפעלה חלונות ממוקמים בספרייה system32 עבור 64 ביט או SysWOW64 עבור 32 ביט, אך קיימים בכל מקום במערכת הקבצים.

יתרונות וחסרונות

עריכה

ספריית קישור-דינמי מהווה רעיון מרכזי במערכות ההפעלה חלונות לדורותיהן. היתרון המרכזי של קובצי DLL הוא המודולריות, שמאפשרת שינוי בקוד המקור במספר תוכניות בו זמנית מבלי לשנות את התוכניות עצמן. יתרון נוסף הוא היכולת להוסיף מודולים לתוכניות קיימות כמו ההרחבות בתוכנות של קרן מוזילה. רעיון זה מנוצל בצורה מקסימלית בטכנולוגיית COM.

מול היתרונות קיימים גם לא מעט חסרונות שמכונים באופן כללי DLL hell. כרגע מיקרוסופט מקדמת את טכנולוגיית NET. כפתרון לרוב הבעיות הללו.

שימוש

עריכה

תוכנות אשר נוצרות בתהליך של קישור סטטי (Static Link), מכלילות את הספריות הרצויות להן בקובץ ההפעלה של התוכנה, ולכן אין להן צורך בקובצי DLL בזמן הריצה. לעומתן, תוכנות אשר נוצרות בתהליך של קישור דינמי (Dynamic Link), דורשות הימצאות של קובצי DLL במחשב עליו הן פועלות.

טבלאות ייבוא וטבלאות ייצוא

עריכה

בתהליך של קישור דינמי, מרוכזות כל הפונקציות הנמצאות בקובצי DLL חיצוניים לתוך טבלה שכל המצביעים שלה ריקים. במהלך טעינת התוכנית על ידי המקשר הדינמי של חלונות (PE Loader), מתבצעת טעינה של קובצי ה-DLL הרלוונטיים לזיכרון הפיזי (אם אחד מקובצי ה-DLL אשר התוכנה תלויה בהם לא קיים במערכת, התוכנה לא תיטען כלל). לרוב קובצי DLL לא עוברים לזיכרון הווירטואלי, אלא נשארים בזיכרון הפיזי עד שכל התוכניות שזקוקות להם מסיימות את פעולתן.

לאחר שכל קובצי ה-DLL הרלוונטיים נטענו לזיכרון, מתבצע מיפוי כתובות של הפונקציות ועדכון של כל המצביעים בטבלת היבוא. פעולת המיפוי נעזרת בטבלאות ייצוא, שמתאימות מספר הסידורי לכל אחת מהפונקציות בקובץ ה-DLL. בדרך כלל, עדיף לייבא פונקציות באמצעות שמן, שכן בגרסאות השונות של מערכת ההפעלה חלונות הסדר של הפונקציות בקובצי ה-DLL יכול להשתנות. החל ממערכות 32 ביט של חלונות טבלאות היצוא מסודרות לפי שם, ולכן ניתן לאתר את הפונקציות בחיפוש בינארי שהתקורה שלו לא גבוהה במיוחד.

טעינה מושהית (Delay load)

עריכה

באפשרות זו, טעינה של קובץ DLL תתבצע רק כאשר התוכנית תקרא בפעם הראשונה לפונקציה שנמצאת בו, והקובץ יישאר בזיכרון הפיזי עד לסיום של כל התוכניות שתלויות בו. אופציה זו מאפשרת טעינה מהירה יותר של התוכנה, וכן הפעלה של התוכנה גם ללא הימצאות של כל קובצי ה-DLL הנדרשים. במקרה שהתוכנה תנסה להשתמש בפונקציה שקובץ ה-DLL שלה לא קיים, ייזרק חריג מובנה (Structured Exception) בתהליכון (Thread) אשר קרא לפונקציה.

קישור יזום

עריכה

קיימות שלוש פונקציות בסיסיות ב-API של Windows, שמאפשרות לטעון ספריות DLL באופן יזום ומבוקר. למעשה, גם שתי האפשרויות הקודמות משתמשות בפונקציות אלה באופן שקוף למפתח התוכנה. הפונקציות ממוקמות בקובץ kernel32.dll, אשר נטען למרחב הזיכרון בתהליך האתחול של חלונות ונשאר שם עד לכיבוי המחשב או ליציאה ממערכת ההפעלה:

  • הפונקציה LoadLibrary מקבלת את המיקום המוחלט, המיקום היחסי או המיקום הסתמי שם קובץ PE (ראה בסעיף סדר טעינה), טוענת אותו למרחב הזיכרון ומחזירה את הכתובת אליה הוא נטען (Base Address). הפונקציה מנהלת מנגנון Reference count, שמונע טעינה כפולה של אותו קובץ, כלומר: כאשר תוכנית קוראת לפונקציה בקובץ DLL כלשהו, הפונקציה טוענת את הקובץ רק אם הוא לא נמצא כבר בזיכרון הפיזי (דינמי). הפונקציה יכולה לקבל שם קובץ בפורמט Unicode.
  • הפונקציה GetProcAddress מחפשת כתובות של פונקציות בקובצי DLL שנמצאים במרחב הזיכרון. הפונקציה מקבלת את כתובת הבסיס של ה-DLL ואת שמה של הפונקציה שאותה רוצים לייבא. שם הפונקציה לא יכול להיות בפורמט Unicode.
  • הפונקציה FreeLibrary משחררת את קובץ ה-DLL ממרחב הזיכרון.

כישלון באחת מהפונקציות הנ"ל מתבטא בהחזרת ערך שגיאה, איתו ניתן להתמודד באופן מבוקר באמצעות הודעה למשתמש או ניסיון לטעינת קובץ אחר (ראה טיפול בחריגות).

היתרון בקישור יזום הוא האפשרות שהוא נותן למפתח להתמודד עם שגיאות שיכולות להתרחש בזמן ריצה, וללא קישור יזום היו גורמות להודעת שגיאה של מערכת ההפעלה או לסיום של התוכנית.

סדר טעינה

עריכה

כאשר נטען קובץ DLL בעל שם סתמי, ללא ציון מיקום מלא, המערכת תחפש אותו במיקומים הבאים, לפי סדר:

  1. הספרייה ממנה נטענה התוכנה
  2. ספריית system32
  3. ספריית system
  4. ספריית windows
  5. הספרייה הנוכחית של התוכנה (Current working directory)
  6. הספריות המופיעות במשתנה הסביבה PATH.

סדר החיפוש עשוי להשתנות, בעיקר משיקולי אבטחה. לדוגמה, במידה ונבחרת רמת אבטחה נמוכה יותר, יתבצע חיפוש בספרייה הנוכחית לפני ספריות system32 ו-system.[1]

קובצי DLL נפוצים במערכת ההפעלה חלונות

עריכה

להלן מספר דוגמאות של קובצי DLL שנטענים עם האתחול של מערכת ההפעלה חלונות.

שם הקובץ תיאור
kernel32.dll Windows BASE API Client DLL
user32.dll Windows USER API Client DLL
advapi32.dll Advanced Windows 32 Base API
ntdll.dll NT Layer DLL
msvcrt.dll Windows CRT DLL

Component Object Model

עריכה
  ערך מורחב – COM

מודל האובייקטים של הרכיבים (COM) הוא הרחבה של רעיון ה-DLL לתכנות מונחה עצמים. לכל אובייקט מסוג COM יש מזהה אישי (GUID) ייחודי, וניתן לקרוא לו מתהליכים, מסקריפטים או ממחשבים שונים. אובייקטים מסוג COM מורכבים יותר למימוש מאשר קובצי DLL.

ראו גם

עריכה

קישורים חיצוניים

עריכה

הערות שוליים

עריכה
  1. ^ stevewhims, Dynamic-Link Library Search Order - Win32 apps, docs.microsoft.com (באנגלית אמריקאית)