מה זה HANDLE

selalerer

New member
זה ID שמעבירים למערכת ההפעלה בקריאות לפונקציות שלה.

ה-ID הזה מזהה משאב שאתה מבקש ממערכת ההפעלה לעשות משהו איתו. אתה קיבלת אותו מקריאה קודמת לפונקציה של מערכת ההפעלה שבה ביקשת ליצור משאב.
&nbsp
זה יכול להיות קובץ, socket, חלון, כל דבר ש-windows יודעת ליצר ולנהל.
&nbsp
&nbsp
 

הפרבולה

New member
אז זה סתם מצביע למקום בזכרון ?

למה קראו לזה "ידית"? למה לא קוראים לילד בשמו - מצביע ( פוינטר)?
האם אני יכול לגשת לזכרון שאליו הוא מצביע ?
 

BravoMan

Active member
אל תגיד לי שהצצת מחוץ ל-MFC אחרי כל השנים האלא?


HANDLE הוא שיטה של Win32 API להתייחס לאובייקטים שהמערכת מנהלת בשבילך.
&nbsp
למשל, כשאתה מבקש מהמערכת ליצור חלון (CreateWindow) אתה מקבל חזרה HANDLE שהוא ערך מזהה מיוחד של המערכת עבור אותו חלון, ותוכל להעביר אותו לכל פונקציה אחרת שתטפל בחלון הספציפי.
&nbsp
הרבה מה-API של Windows משתמשים בשיטה הזו.
למשל, CreateFile, או פונקציות הקצעת זיכרון של Windows (שכרגע שכחתי את שמן) אשר במקום כתובת (כמו malloc) מחזירות HANDLE לאובייקט זיכרון, ויש איזו שיטה (שגם אותה שכחתי כי שנים לא פיתחתי ל-windows) לקבל את הכתובת ממש.
&nbsp
אז לא - HANDLE הוא לא סתם מצביע, ואין להתייחס אליו ככזה, אבל הוא בהחלט "ידית" - דרך שלך "לתפוס" אובייקט תחת ניהול של מערכת הפעלה, ולבצע עליו פעולות שונות.
&nbsp
למיטב זיכרון, ואל תתפוס אותי במילה כאן כי כאמור עבר הרבה זמן מאז שהתעסקתי עם זה, המערכת מנהלת טבלאות דרכן היא מקשר בין HANDLE נתון למשאבים שלו, כגון זיכרון מוקצה.
 

הפרבולה

New member
אז זה לא באמת מצביע ?

&nbsp
אני יודע שזה דרך "לתפוס" אוביקט של המערכת, אבל מה זה בעצם ? האם זה אינדקס לטבלה ?
איך המערכת ההפעלה מקשרת בינו לבין האוביקט ?
 

BravoMan

Active member
הוא לא מצביע, הוא ערך המשמש לחיפוש בטבלה פנימית של מערכת

הפעלה.
(לא ממש אינדקס רציף כמו במערך)
&nbsp
ראה תיאור קצר כאן:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724457(v=vs.85).aspx
&nbsp
למיטב ידיעתי, המימוש של הטבלאות האלה וכיצד הערכים בהן מנוהלים הוא מידע פנימי של MS שמעולם לא פורסם.
אם תחפש, כנראה תמצא אנשים שעשו לזה הנדסה לאחור.
 

הפרבולה

New member
אוקי תודה

אז אני מבין שאנחנו לא יודעים איך המימוש הפנימי של הטיפול ב HANDLES.
 

BravoMan

Active member
אני ואתה לא, אבל כמו שאמרתי: יש הרבה אנשים באינטרנט

אני מנחש על בסיס שאלותיך שאתה מחפש לעשות משהו מיוחד עם handleים, שפונקציות Win32 רגילות לא נותנות לך לעשות.
&nbsp
אם תחפש בכיוון הנכון, והדבר אפשרי, סביר להניח שתמצא ברשת מישהו שעשה את זה, ומסביר איך עשה את זה.
אבל קח בחשבון ש-MS נוטה לשנות את המימושים הפנימיים שלה בין גרסאות המערכת, כך שפתרון כזה לא יהיה יציב לאורך זמן.
 

הפרבולה

New member
לא התכוונתי לעשות איתו משהו

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

BravoMan

Active member
זה בדיוק הרעיון בו:

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

למשל, תמיד נהוג להשתמש במתודות get ו-set במקום להפוך את המשתנים ל-public.
כך, כותב המחלקה יכול תמיד לשנות איך היא עובדת מבפנים או מאחסנת את הנתונים, אבל הקוד שמשתמש במחלקה לא יצטרך לעבור שום שינוי.

הרעיון מאחורי ה-HANDLE של MS הוא אותו רעיון בדיוק, רק שה-API נועד לתכנות פרוצדורלי ולא OOP:
אתה מצידך יכול לעבוד עם HANDLE בלי לדעת איך הוא ממומש בפנים, ו-MS מצידם יכולים לשנות את המימוש בלי לשבור את הקוד שלך.

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

אבל אני יודע שקיימים מקומות כאלה בחוץ.
נקודת התחלה שיכולה להיות מעניינת לך היא פרויקט WINE ו-ReactOS.

הראשון הוא שכבת תאימות שממשת Win32 API ומאפשרת הרצת יישומי Windows ע"ג Linux ו-Mac OS, והשנייה היא מערכת הפעלה בקוד פתוח, מפותחת מ-0 אבל תואמת ב-100% (או לפחות הם משתדלים) ל-Windows.

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

בהצלחה!
 

הפרבולה

New member
בשלב זה אני לא אתעמק יותר מידי במימוש הפנימי של HANDLE

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

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

arseny92

Well-known member
מנהל
מארק רוסינוביץ' כתב בזמנו סדרת פוסטים בבלוגו עם הסבר מפורט

על מבנה זיכרון, פרוצסים, handles, ואובייקטים נוספים
&nbsp
החלק עם ההנדלים בקישור הבה: https://blogs.technet.microsoft.com.../09/29/pushing-the-limits-of-windows-handles/
לצורך יתר הבנה בעניין רצוי קודם להתייחס אל הפוסטים הקודמים בסידרת פוסטים הזו, כפי שנאמר בהתחלה
&nbsp
למרוט שעברו שמונה שנים, הנאמר עדיין בתוקף
 
למעלה