מה זה אובייקטי COM¶
אם חפרתם פעם קצת לתוך אוטומציה בווינדוס, כמו סקריפט פאוורשל שפותח קובץ אקסל ומשנה בו תאים, בטוח נתקלתם בקוד שיוצר "אובייקט" מוזר בלי הסבר ברור מה בדיוק קורה מאחורי הקלעים. הרבה פעמים, מה שקורה שם הוא COM בפעולה.
מה זה COM¶
COM הוא קיצור של Component Object Model, טכנולוגיה שמיקרוסופט פיתחה עוד בתחילת שנות התשעים כדי לפתור בעיה מאוד ספציפית - איך תוכנות שונות, שנכתבו בשפות שונות ולפעמים על ידי חברות שונות, יכולות לדבר אחת עם השנייה ולהשתמש בפונקציונליות אחת של השנייה.
הרעיון המרכזי הוא "רכיב" - component. כל רכיב COM חושף ממשק מוגדר וברור, שמתאר בדיוק אילו פעולות אפשר לבצע עליו, בלי חשיפה של איך הוא בנוי מבפנים. תוכנה שרוצה להשתמש ברכיב לא צריכה לדעת אם הוא נכתב ב-C++, ב-Delphi, או בכל שפה אחרת. היא רק צריכה לדעת את הממשק.
דוגמה שכולם מכירים בלי לדעת¶
כשאתם פותחים סקריפט פאוורשל שיוצר קובץ אקסל אוטומטית, בלי שיש לכם אקסל פתוח על המסך, הסקריפט בעצם יוצר אובייקט COM שמייצג את תוכנת אקסל. דרך האובייקט הזה אפשר לפקוד על אקסל להוסיף גיליון, לכתוב תאים, לשמור קובץ, וכל זה בלי אינטראקציה ידנית בכלל. זה בדיוק הכוח של COM - הוא נותן גישה תכנותית לפונקציונליות שלמה של תוכנה אחרת.
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
איפה עוד COM מסתתר¶
COM הוא לא רק לאוטומציה של אופיס. הוא מהווה תשתית לחלק גדול ממה שקורה בווינדוס מתחת לפני השטח:
- ActiveX - טכנולוגיה מבוססת COM שאיפשרה בעבר להטמיע רכיבים אינטראקטיביים בדפי אינטרנט, בעיקר באינטרנט אקספלורר הישן.
- WMI - Windows Management Instrumentation, ממשק הניהול המרכזי של ווינדוס, בנוי כולו על תשתית COM.
- Shell Extensions - כשלוחצים קליק ימני על קובץ וממשק ה-shell של ווינדוס מציע פעולות מותאמות, כמו "חלץ כאן" לקובץ zip, זה קורה דרך רכיבי COM שהתקינו תוכנות שונות.
למה זה שרד כל כך הרבה שנים¶
COM נבנה בצורה שאיננה תלויה בשפת תכנות ספציפית, מה שהופך אותו לגמיש מאוד - קוד ב-C++, ב-.NET, ובפאוורשל, יכולים כולם להשתמש באותם רכיבי COM בלי בעיה. בנוסף, ווינדוס עצמו סומך על COM בצורה כה עמוקה, שהחלפתו הייתה דורשת שינוי מבני ענק במערכת ההפעלה. במקום זאת, מיקרוסופט המשיכה לבנות מעליו טכנולוגיות חדשות יותר, כמו WinRT, שמנצל חלקים מהתשתית של COM גם היום.
מה זה אומר לכם בפועל¶
אם אתם כותבים אוטומציה בפאוורשל, סקריפטים שמדברים עם תוכנות אופיס, או אפילו רק מנסים להבין למה תפריט קליק ימני שונה כל כך בין מחשב למחשב, אתם למעשה נתקלים בהשפעה של COM. הבנה בסיסית של איך זה עובד עוזרת לפענח שגיאות מסתוריות באוטומציה, ולהבין למה לפעמים תוכנה שנסגרה "עדיין רצה" ברקע - כי אובייקט COM לא שוחרר כמו שצריך.
מי שרוצה להבין את ווינדוס לעומק, כולל התשתיות שעליהן בנויה כמעט כל אינטראקציה במערכת, מוזמן להתחיל מהיסודות בקורס שלנו: קורס ווינדוס בסיסי.
נתקלתם בשגיאת COM מוזרה בסקריפט שלכם? ספרו לנו בדיסקורד ונעזור לכם לפענח אותה.