04-09-2010, 21:19
|
|
|
חבר מתאריך: 30.07.05
הודעות: 949
|
|
המ.. אנסה להרחיב מעט:
הדבר הראשון הוא להבין היטב מה זה DLL ולשם כך צריך להבין את תהליך הקומפילציה וההרצה של תוכנה:
התוכנה עוברת למעשה 3 שלבים במחזור החיים שלה במחשב - הידור (קומפילציה), קישור (linking) וטעינה (loading) כאשר תהליכי הקישור והטעינה קשורים זה בזה קשר הדוק.
תוכנות גדולות כיום נבנות ממספר רב של קבצים. כל קובץ עובר הידור בנפרד לקבצי אובייקט. קבצים אלו אינם מושלמים מ-2 בחינות:
1. חסרות בהם פונקציות שמומשו בקבצים אחרים
2. הגישות לזיכרון בעייתיות כיוון שאי אפשר לדעת בזמן הקומפילציה היכן יטען הקוד לזיכרון הפיסי של המחשב*
בשלב הקישור נלקחים קבצי האובייקט ולאחר עיבוד (די מתוחכם) נוצר קובץ הרצה (loading module). בשלב הקישור החלקים הריקים בקבצי האובייקט ממולאים במיקום היחסי של הפונקציות המתאימות במודול ההרצה. המידע הבינארי משורשר וכתובות מוזזות בהתאמה למיקום היחסי של קובץ האובייקט בקובץ ההרצה.
גם בשלב זה הקוד אינו מוכן לריצה כי, כאמור, אין דרך לדעת לאיזה אזור פיסי בזיכרון הקוד ייטען.
כאשר התוכנית מורצת, היא עוברת טעינה והכתובות מוזזות באופן יחסי למיקום הפיסי בו הקוד נטען.
סליחה אם אתה כבר יודע את כל זה, אבל זה רקע חשוב להבנה של מה זה DLL
DLL - Dynamic Link Library הוא למעשה אוסף פונקציות מקומפלות חלקית (כמו קובץ אובייקט) אלא שהקוד בנוי באופן כזה שתהליך הקישור יקרה רק בתהליך הטעינה (כפי שאמרתי, התהליכים מאד קשורים זה בזה)
הקישור יכול להעשות באחד מ-2 אופנים:
קישור סטטי - במקרה זה, קובץ ההרצה מכיל מקומות ריקים (כמו בקובץ האובייקט) במקומות בהם יש קריאות לפונקציות של ה-DLL. במהלך הטעינה, ה-loader טוען את קובץ ההרצה, קורא בו אילו DLL-ים עליו לטעון וטוען גם אותם (רקורסיבית, במקרה שאלו מסתמכים על DLL-ים נוספים). לאחר מכן הוא משלים את תהליך הקישור ומציב במקומות הנכונים את כתובות הפונקציות של ה-DLL**.
קישור דינאמי - במקרה זה, הקוד הרץ מבקש לטעון קובץ DLL ומבצע בו חיפושים בזמן ריצה. במקרה זה משתמשים בפונקציות שירות של מערכת ההפעלה ע"מ לקבל מצביעים לפונקציות של ה-DLL ועובדים עם מצביעים אלו בזמן ריצה.
-----
ב-VS 2008 קישור סטאטי נעשה כך:
הולכים למאפייני הפרוייקט (Project properties) תחת Linker הולכים לחלק ה-Input ובשדה ה-Additional dependencies מוסיפים את ה-DLL המבוקש.
ה-DLL צריך להמצא בתקייה יחד עם ה-lib המתאים לו וקובץ h. המתאים לו צריך להיות מוסף לקבצים הרלבנטיים. ללא קובץ h. מתאים, השימוש יהיה בעייתי, מן הסתם...
קישור דינאמי ב-windows נעשה כך:
עושים include ל-windows.h
בתוכו ישנן 2 פונקציות חשובות: LoadLibrary שמקבלת מחרוזת שהיא כתובת (path) של ה-DLL ומחזירה מזהה של ה-DLL הנטען מטיפוס HMODULE
GetProcAddress שמקבלת את המזהה של ה-DLL ומחרוזת שהיא שם של הפונקציה ב-DLL ומחזירה מצביע את הפונקציה המתאימה. המרת טיפוס הפונקציה לטיפוס הנכון היא על אחריות המתכנת.
* זיכרון וירטואלי פותר בעיה זו חלקית אולם נעזוב את זה כרגע
** למעשה התהליך קצת יותר מורכב מזה. בקישור סטטי בקובץ ההרצה ישנן כתובות יחסיות של פונקציות בתוך קובץ ה-DLL וה-loader רק מבצע תיקון של כתובות אלו ביחס למיקום הטעינה של ה-DLL בזיכרון הפיסי.
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.
|