Dynamic-Link Library – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
Yonidebot (שיחה | תרומות)
מ בוט החלפות: כישלון;
Matanyabot (שיחה | תרומות)
מ בוט: מתקן הפניות
שורה 1:
'''Dynamic-Link Library''' (ב[[עברית]]: '''ספריית קישור-דינמי'''), או בראשי-תיבות '''DLL''', הוא המימוש של רעיון [[ספרייה (תכנות)|הספרייה]] המשותפת ב[[מערכת הפעלה|מערכות ההפעלה]] [[microsoft Windows|חלונות]] של [[מיקרוסופט]] ובמערכת ההפעלה [[OS/2]]. [[קובץ]] DLL עונה למבנה של קובץ [[Portable Executable|PE]] בחלונות, כאשר [[סיבית|ביט]] אחד ב-Header, מבדיל בינו לבין [[קובץ הרצה]] רגיל של חלונות (קובץ EXE). כמו כל קובץ PE, קובץ DLL יכול להכיל [[קוד מקור]], נתונים ו[[משאב (חלונות)|משאב]]ים. קובצי DLL רבים של מערכת ההפעלה חלונות ממוקמים בספרייה [[system32]].
 
שמות קובצי DLL עשויים להסתיים באחת מהסיומות הבאות:
*DLL
*OCX – ספריית [[OLE#ActiveX|ActiveX]]
*DRV – ספריית [[מנהל התקן]]
 
שורה 13:
מול היתרונות קיימים גם לא מעט חסרונות שמכונים באופן כללי [[DLL hell]]. כרגע מיקרוסופט מקדמת את טכנולוגיית [[‎.NET]] כפתרון לרוב הבעיות הללו.
==שימוש==
תוכנות אשר נוצרות בתהליך של [[מקשר (תוכנה)|קישור סטטי]] (Static Link), מכלילות את הספריות הרצויות להן בקובץ ההפעלה של התוכנה, ולכן אין להן צורך בקובצי DLL בזמן הריצה. לעומתן, תוכנות אשר נוצרות בתהליך של [[מקשר דינמי|קישור דינמי]] (Dynamic Link), דורשות הימצאות של קובצי DLL במחשב עליו הן פועלות.
 
===טבלאות ייבוא וטבלאות ייצוא===
בתהליך של קישור דינמי, מרוכזות כל ה[[פונקציהשגרה (תכנות)|פונקציות]] הנמצאות בקובצי DLL חיצוניים לתוך [[מערך (מבנה נתונים)|טבלה]] שכל ה[[מצביע]]ים שלה ריקים. במהלך טעינת התוכנית על ידי ה[[מקשר דינמי|מקשר הדינמי]] של [[microsoft Windows|חלונות]] (PE Loader), מתבצעת טעינה של קובצי ה-DLL הרלוונטיים ל[[זיכרון פיזי|זיכרון הפיזי]] (במקרה ואחד מקבצי ה-DLL אשר התוכנה תלויה בהם לא קיים במערכת, התוכנה לא תיטען כלל). לרוב קובצי DLL לא עוברים ל[[זיכרון וירטואלי|זיכרון הווירטואלי]], אלא נשארים בזיכרון הפיזי עד שכל התוכניות שזקוקות להם מסיימות את פעולתן.
 
לאחר שכל קובצי ה־DLL הרלוונטיים נטענו לזיכרון, מתבצע מיפוי כתובות של הפונקציות ועדכון של כל המצביעים בטבלת היבוא. פעולת המיפוי נעזרת בטבלאות ייצוא, שמתאימות מספר הסידורי לכל אחת מהפונקציות בקובץ ה־DLL. בדרך כלל, עדיף ליבא פונקציות באמצעות שמן, שכן בגרסאות השונות של מערכת ההפעלה חלונות הסדר של הפונקציות בקובצי ה־DLL יכול להשתנות. החל ממערכות 32־ביט של חלונות טבלאות היצוא מסודרות לפי שם, ולכן ניתן לאתר את הפונקציות ב[[חיפוש בינארי]] שה[[תקורה]] שלו לא גבוהה במיוחד.
שורה 24:
 
===קישור יזום===
קיימות שלוש פונקציות בסיסיות ב-API של Windows, שמאפשרות לטעון ספריות DLL באופן יזום ומבוקר. למעשה, גם שתי האפשרויות הקודמות משתמשות בפונקציות אלה באופן שקוף למפתח התוכנה. הפונקציות ממוקמות בקובץ kernel32.dll, אשר נטען למרחב הזיכרון בתהליך ה[[אתחול]] של [[microsoft Windows|חלונות]] ונשאר שם עד לכיבוי המחשב או ליציאה ממערכת ההפעלה:
*הפונקציה '''LoadLibrary''' מקבלת את המיקום המוחלט, המיקום היחסי או המיקום הסתמי שם קובץ PE (ראה בסעיף [[Dynamic-Link Library#סדר טעינה|סדר טעינה]]), טוענת אותו למרחב הזיכרון ומחזירה את הכתובת אליה הוא נטען (Base Address). הפונקציה מנהלת מנגנון Reference count, שמונע טעינה כפולה של אותו קובץ , כלומר: כאשר תוכנית קוראת לפונקציה בקובץ DLL כלשהו, הפונקציה טוענת את הקובץ רק אם הוא לא נמצא כבר בזיכרון הפיזי. הפונקציה יכולה לקבל שם קובץ בפורמט [[יוניקוד|Unicode]].
*הפונקציה '''GetProcAddress''' מחפשת כתובות של פונקציות בקובצי DLL שנמצאים במרחב הזיכרון. הפונקציה מקבלת את כתובת הבסיס של ה־DLL ואת שמה של הפונקציה שאותה רוצים לייבא. שם הפונקציה לא יכול להיות בפורמט Unicode.
*הפונקציה '''FreeLibrary''' משחררת את קובץ ה־DLL ממרחב הזיכרון.
שורה 44:
 
==קובצי DLL נפוצים במערכת ההפעלה חלונות==
להלן מספר דוגמאות של קובצי DLL שנטענים עם האתחול של מערכת ההפעלה [[microsoft Windows|חלונות]].
{| class="wikitable" border="1"
! שם הקובץ !! תיאור
שורה 60:
 
== Component Object Model==
מודל האובייקטים של הרכיבים (COM) הוא הרחבה של רעיון ה־DLL ל[[תכנות מונחה עצמים]]. לכל אובייקט מסוג COM יש מזהה אישי ([[Globally Unique Identifier|GUID]]) ייחודי, וניתן לקרוא לו מתהליכים, מסקריפטים או ממחשבים שונים. אובייקטים מסוג COM מורכבים יותר למימוש מאשר קובצי DLL.