מה זה COM /‏ ActiveX /‏ OCX — הסבר מרוכז על ההבדלים והקשרים

· עודכן בתאריך: · · COM, ActiveX, OCX, OLE, פיתוח Windows, טכנולוגיה לגאסית

שלוש המילים COM /‏ ActiveX /‏ OCX בדרך כלל מגיעות כחבילה אחת בפרויקטים לגאסיים של Windows.

  • ספק שולח .ocx
  • על מסך של Access או VB6 יושב רכיב מסתורי
  • אומרים לכם ‘זה COM’, וברגע הבא ‘זה ActiveX’
  • אחר כך מגיעות בבת אחת מילים כמו regsvr32, 32bit /‏ 64bit, ומצב IE

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

המבנה שבו השיחה מפסיקה להתחברכשמונחים קרובים כמו COM, ActiveX ו-OCX מופיעים באותו שטח בבת אחת, השיחה מפסיקה להתחבר, אבל אם מפרידים מה הבסיס, מה הרכיב ומה הקובץ, החקירה, המעבר וההסבר נעשים קלים יותר.שלוש המילים מופיעות בבת אחתהשיחה לא מתחברתמפרידים לבסיס, רכיב וקובץחקירה, מעבר והסבר נעשים קלים

איור 1: למאמר הזה מטרה אחת. להפריד ‘מה הבסיס, מה הרכיב, ומה הקובץ’.

במאמר הזה נסדר את מה זה COM, מה זה ActiveX, מה זה OCX, לפי סדר שבו נראים ההבדלים והקשרים. בייחוד נבהיר מה הבסיס, מה הרכיב, ומה הקובץ.

תוכן העניינים

  1. תחילה המסקנה (בקצרה)
  2. COM /‏ ActiveX /‏ OCX במאמר הזה
  3. תחילה, סידור בעמוד אחד
    • 3.1. תרשים קשרים
    • 3.2. סידור מקוצר של המונחים
  4. מה זה COM
    • 4.1. בקצרה
    • 4.2. מה חשוב ב-COM
    • 4.3. פתק שורה למונח
  5. מה זה ActiveX
    • 5.1. בקצרה
    • 5.2. ActiveX אינה ייעודית לדפדפן
  6. מה זה OCX
    • 6.1. בקצרה
    • 6.2. מה ההבדל מ-.dll
  7. סידור ההבדלים בטבלה
  8. איפה זה היה בשימוש
  9. למה קל להתבלבל
  10. איך כדאי להתייחס לזה היום בפועל
  11. אי-הבנות נפוצות
  12. נקודות בדיקה כשחוקרים
  13. סיכום
  14. מקורות

מפת הידע של המאמר

‏COM הוא הבסיס שדרכו רכיבים ב-Windows מתקשרים באמצעות חוזה בינארי, ו-ActiveX הוא ההקשר של רכיב לשימוש חוזר שמבוסס על COM ו-OLE/‏Automation, ומשמש להטמעה בתוך host או container. ‏OCX הוא רק סיומת קובץ שנפוצה כמימוש של אותו בקר ActiveX, ולא המושג עצמו. ‏ActiveX נמצא בשימוש ממושך לא רק בדפדפן אלא גם בצד אפליקציות Windows, למשל VB6, ‏MFC ושימוש ב-wrapper COM מ-WinForms. ‏CLSID ו-ProgID, ספריית טיפוסים, ומודל ה-apartment של STA/‏MTA תומכים בזיהוי ובקריאה של COM, ורישום עם הרשאות מנהל דרך regsvr32, יחד עם התאמת ביטים בין 32bit ל-64bit, קובעים את פריסת ה-OCX. ‏ActiveX בצד הדפדפן ממשיך לפעול בהנחה של מצב IE כגשר לתאימות לאחור.

מפת הידע של COM, ‏ActiveX ו-OCXתרשים שמראה את היחס שבו COM הוא הבסיס, ‏OLE/‏Automation ו-ActiveX נערמים מעליו, ומגיעים ל-OCX כקובץ מימוש; את מנגנון הזיהוי והקריאה של COM — CLSID, ‏ProgID, ספריית טיפוסים ומודל ה-apartment; את אילוץ הרישום עם הרשאות מנהל ואת התאמת הביטים דרך regsvr32; ואת התלות של ActiveX בצד הדפדפן במצב IE.משתמש במממש אתמשתמש במשתמש במשתמש במשתמש במשתמש במשתמש במשתמש במאוטמט אתמחייבמוגדר באמצעותמחייבמחייבמשתמש במשתמש במשתמש בנבדק באמצעות‏COM (Component Object Model)ActiveXOCXOLE/AutomationCLSID(Class ID)ProgID(Programmatic Identifier)Visual Basic 6.0(VB6)ספריית טיפוסים (TLB)‏.NET (מ-Core ואילך)מודל ה-apartment של COM‏ (STA/MTA)regsvr32הרשאות מנהלדרישת התאמת bitnessמצב IEMFC(Microsoft Foundation Classes)Windows Formsdumpbin

בתרשים, קו מלא מציין קשר שמתקיים תמיד וקו מקווקו מציין קשר מותנה (תנאי ההתקיימות מפורטים בהסבר של כל קשר בעמוד המפורט). רשימת כל הקשרים (סך הכול 18, עם אסמכתה ורמת ודאות) והגדרות המושגים המרכזיים מרוכזות בעמוד המפורט של מפת הידע (ביפנית). נתונים: JSON-LD / Turtle

1. תחילה המסקנה (בקצרה)

קודם ניסוח גס אבל שימושי:

  • COM הוא הבסיס. חוזה בינארי שדרכו רכיבים ב-Windows מתקשרים זה עם זה
  • ActiveX הוא הקשר רכיב מבוסס COM. בייחוד נוטה להופיע כבקר שמוטמע בתוך host
  • OCX הוא קובץ מימוש נפוץ לבקר ActiveX. נתקלים בו כסיומת קובץ
  • כלומר, אם תופסים בערך כCOM = מנגנון, ActiveX = הקשר הרכיב, OCX = קובץ — התמונה מתבהרת
  • הזיכרון ActiveX = הדבר המסוכן הישן של הדפדפן נכון בחצי, ולא מספיק בחצי השני. ActiveX אינה ייעודית לדפדפן
  • מדברים על OCX = ActiveX כמעט כמילים נרדפות, אבל למעשה זה ערבוב בין מושג לסיומת קובץ
  • זו לא טכנולוגיה שמעמידים במרכז פיתוח חדש כיום, אבל באפליקציות Windows קיימות, ב-Office, ב-Access, ב-SDK של ציוד וב-Web פנים-ארגוני עדיין נתקלים בה

תחילה מתחילים מהפרדת השלושה האלה:

  1. האם זה סיפור על COM
  2. האם זה סיפור על בקר ActiveX
  3. האם פשוט רואים קובץ .ocx וקוראים לו כך

כשזה מתברר, הערפל מתפזר לא מעט.

שלוש השאלות להפרדה בהתחלהמתחילים מלהפריד האם הסיפור שמולנו הוא על מנגנון COM, על רכיב בקר ActiveX, או פשוט על ראיית קובץ ocx וקריאה לו כך.על מה מדברים כרגעCOM = סיפור על מנגנוןActiveX = סיפור על הקשר רכיבOCX = סיפור על קובץ

איור 2: כשמתבלבלים, חוזרים לשלוש האפשרויות האלה. COM הוא מנגנון, ActiveX הקשר רכיב, OCX קובץ.

2. COM /‏ ActiveX /‏ OCX במאמר הזה

בפועל, שלושת אלה משמשים לעיתים קרובות בערבוביה. לכן, קודם כול המאמר הזה מקבע את המשמעות.

  • COM: מודל הרכיבים של Windows עצמו. הבסיס לממשקים, GUID, רישום וקריאה
  • ActiveX: בקר שאפשר להטמיע, או ההקשר של שימוש בו, מבוסס על COM. בפועל בדרך כלל מתכוונים במיוחד לבקר ActiveX
  • OCX: סיומת קובץ נפוצה למימוש בקר ActiveX. .ocx

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

לכן גם המאמר הזה יתקדם בעיקרון לפי ActiveX = סיפור שמתקרב לבקר ActiveX.

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

איור 3: מודים ברוחב ההיסטורי של המילה, אבל מקבעים את המיקוד ב’כיוון הבקר’ שגורם לבלבול בפועל.

3. תחילה, סידור בעמוד אחד

3.1. תרשים קשרים

הכי מהיר לראות תחילה את התמונה השלמה בעמוד אחד. מי שנמצא בסביבה שבה התרשים לא מוצג — הרשימה מיד מתחת לתרשים מכילה את אותו תוכן, ומומלץ לקרוא אותה.

היחס בין COM,‏ OLE,‏ ActiveX ו-OCXתרשים המראה ש-COM הוא בסיס החוזה הבינארי, שמעליו OLE ו-Automation, שעליהם נשען הקשר הבקר של ActiveX, שהבקר מופץ בדרך כלל כקובץ OCX, ושה-host או ה-container הוא זה שמארח את הבקר.COM‏בסיס החוזה הבינאריOLE / ‏Automation‏מנגנון הטמעה ואוטומציהActiveX‏הקשר בקר מבוסס COMבקר ActiveXOCX (‎.ocx)‏צורה נפוצה כקובץ מימושHost / ‏Container‏IE / ‏Access / ‏VB6 / ‏MFC / ‏WinForms

איור 4: תרשים קשרים שבו COM הוא הבסיס, ומעליו נערמים OLE / ‏Automation, ‏ActiveX ו-OCX, וה-host נושא את הבקר.

מה שחשוב כאן — COM ו-ActiveX אינן אותה מילה.

  • COM הוא הבסיס
  • OLE / ‏Automation הוא מנגנון להטמעה ולאוטומציה
  • ActiveX מופיע כהקשר הבקר שמשמש מעליו
  • OCX הוא קובץ נפוץ למימוש הבקר הזה

לכן, אם שואלים האם ActiveX זה COM — התשובה היא הבסיס הוא COM, אבל ActiveX אינו COM עצמו.

3.2. סידור מקוצר של המונחים

מילה הבנה ראשונית
COM מנגנון, חוזה, בסיס
ActiveX הקשר רכיב מוטמע מבוסס COM
בקר ActiveX הרכיב עצמו שנטען בפועל אל ה-host
OCX סיומת קובץ נפוצה לבקר ActiveX
OLE / ‏Automation מנגנון להטמעה, אוטומציה ואינטגרציה

אם רוצים לזכור בקיצור המקסימלי, זה מספיק:

  • COM הוא מנגנון
  • ActiveX הוא הקשר הרכיב
  • OCX הוא קובץ

4. מה זה COM

4.1. בקצרה

‏COM הוא קיצור של Component Object Model, ומדובר בחוזה בינארי שדרכו רכיבים ב-Windows מתקשרים זה עם זה.

חוזה בינארי, כאן, אין הכוונה לצרכי קוד המקור או למפרט השפה, אלא לממשק שההבטחה נשמרת בו גם בצורה שאחרי הקומפילציה. אפשר להשתמש ברכיב שנבנה ב-C++ משפה אחרת או מאפליקציה אחרת — בזכות החוזה הזה.

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

לדוגמה, אלה הדברים האופייניים ל-COM (המשמעות של כל מילה מסוכמת בשורה אחת בסעיף 4.3).

  • ספירת הפניות (reference counting) באמצעות IUnknown
  • חיפוש ממשק באמצעות QueryInterface
  • זיהוי מבוסס GUID כמו IID או CLSID
  • שימוש in-process באמצעות DLL
  • שימוש out-of-process באמצעות EXE

בקיצור, COM הוא הבסיס לתרבות המרכיבים (component) של Windows.

הרעיון של חוזה בינאריCOM מחבר רכיבים דרך חוזה בינארי, הבטחה שנשמרת בצורה שאחרי הקומפילציה ולא לפי צרכי קוד המקור או מפרט השפה, ולכן אפשר להשתמש ברכיב שנבנה ב-C++ משפה אחרת או מאפליקציה אחרת.הרכיב〔המימוש מוסתר〕חוזה בינארי〔ההבטחה שנחשפת〕שפה אחרת / אפליקציה אחרתההבטחה נשמרת גם אחרי הקומפילציה

איור 5: הליבה של COM היא ‘להסתיר את המימוש ולחבר רק דרך החוזה’. לכן אפשר להשתמש ברכיב מעבר לשפה.

4.2. מה חשוב ב-COM

אם רוצים רק את הבסיס, אלה החשובים ב-COM:

  • מרכז הממשק
    • קובעים מה חושפים לפני המימוש
  • זיהוי באמצעות GUID
    • מזהים מחלקה או ממשק באופן ייחודי
  • הפרדה בין ה-host למימוש
    • הצד הקורא לא צריך לדעת את המימוש הפנימי
  • חוצה תהליכים
    • אפשר להשתמש לא רק באותו תהליך אלא גם כרכיב בתהליך אחר

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

ארבעת עמודי היסוד של COMתכנון ממוקד ממשק, זיהוי ייחודי באמצעות GUID, הפרדה בין ה-host למימוש, ויכולת לחצות תהליכים — ארבעה עמודים שהופכים את COM לתכנון שימוש חוזר מבוסס חוזה.הבסיס של COMמרכז הממשקזיהוי באמצעות GUIDהפרדה בין host למימושחוצה תהליכים

איור 6: ארבעת העמודים שתומכים ב-COM. כבר מתקופה מוקדמת היה בו תכנון שימוש חוזר מבוסס חוזה.

4.3. פתק שורה למונח

בסיפור על COM מגיעות בלי הסבר המילים הבאות. כאן, כשער כניסה למושגים, נעצור על שורה אחת לכל מילה. מי שרוצה להעמיק גם בעניין העיצוב, מוזמן לקרוא את מה זה COM — למה התכנון של COM ב-Windows עדיין יפה.

מונח משמעות בשורה אחת
ממשק (interface) רשימת הפונקציות שהרכיב מבטיח ‘אפשר לקרוא לאלה’. מופרד מהמימוש
IUnknown הממשק שהוא הבסיס לכל ממשקי ה-COM. יש בו רק שלוש מתודות: QueryInterface / ‏AddRef / ‏Release
QueryInterface מתודה ששואלת את הרכיב שביד ‘האם יש לך גם את הממשק הזה’. אם כן, מוחזר המצביע אליו
ספירת הפניות מונה שסופר את מספר הצרכנים. עולה ב-AddRef, יורד ב-Release, וכשמגיע ל-0 הרכיב משתחרר
GUID קיצור של Globally Unique Identifier — מזהה של 128 סיביות שנכתב בצורה {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}. משמש למניעת התנגשות שמות
CLSID קיצור של Class ID — GUID שמציין ‘איזה רכיב (מחלקה)’. גם הרישום ברג’יסטרי נמשך לפי הערך הזה
IID קיצור של Interface ID — GUID שמציין ‘איזה ממשק’
ProgID כינוי ידידותי לבני אדם שניתן ל-CLSID. מחרוזת כמו Excel.Application, שמשמשת בין השאר מסקריפטים כדי להצביע על רכיב
Type Library (ספריית טיפוסים) נתונים שמרכזים את מידע הטיפוסים של הממשקים והמתודות שהרכיב חושף. VB6 או ‏.NET קוראים אותם כשמפנים לרכיב
Apartment (‏STA / ‏MTA) מנהג הת’רדים של COM. STA פירושו ‘קוראים לרכיב הזה רק מת’רד אחד’, MTA פירושו ‘מותר לקרוא בו-זמנית ממספר ת’רדים’ — רכיבי UI נמצאים כמעט תמיד בצד STA

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

התנהגות הבסיס סביב IUnknownIUnknown, הבסיס של כל ממשקי COM, שואל ממשק אחר עם QueryInterface, מגדיל ומקטין ספירת הפניות עם AddRef ו-Release, ומשחרר את הרכיב כשהמונה מגיע ל-0.IUnknown〔הבסיס לכולם〕שואל עם QueryInterfaceאם קיים, מוחזר מצביעמנהל את המונה עם AddRef ו-Releaseכשמגיע ל-0, הרכיב משתחרר

איור 7: שלוש המתודות של IUnknown, שבמרכז טבלת המונחים, מתחלקות לשתי עבודות — ‘לשאול’ ו’לספור’.

5. מה זה ActiveX

5.1. בקצרה

הכי קל להבין את ActiveX כרכיב תוכנה לשימוש חוזר מבוסס COM, ובייחוד כבקר שמוטמע בתוך host או container.

בפועל, כשאומרים ActiveX, ברוב המקרים הכוונה לבקר ActiveX. לדוגמה, כפתורים, grid, גרפים, לוח שנה, viewer, ורכיבי אינטגרציה עם ציוד — אלה נופלים לקטגוריה הזו.

עדיף לא לתפוס את ActiveX כטכנולוגיה ענקית שעומדת בגאווה לבדה, אלא כרכיב שפועל כשהוא מוטמע בתוך host כלשהו — כך לא טועים בכיוון.

רכיב שפועל כשהוא מוטמע ב-hostבפועל, ברוב המקרים כשאומרים ActiveX הכוונה לבקר ActiveX, שמצביע על רכיב כמו כפתור, grid, גרף, viewer או רכיב אינטגרציה עם ציוד, שמוטמע בתוך host או container ופועל שם.Host / ‏Containerבקר ActiveXgrid או לוח שנהviewer או רכיב אינטגרציה עם ציודלא טכנולוגיה ענקית שעומדת לבדה

איור 8: הכי קל לתפוס את ActiveX כ’רכיב שפועל כשהוא מוטמע’ — כך לא טועים.

5.2. ActiveX אינה ייעודית לדפדפן

הרושם ActiveX = הדבר הזה של Internet Explorer חזק למדי. זה לא טעות, אבל זה לא הכול.

הנה כמה מקומות שבהם היה בשימוש בקר ActiveX:

  • טפסי Access
  • אפליקציות VB6 (‏Visual Basic 6.0)
  • container של MFC (‏Microsoft Foundation Class Library)
  • סביבת Office / ‏VBA
  • שימוש ב-wrapper COM מתוך WinForms
  • Internet Explorer, וההקשר של תפעול תואם אליו

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

אם לא מבינים את זה, נוטים לראות את ה-ActiveX שנמצא בWeb פנים-ארגוני ואת ה-ActiveX שמוטמע במסך Access כדברים נפרדים לגמרי. בפועל, שניהם קרובי משפחה קרובים למדי מבחינת COM.

המקומות שבהם בקר ActiveX היה בשימושטפסי Access, אפליקציות VB6, container של MFC, סביבת Office ו-VBA, שימוש ב-wrapper COM מתוך WinForms, ו-Internet Explorer — ActiveX אינה ייעודית לדפדפן ונמצאה בשימוש ממושך גם בצד אפליקציות Windows.בקר ActiveXAccess, ‏VB6 או ‏MFCסביבת Office ו-VBA‏wrapper COM מתוך WinFormsמשפחת Internet Explorerרק כאן זה נודע

איור 9: בלט רק ב-IE. רוב המקומות שבהם היה בשימוש נמצאים בצד אפליקציות Windows.

6. מה זה OCX

6.1. בקצרה

‏OCX היא סיומת קובץ נפוצה למימוש בקר ActiveX. אם מוצאים .ocx בשטח של Windows, אפשר בבטחה לחשוד קודם כול ברכיב COM ממשפחת הבקרים המוטמעים.

המקומות שבהם הוא מופיע הם בערך אלה:

  • תפוצה של SDK ספק
  • פרויקטים ישנים של VB6 / ‏Access / ‏MFC
  • קובץ שמיועד לרישום בתוך תוכנת התקנה
  • רכיב שדורש regsvr32

חשוב לזכור ש-OCX הוא צורת קובץ, לא המושג עצמו. לכן, אם רוצים לענות בגסות על מה זה OCX — זה קובץ שנתקלים בו לרוב כמימוש בפועל של בקר ActiveX.

6.2. מה ההבדל מ-.dll

גם כאן קל להתבלבל.

  • .ocx מרמז חזק למדי על היותו בקר ActiveX
  • .dll יכול להיות ספרייה רגילה, שרת COM, או DLL תלוי שקשור ל-ActiveX

כשרואים .ocx אפשר לחשוד כמעט בוודאות שמדובר בהקשר של ActiveX, אבל כשרואים רק .dll עדיין לא ברור מה הוא.

בפועל נפוץ:

  • vendorcontrol.ocx
  • vendorhelper.dll
  • vendorcore.dll

שורה לצד שורה — דפוס שבו הכוכב הוא ה-OCX, ו-DLL תומך מהצד.

לכן, אם שואלים האם OCX הוא סוג של DLL — התחושה קרובה, אבל בשלב חקירה או מעבר, בטוח יותר להפריד בין התפקידים.

ההבדל במידע שאפשר לקרוא מהסיומתocx מרמז חזק על היותו בקר ActiveX, אבל dll עדיין לא ברור אם הוא ספרייה רגילה, שרת COM או DLL תלוי. בפועל נפוץ דפוס שבו OCX הוא הכוכב ו-DLL תומך מהצד.‏.ocx‏.dllמה הסיומתאפשר לחשוד כמעט בקר ActiveXעדיין לא ברור מה הואספרייה, שרת COM או תלויהכוכב OCX ו-DLL תומך מהצד

איור 10: מ-.ocx אפשר לחשוד, אבל .dll צריך לבדוק תפקיד לפני שיודעים מה הוא.

7. סידור ההבדלים בטבלה

מילה מה הוא מילים שנפגשים בהן בפועל מה בדרך כלל המימוש בפועל
COM מודל רכיבים, הבסיס לחוזה בינארי IUnknown, QueryInterface, CLSID, IID, ‏Apartment .dll, .exe, מידע רישום
ActiveX הקשר בקר מבוסס COM container, הטמעה, property, event בקר ActiveX
בקר ActiveX הרכיב לשימוש חוזר שנטען בפועל grid, לוח שנה, viewer, אינטגרציה עם ציוד .ocx, .dll
OCX סיומת קובץ נפוצה לבקר ActiveX regsvr32, ‏toolbox, 32bit / ‏64bit xxx.ocx
OLE / ‏Automation מנגנון הטמעה ואוטומציה אינטגרציה עם Office, דפי property, אוטומציה פונקציות שונות מבוססות COM

אם רוצים לזכור לפי הטבלה, קודם כול:

  • COM הוא עבודות היסוד
  • ActiveX היא תרבות הרכיבים שנשענת מעליו
  • OCX הוא קובץ שמלקטים בשטח

8. איפה זה היה בשימוש

הזיכרון מהדפדפן חזק כל כך, ש-ActiveX / ‏OCX נוטים להיראות כטכנולוגיית Web ישנה. אבל בפועל היה בהם שימוש רחב הרבה יותר.

באופן קונקרטי, אלה המקומות:

  • אפליקציות שולחן עבודה
    • VB6
    • MFC / ‏C++
    • טפסי Access
    • סביבת Office / ‏VBA
  • דפדפן / Web פנים-ארגוני
    • viewer שמוטמע ב-Internet Explorer
    • רכיב חתימה
    • רכיב העברת קבצים
    • רכיב אינטגרציה עם ציוד היקפי
  • אפליקציות ‏.NET קיימות
    • בקר ActiveX קיים שנעטף ומשמש מתוך WinForms
    • מקרים שבהם מאריכים חיים של נכס COM קיים כרכיב UI

גם כאן, בסופו של דבר חוזרים לסיפור ש-ActiveX אינה ייעודית לאינטרנט. מה שנראה כטכנולוגיית Web הוא רק בגלל שהוא בלט מאוד ב-IE — עדיף לראות בו בפועל טכנולוגיית רכיבים מוטמעים של Windows.

הפער בין המראה למציאותמכיוון שבלט מאוד ב-IE, ActiveX נוטה להיראות כטכנולוגיית Web ישנה, אבל בפועל היה בשימוש רחב באפליקציות שולחן עבודה, ב-Web פנים-ארגוני ובאפליקציות .NET קיימות, והמציאות היא טכנולוגיית רכיבים מוטמעים של Windows.הזיכרון מבליטה ב-IEנראה כטכנולוגיית Web ישנההמקומות שבהם היה בשימוש בפועלאפליקציות שולחן עבודהדפדפן ו-Web פנים-ארגוניאפליקציות .NET קיימותהמציאות היא טכנולוגיית רכיבים מוטמעים של Windows

איור 11: הפער בין המראה של ‘טכנולוגיית Web ישנה’ למציאות של ‘טכנולוגיית רכיבים מוטמעים של Windows’.

9. למה קל להתבלבל

9.1. השכבות של המילים שונות, אבל מגיעות לאותה שיחה

  • COM הוא סיפור על הבסיס
  • ActiveX הוא סיפור על הקשר הרכיב
  • OCX הוא סיפור על הקובץ

מלכתחילה השכבות שונות, אבל בפועל הן מגיעות באותו זמן לאותו שטח, ולכן השיחה נוטה להתבלבל.

9.2. המילה ActiveX קצת רחבה

COM יחסית קבוע במשמעותו. לעומת זאת, ActiveX משמש מעט יותר רחב, גם היסטורית וגם בפועל.

תלוי באדם, הכוונה יכולה להיות ל:

  • הבקר עצמו
  • קובץ .ocx
  • רכיב ישן שפועל ב-IE
  • כל רכיב מוטמע מבוסס COM

וזה נוטה להשתבש. בשלב הזה, השיחה כבר לא מתחברת.

9.3. הרצון לקרוא לכול ‘ActiveX’ ברגע שרואים .ocx

מבינים את הרגש הזה. בדרך כלל זה גם מספיק כדי להסתדר.

עם זאת, בשלב מעבר או חקירה, אם לא מפרידים בין:

  • האם זה רכיב UI
  • באיזה host זה פועל
  • האם צריך רישום
  • מה מצב ה-32bit / ‏64bit
  • האם יש תלות בדפדפן

בהמשך נופלים על זה כמו שצריך.

שלוש הסיבות לבלבולמגיעים לשיחה אחת נושאים שהשכבה שלהם שונה, המילה ActiveX רחבה במקצת, ורואים ocx וקוראים לכול כך — שלוש הסיבות שיוצרות את הבלבול.נושאים משכבות שונות מגיעים לאותה שיחההשיחה מתבלבלתהמילה ActiveX רחבהרואים ocx וקוראים לכול כךבשלב מעבר או חקירה נופלים על זה

איור 12: מהות הבלבול היא שנושאים משכבות שונות — בסיס, רכיב וקובץ — מופיעים בו-זמנית באותו שטח.

10. איך כדאי להתייחס לזה היום בפועל

קודם כול, מציאת COM / ‏ActiveX / ‏OCX לא אומרת שצריך מיד לפסול הכול. עם זאת, לטפל בכולם באותה טמפרטורה זה גם מסוכן.

תלות ב-ActiveX בצד הדפדפן

כאן בטוח יותר להסתכל קודם ובחומרה יחסית.

  • זה לא הזרם המרכזי בפיתוח דפדפנים בעולם של היום
  • בהקשר של תפעול תואם, מדברים על מצב IE, אבל עדיף לראות בזה גשר לתאימות לאחור
  • לא מומלץ לאמץ את זה כטכנולוגיית יסוד לחדש

לצורך ההחלטה נדרש גם ציר זמן. אפליקציית שולחן העבודה IE11 כבר יצאה משימוש, ומה שנשאר עומד היום הוא מצב ה-IE של Microsoft Edge. לגבי מצב ה-IE הזה, Microsoft הודיעה על מדיניות של תמיכה לפחות עד 2029, ואם יוחלט על הפסקה — הודעה מוקדמת של שנה מראש. כלומר, 2029 היא לא “עד אז אפשר להזניח”, אלא מועד שצריך לחשב אחורה כדי לסיים את ההתנתקות עד אליו. את שלבי ההתנתקות עצמם ריכזנו בנפרד ב-מדריך היציאה ממערכות Web פנימיות תלויות מצב IE.

את ה-ActiveX בצד ה-Web נכון יותר לחשוב עליו במונחי ‘מאיפה מתחילים להתנתק’ ולא ‘איך מאריכים חיים’.

ציר הזמן של ActiveX בצד הדפדפןאפליקציית שולחן העבודה IE11 יצאה משימוש, ומה שנותר הוא מצב ה-IE של Edge, ש-Microsoft מתחייבת לתמוך בו לפחות עד 2029 ולהודיע שנה מראש על הפסקה. 2029 אינו מועד שמותר להזניח עד אליו, אלא מועד שיש לחשב אחורה ממנו כדי לסיים את ההתנתקות.אפליקציית שולחן העבודה IE11 יצאה משימושמה שנותר הוא מצב ה-IE של Edgeתמיכה לפחות עד 2029מחשבים אחורה כדי לסיים התנתקות עד אזמדיניות של הודעה שנה מראש על הפסקה

איור 13: 2029 אינה ארכה אלא מועד סופי. בצד הדפדפן חושבים במונחי ‘מאיפה מתחילים להתנתק’.

תלות ב-ActiveX / ‏OCX בצד שולחן העבודה

כאן אפשר להחליט בצורה מציאותית יותר.

  • פועל ביציבות בתוך host קיים
  • יעד ההפצה מוגבל
  • יש אופק לתחזוקת ספק או תחזוקה עצמית
  • ההנחות לגבי הרישום, DLL תלוי ו-bitness ידועות

אם התנאים האלה מתקיימים, החלטה להשאיר היא החלטה רגילה לגמרי.

מצד שני, אם:

  • רוצים לטעון OCX של 32bit ישירות לצד 64bit
  • רוצים להעביר ל-‏.NET רק את הסביבה
  • ההפצה והרישום נכשלים כל פעם מחדש
  • עדיין קיימת תלות בדפדפן

אז בטוח יותר לחשוב בנפרד על להשאיר / לעטוף / להחליף.

מה שנשאל בפועל היום הוא לא האם ActiveX רע אלא איפה יוצרים את הגבול. עדיף לראות בזה לא טכנולוגיה ישנה, אלא משטח החיבור של המערכת הקיימת — כך קל יותר לטפל בזה.

איך מתפצלת ההחלטה בצד שולחן העבודהאם פעולה יציבה, הפצה מוגבלת, אופק תחזוקה והנחות ידועות מתקיימים, החלטה להשאיר היא רגילה; אם יש התנגשות bitness, רצון להעביר סביבה ל-.NET, תקלות הפצה או תלות בדפדפן, מפרידים בין להשאיר, לעטוף או להחליף.פעולה יציבה והנחות ידועותיש נקודות תקיעההאם התנאים מתקיימיםהחלטה להשאיר היא רגילהמפרידים בין להשאיר, לעטוף או להחליףאיפה יוצרים גבול כמשטח חיבור

איור 14: בצד שולחן העבודה מפצלים לפי טמפרטורה. מה שנשאל הוא לא טוב או רע, אלא מיקום הגבול.

11. אי-הבנות נפוצות

אי-הבנה 1: COM = ActiveX

לא נכון. COM הוא הבסיס, ו-ActiveX הוא הקשר הבקר שמשמש מעליו.

אי-הבנה 2: ActiveX = Internet Explorer

לא נכון. נכון שהוא נודע בזכות ה-IE, אבל ActiveX אינה ייעודית לדפדפן.

אי-הבנה 3: ActiveX = OCX

בפועל משתמשים בהם במשמעות קרובה למדי, אבל למעשה זה לא זהה. ActiveX הוא סיפור על הקשר ורכיב, ואילו OCX הוא הישות שנתקלים בה כסיומת קובץ.

אי-הבנה 4: OCX זה סתם DLL, לא?

בניסוח גס זה קרוב, אבל בחקירה עדיף לא להיות גסים. עם .dll בלבד לא ניתן לקרוא את התפקיד, אבל .ocx נותן ריח חזק למדי של בקר.

אי-הבנה 5: COM כבר טכנולוגיה מתה

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

איך מתקנים את אי-ההבנות הנפוצותCOM אינו ActiveX עצמו אלא הבסיס, ActiveX אינה ייעודית ל-IE, יש הבדל בין ActiveX ל-OCX כמושג לעומת קובץ, ו-COM אינו טכנולוגיה מתה — סיכום דרך התיקון של אי-ההבנות הנפוצות.‏COM = ActiveX ?‏COM הוא הבסיס, ישות נפרדת‏ActiveX = ייעודי ל-IE ?פעיל גם בשולחן העבודה‏ActiveX = OCX ?הבדל בין מושג לקובץ‏COM מת ?עדיין מופיע באינטראופרביליות

איור 15: כל חמש אי-ההבנות נולדות מערבוב בין שכבות שונות.

12. נקודות בדיקה כשחוקרים

כשמוצאים COM / ‏ActiveX / ‏OCX, בדיקה לפי הסדר הזה מקטינה את הסיכוי להסתבך.

  1. מה הרכיב הזה בכלל
    • בקר UI
    • viewer
    • אינטגרציה עם ציוד
    • אינטגרציה עם Office / ‏Access
  2. איפה זה פועל
    • Access / ‏VBA
    • VB6 / ‏MFC
    • WinForms
    • IE / ‏מצב IE
  3. מה הקובץ והמזהה
    • .ocx / ‏.dll / ‏.exe
    • ProgID
    • CLSID
    • Type Library
  4. מה מצב הרישום וההפצה
    • האם דרוש regsvr32
    • האם יש DLL תלוי
    • האם דרושות הרשאות מנהל
  5. האם ה-bitness תואם
    • 32bit
    • 64bit
    • האם חייב לפעול באותו תהליך
  6. איך יטפלו בזה בעתיד
    • להשאיר כמו שהוא
    • ליצור גבול ולעטוף
    • להחליף

12.1. במה בודקים

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

מה רוצים לבדוק הכלי / המקום שבו מסתכלים
האם ה-.dll / ‏.ocx הוא שרת COM שיודע לרשום את עצמו עם dumpbin /exports שם_קובץ שמגיע עם Visual Studio — אם DllRegisterServer מיוצא, מדובר בשרת COM עם רישום עצמי. ‏regsvr32 קורא לפונקציה הזו
דרך הרישום וההסרה רישום עם regsvr32 שם_קובץ, הסרה עם regsvr32 /u שם_קובץ. דרושות הרשאות מנהל. ב-Windows 64bit, ‏%SystemRoot%\System32\regsvr32.exe מיועד ל-64bit, ו-%SystemRoot%\SysWOW64\regsvr32.exe ל-32bit — בוחרים לפי ה-bitness של הרכיב
משיכת קובץ ממשי מ-CLSID הערך המוגדר כברירת מחדל תחת HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32 ברג’יסטרי הוא הנתיב לשרת in-process (‏DLL / ‏OCX). עבור רכיב out-of-process מסתכלים על LocalServer32
משיכת CLSID מ-ProgID הערך המוגדר כברירת מחדל תחת HKEY_CLASSES_ROOT\שם_ProgID\CLSID הוא ה-CLSID. ואפשר גם ההפך — מ-CLSID לראות את תת-המפתח ProgID
יעד הרישום לרכיב 32bit ב-Windows 64bit, רישום עבור 32bit נכנס תחת HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID. חשוב לא להסתכל רק בצד ה-64bit ולהחליט ‘לא רשום’
הצגת רשימת הממשקים שנחשפים אם קיים OLE/‏COM Object Viewer (‏oleview.exe) שכלול ב-Windows SDK, אפשר לראות רשימה של מחלקות רשומות ו-Type Library. לא תמיד מגיע עם כל גרסת SDK — אם אין, מעקבים דרך הרג’יסטרי ודרך הגדרות ההפניה בסביבת הפיתוח
ה-bitness בצד ה-host בלשונית “פרטים” של Task Manager, לחיצה ימנית על כותרת העמודות והוספת עמודת “פלטפורמה” מראה לכל תהליך אם הוא 32 סיביות או 64. ‏OCX של 32bit לא ניתן לטעון ישירות לתהליך 64bit
כשל ברישום או בפתרון DLL תלוי מעקב אחרי גישות לרג’יסטרי ולקבצים עם Process Monitor מראה איזה מפתח או איזה DLL חיפשו ולא נמצא. את אופן השימוש ריכזנו ב-מדריך מעשי ל-Process Monitor (‏ProcMon)

אם רצים על יש ActiveX אז מממשים הכול מחדש בלי לעבור על הנקודות האלה, דורכים בדיוק על המוקשים הישנים. בטוח יותר קודם למלא את ההתאמה בין ששת הסעיפים למעלה לכלים, ורק אז להחליט בפרק 10 בין “להשאיר / לעטוף / להחליף”.

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

איור 16: לא רצים ישר למימוש חדש. ממלאים בסדר הזה, ורק אז קובעים כיוון — כך בטוח יותר.

13. סיכום

אם רוצים לומר את ההבדל בין COM / ‏ActiveX / ‏OCX בצורה הכי גסה, אבל שימושית בפועל, זה כך:

  • COM הוא הבסיס
  • ActiveX הוא ההקשר של רכיב מוטמע מבוסס COM
  • OCX הוא קובץ נפוץ לבקר ActiveX

כשלומדים להפריד בין השלושה האלה, נעשה הרבה יותר ברור:

  • האם זה סתם .ocx
  • האם זו בעיה של כלל COM
  • האם זה ActiveX תלוי דפדפן
  • האם זה רכיב שאפשר להשאיר בשולחן העבודה

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

14. מקורות

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

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

מה זה קובץ OCX?
‏OCX הוא סיומת קובץ שנפוצה למימוש של בקרי ActiveX. אם מוצאים .ocx בשטח של Windows, אפשר בבטחה לחשוד קודם כול ברכיב COM ממשפחת הבקרים המוטמעים. הוא מופיע לרוב כתפוצה של SDK ספק, בפרויקטים ישנים של VB6 / ‏Access / ‏MFC, כקובץ שמיועד לרישום בתוך תוכנת התקנה, או כרכיב שדורש regsvr32. שווה לזכור ש-OCX הוא צורת קובץ ולא המושג עצמו — זה מקטין את הבלבול.
מה ההבדל בין COM ל-ActiveX?
‏COM הוא החוזה הבינארי שדרכו רכיבים ב-Windows מתקשרים זה עם זה — כלומר הבסיס. ActiveX הוא רכיב תוכנה לשימוש חוזר שמבוסס על COM, ולרוב מתייחסים בו בהקשר של בקר שמוטמע בתוך host או container. אם תופסים את זה כ'COM = מנגנון, ActiveX = הקשר הרכיב, OCX = קובץ' — התמונה מתבהרת. הבסיס של ActiveX הוא COM, אבל ActiveX אינו COM עצמו.
האם ActiveX היא טכנולוגיה ייעודית ל-Internet Explorer?
לא. נכון שהוא נודע בזכות ה-IE, אבל בקרי ActiveX נמצאו בשימוש ממושך גם בצד אפליקציות Windows — בטפסי Access, באפליקציות VB6, ב-container של MFC, בסביבת Office /‏ VBA, ובשימוש ב-wrapper COM מתוך WinForms. עדיף לראות בזה טכנולוגיית רכיבים מוטמעים של Windows ולא טכנולוגיה ייעודית לדפדפן. עם זאת, את התלות ב-ActiveX בצד הדפדפן, בעולם של היום נכון יותר לחשוב עליה במונחי 'מאיפה מתחילים להתנתק' ולא 'איך מאריכים את החיים'.
מה ההבדל בין OCX ל-DLL?
‏.ocx היא סיומת שמרמזת חזק למדי על היותו בקר ActiveX, אבל .dll יכולה להיות ספרייה רגילה, שרת COM, או DLL תלוי שקשור ל-ActiveX. בפועל נפוץ דפוס שבו vendorcontrol.ocx הוא הכוכב, ו-DLL כמו vendorhelper.dll תומך מהצד. אם שואלים 'האם OCX הוא סוג של DLL' — התחושה קרובה, אבל בשלב חקירה או מעבר, בטוח יותר להפריד בין התפקידים.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג