אני לא חושב שפירקתי מיקרו-לייטים כלשהם, אך "העברת הודעות" נפוצה לפחות בשתי קטגוריות של תוכניות: Win32 GUI (שניהם גלם מבוסס Win32 ו- MFC) והפעלה של Objective-C.
בשני המקרים יש לך איזושהי שגרת שולח מרכזית (או שגרות) שמקבלת הודעות ומעבירה אותם ל נמענים כלשהם, שעשויים להיות בתוך או מחוץ התוכנית הנוכחית.
ניתן לרשום את הנמענים באופן דינמי ( RegisterClass
ב- Win32) או שניתן לציין אותם בצורה סטטית כלשהי (מטא נתונים מסוג Objective-C או טבלאות המטפל בהודעות MFC).
באשר לשולחים, נבחן את SendMessage
של Win32. יש בו ארגומנטים hWnd
ו- Msg
(ופרמטרים נוספים). הראשון מציין את הנמען. יתכן שתוכל לאתר מאיפה זה הגיע ואז פשוט לחפש את רישום הכיתה המתאים לחלון ולבדוק אם נוהל החלון שלו מטפל בהודעה הספציפית הזו. אני מניח שתוכל לסמן את השיחה בתגובה "עובר להליך חלון 0x35345800" או דומה בכדי לעקוב אחריו. עם MFC תצטרך למצוא את טבלת ההודעות של הכיתה ולחפש את המטפל המתאים.
עם Objective-C, objc_msgSend
מקבל את האובייקט המקבל ואת ה בורר להופיע. אם אתה יכול לעקוב אחר האובייקט, תוכל לבדוק אם יש לו הבורר בשם זה. לחלופין, בדוק את כל הסלקטורים עם שם זה בתוכנית. שוב, ברגע שמצאת אותה, הגיב הערה.
אז, גישה דומה ככל הנראה יכולה להיות מורחבת לכל שאר מערכות העברת ההודעות - מצא נמענים, ואז במקום השיחה המשגר בדוק אילו יכולים לעשות יכול להתמודד עם זה ולבדוק את המטפלים. לפעמים אתה אפילו לא צריך לעשות את החלק הראשון בפועל - אם מזהה / שם ההודעה הוא ייחודי מספיק, ייתכן שתוכל למצוא את המטפל רק על ידי חיפוש אותו.
בעיה קשורה במקצת היא עבודה עם C ++ ופונקציות וירטואליות, אך היא נכללה ב שאלה אחרת.
רק זכרתי עוד סוג של תוכניות שאינם משתמשים בערמת השיחות. אלה המשתמשים ב סגנון מעבר המשך, בדרך כלל כתוב בשפה פונקציונאלית כלשהי. גרג סינקלייר כתב מאמר נחמד ומשעשע מאוד על זוועות פירוק צ'יקן - יישום של תוכנית השפה. האתר שלו אינו פעיל אך למרבה המזל Archive.org שמר עותק. ציטוט אחד ממנו:
עבור מהנדס הפוך, המשך סגנון מעבר המשמעות היא סוף הציוויליזציה כפי שאנו מכירים אותה.