לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #3  
ישן 22-08-2010, 16:52
  משתמש זכר DigiGil DigiGil אינו מחובר  
 
חבר מתאריך: 20.10.06
הודעות: 202
שלח הודעה דרך MSN אל DigiGil
תקרא את קובץ העזרה שבד"כ מצורף ל-DLL!
בתגובה להודעה מספר 1 שנכתבה על ידי yaron2010 שמתחילה ב "פניה לפורט בשפת C -"

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

העקרון של הפעלת ה-DLL היה:
* להעתיק את כל הקבצים של הדרייבר אל ספריית הפרויקט שלך, במקום שבו נמצא קובץ ההרצה.
* להוסיף את הקובץ lib אל הפרויקט שלך (בדומה לקבצי C ו-H)
* הוספת קריאה לקובץ כותרת המתאים, כלומר משהו בסגנון "include "file.h# אל הקובץ הראשי של התוכנה שלך.
זהו פחות או יותר (לפי מה שאני זוכר). אחר-כך בקוד אתה אמור לקרוא לפונקציה שמבצעת איתחול למנגנון הפניה לפורטים ואחרי האיתחול אתה יכול לקרוא ולכתוב חופשי מהפורטים.

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

בברכה,
דיגיגיל
_____________________________________
_- סיוע בהשלמת פרויקט-גמר להנדסאים -_
(האתר digigil.com נסגר)


תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 04-09-2010, 21:19
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 1 שנכתבה על ידי yaron2010 שמתחילה ב "פניה לפורט בשפת C -"

המ.. אנסה להרחיב מעט:
הדבר הראשון הוא להבין היטב מה זה 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 בזיכרון הפיסי.
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 10:56

הדף נוצר ב 0.05 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר