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

סיכום

מאמר זה עונה על שאלות נפוצות בנוגע לאוטומציה ל- Microsoft Office מ- Visual C++.

מידע נוסף

תוכן עניינים

  1. מהי אוטומציה?

  2. אני משתמש חדש באוטומציה, היכן אוכל למצוא משאבים טובים כדי לקבל מידע נוסף?

  3. האם קיימות דרכים שונות שבהן ניתן להשתמש באוטומציה?

  4. מהו COM?
     

  5. כיצד ניתן לבצע לצרף למופע הפועל של יישום Office?

  6. כיצד ניתן לבצע לעבור פרמטרים אופציונליים?

  7. כיצד ניתן לבצע לך אירועים שנחשפו על-ידי יישומי Office?
     

  8. קוד האוטומציה שלי איטי מדי. כיצד אוכל להאיץ את הדברים?

  9. מה המשמעות של ערכי שגיאה עצומים אלה, כגון -2147352573 או 0x80030002, כלומר?

  10. מהי ספריית סוגים?

  11. קוד האוטומציה שלי פעל עם Microsoft Excel 95, אך נכשל ב- Microsoft Excel 97. למה?

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

  13. אני יודע מה אני רוצה לעשות כמשתמש ביישום Microsoft Office, אך כיצד ניתן לעשות זאת באופן תיכנותי באמצעות אוטומציה?

  14. האם ניתן להפוך יישום מוטבע של Microsoft Office לאוטומטי?

  15. כיצד ניתן לבצע לגשת למסמכי המסמך שלי במסמך של Microsoft Office?

שאלות ותשובות

  1. מהי אוטומציה?

    אוטומציה (לשעבר OLE Automation) היא טכנולוגיה המאפשרת לך לנצל את הפונקציונליות של תוכנית קיימת ולשלב אותה ביישומים שלך. לדוגמה, באפשרותך להשתמש ביכולות בדיקת האיות והדקדוק של Microsoft Word ביישום שלך מבלי ש- Microsoft Word יהיה גלוי למשתמשים שלך. באפשרותך גם להשתמש בכל כלי התרשימים, ההדפסה וניתוח הנתונים של Microsoft Excel. טכנולוגיה זו יכולה לפשט ולהאיץ את הפיתוח שלך ביעילות.
     

  2. אני משתמש חדש באוטומציה, היכן אוכל למצוא משאבים טובים כדי לקבל מידע נוסף? פרק 24 של "Inside Visual C++" של דיוויד קרוגלסקי (ISBN:1-57231-565-2) מספק סקירה כללית וכן כמה דוגמאות נהדרות. כמו כן, מאגר הידע של Microsoft הוא מקור מידע טוב.
    אם אתה מעדיף ללמוד לפי דוגמה, עיין במאמר הבא ב- Microsoft Knowledge Base:
     

    179706 HOWTO Use MFC to Automate Excel & Create/Format a New Workbook

  3. האם קיימות דרכים שונות שבהן ניתן להשתמש באוטומציה?

    קיימות שלוש דרכים בסיסיות לשימוש באוטומציה: MFC, #import ו- C/C++:
     

    • באמצעות MFC, השתמש ב- ClassWizard של Visual C++ כדי ליצור "מחלקות גלישה" מספריות הסוג של Microsoft Office. כיתות אלה, כמו גם כיתות MFC אחרות, כגון COleVariant, COleSafeArray, COleException, מפשטות את המשימות של אוטומציה. בדרך כלל מומלץ להשתמש בשיטה זו על פני האפליקציות האחרות, ורוב הדוגמאות של Microsoft Knowledge Base משתמשות ב- MFC.

    • #import, ישירה חדשה שהפכה לזמינה ב- Visual C++ 5.0, יוצרת "סמן חכם" של VC++ מספריית סוגים שצוינה. הוא רב-עוצמה, אך לעתים קרובות הוא אינו מומלץ עקב חומר עזר - ספירת בעיות המתרחשות בדרך כלל בעת שימוש ביישומי Microsoft Office.

    • C/C++ Automation is much more difficult, but sometimes necessary to avoid over over with MFC, or problems with #import. בעיקרון, אתה עובד עם ממשקי API כגון CoCreateInstance() וממשקי COM כגון IDispatch ו- IUnknown.

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

  4. מהו COM?

    אוטומציה מבוססת על Component Object Model (COM). COM היא ארכיטקטורת תוכנה סטנדרטית המבוססת על ממשקים, והיא מיועדת להפריד קוד לאובייקטים הכלולים ביניהם. חשוב על כך כהרחבה של פרדיגמה של תיכנות מונחה אובייקטים (OOP), אך ישים ליישומים נפרדים. כל אובייקט חושף ערכה של ממשקים, וכל התקשורת עם אובייקט, כגון אתחול, הודעות והעברת נתונים, מתבצעת דרך ממשקים אלה.

    COM הוא גם ערכת שירותים שסופקו על-ידי ספריות קישור דינאמי (DLL) המותקנות עם מערכת ההפעלה. אוטומציה משתמשת בחלק רב מהשירותים הללו. דוגמה אחת היא השירות "Marshalling", שמארשל את קריאות יישום הלקוח לפונקציות החבר של ממשקי יישום השרת ומעביר את הקריאות, באמצעות הארגומנטים שלו, ליישום השרת. נראה כי ממשקי השרת חשופים בשטח הזיכרון של הלקוח, וזה לא המקרה כאשר הלקוח הוא .exe פועל בשטח תהליך משלו. Marshalling גם מקבל את ערכי ההחזרה משיטות השרת בחזרה מעבר לגבולות התהליך ובבטחה אל ידיו של הלקוח. קיימים שירותים רבים אחרים החיוניים לאוטומציה המסופקים על-ידי ספריות COM השונות. מקורות המידע אודות אלה כוללים את "Inside Ole - Second Edition" מאת קרייג ברוקשמידט, ISBN 1-55615-843-2, "Inside COM" מאת דייל רוג'רסון - ISBN 1-57231-349-8 ו- "Automation Programmer's Reference", ISBN 1-57231-584-9.

  5. כיצד ניתן לבצע לצרף למופע הפועל של יישום Office?

    השתמש ב- API GetActiveObject(). שרתי אוטומציה רושמת את עצמם ב- ROT (טבלת אובייקטים פועלת), באמצעות ה- API RegisterActiveObject(). לקוחות אוטומציה יכולים לקבל במופע הפועל קוד כגון:

     

          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    

    הערה: אם פועלים מופעים מרובים של יישום Office שברצונך לצרף, תוכל לצרף למופע הראשון שהופעל באמצעות ה- API GetActiveObject().

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

  6. כיצד ניתן לבצע לעבור פרמטרים אופציונליים?

    לשיטות מסוימות יש פרמטרים "אופציונליים". ב- Visual Basic, באפשרותך להשמיט אותם באופן לא רשמי בעת קריאה לשיטה. עם זאת, בעת התקשרות באמצעות Visual C++ עליך להעביר VARIANT מיוחד ששדות .vt שלו VT_ERROR, ושדה .scode DISP_E_PARAMNOTFOUND. כלומר:
     

          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    

    זה באמת מה ש- Visual Basic עושה מאחורי הקלעים.

  7. כיצד ניתן לבצע לתפוס אירועים שנחשפו על-ידי יישומי Office?

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

    באופן כללי, כדי להגדיר את החיבור המינורית, תקבל את IConnectionPointContainer של השרת ותתקשר ל- FindConnectionPoint() עם ה- IID של ממשק האירוע. פעולה זו מעניקה לך ממשק IConnectionPoint וכל מה שנותר הוא לקרוא ל- Advise() עם מופע של ממשק האירוע שלך. לאחר מכן, השרת יתקשר חזרה דרך ממשק זה כאשר אירועים אלה יתרחשו.

  8. קוד האוטומציה שלי איטי מדי. כיצד אוכל להאיץ את הדברים?

    סיבה נפוצה לבעיות מהירות באוטומציה היא קריאה וכתיבה חוזרות וחזרה של נתונים. הדבר אופייני ללקוחות אוטומציה של Excel. עם זאת, רוב האנשים אינם מודעים לכך שניתן לכתוב או לקרוא נתונים אלה בו-זמנית באמצעות SAFEARRAY. עיין במאמר הבא של Microsoft Knowledge Base לקבלת מידע נוסף ודוגמאות אינפורמטיביות:

    179706 HOWTO: שימוש ב- MFC כדי להפוך את Excel לאוטומטי וליצור/לעצב חוברת עבודה חדשה
    כמו כן, חשוב לציין שהשימוש בלוח יכול לעתים לשפר את הביצועים. לדוגמה, באפשרותך להעתיק את הנתונים ללוח ולאחר מכן להשתמש באוטומציה כדי לומר לשרת להדביק. או להיפך; אמור לשרת להעתיק ללוח ולהדביק ביישום שלך.

  9. מה המשמעות של ערכי שגיאה עצומים אלה, כגון -2147352573 או 0x80030002 השגיאה?

    ערכים אלה ידועים כ- HRESULTs ומוגדרים ב- winerror.h. המספרים כה גדולים מכיוון שהסיביות הראשונה מייצגת אם זו תוצאת שגיאה. באפשרותך להשתמש בכלי ErrLook.Exe שמגיע עם Visual C++ כדי לתרגם מספרים אלה לתיאורים בעלי משמעות.

    אם ברצונך לקבל באופן תיכנותי תיאור עבור השגיאות, באפשרותך להשתמש ב- API FormatMessage().

    הערה: אם אתה משתמש ב- Visual C++ 6.0 ויש לך משתנה המכיל ערך זה בחלון הצפייה לאיתור באגים, צרף אליו את ", hr" (ללא המרכאות) כדי ש- Visual C++ יתרגם אותו עבורך!

  10. מהי ספריית סוגים?

    ספריית סוגים דומה לקובץ כותרת C/C++ . הוא מכיל את הממשקים, פעולות השירות והמאפיינים שהשרת מפרסם. באפשרותך להציג את ספריית התאים באמצעות מציג האובייקטים OLE/COM (Oleview.exe) הכלול ב- Visual C++. להלן רשימה של שמות הקבצים של ספריית המסמכים עבור Microsoft Office 95, Microsoft Office 97 ו- Microsoft Office 2000:



    Office Application | ספריית סוגים
    ------------------------+----------------
    Word 95 ו- Word | wb70en32.tlb
    Excel 95 וגליון | xl5en32.olb
    Powerpoint 95 וגביעים | Powerpoint.tlb
    Access 95 וגביעים | msaccess.tlb
    אוגדן 95 | binder.tlb
    Schedule+ | sp7en32.olb
    פרוייקט | pj4en32.olb
    מנהל צוות | mstmgr1.olb
    Word 97 | msword8.olb
    Excel 97 | excel8.olb
    Powerpoint 97 | msppt8.olb
    Access 97 | msacc8.olb
    אוגדן 97 | msbdr8.olb
    גרף 97 | graph8.olb
    Outlook 97 | msoutl8.olb
    Outlook 98 | msoutl85.olb
    Word 2000 | msword9.olb
    Excel 2000 | excel9.olb
    Powerpoint 2000 | msppt9.olb
    Access 2000 | msacc9.olb
    Outlook 2000 | msoutl9.olb
    Word 2002 | msword.olb
    Excel 2002 | excel.exeמקשים
    Powerpoint 2002 | msppt.olb
    Access 2002 | msacc.olb
    Outlook 2002 | msoutl.olb

     

  1. קוד האוטומציה שלי פעל עם Excel 95, אך נכשל ב- Excel 97. מה קורה?

    מודל האובייקטים עבור Excel ביצע שינוי משמעותי מגירסה 95 ל- 97. Excel 95 יישם את כל השיטות והמאפיינים שלו ביישום יחיד של IDispatch. משמעות הדבר היא של פעמים רבות ניתן לקרוא לשיטות קריאה שנועדו לאובייקט X, מתוך אובייקט Y. זה לא היה עיצוב טוב, ולכן ב- Office 97, לכל אובייקט יש יישום Idispatch נפרד משלו. משמעות הדבר היא שאם אתה מבקש פעולת שירות או מאפיין מתוך אובייקט X מתוך אובייקט נפרד Y, אתה מקבל את השגיאה 0x80020003, -2147352573, "Member not found". כדי למנוע שגיאה זו, עליך לוודא שממשק IDispatch המשמש אותך לביצוע שיחות הוא הנכון באופן מדויק.
     

  2. היישום שאני הופך לאוטומטי נשאר בזיכרון לאחר סיום התוכנית שלי. מה קורה?

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

    • אם אתה משתמש ב- #import, ייתכן שאתה נתקל באחד מה באגים של ספירת הפניות המשויכים אליה. לעתים קרובות ניתן לעקוף את הבאגים, אך בדרך כלל הוא מועדף להשתמש באחת משיטות האוטומציה האחרות. #import אינה פועלת היטב עם יישומי Office, מאחר שספריות הסוג והשימוש בהן הן מורכבות למדי. כמו כן, קשה לאתר בעיות כגון ספירת פניות מכיוון שקשה לאתר חלק גדול מקריאות ה- COM ברמת הממשק מאחורי הקלעים בעת שימוש ב- #import.

    • בדוק אם אתה מתקשר לשיטות כלשהן, כגון Open או New, שמחזירות IDispatch * (LPDISPATCH) ומתעלם מהערך המוחזר. אם כן, אתה עוזב ממשק מוחזר זה ותצטרך לשנות את הקוד שלך כך שתשחרר אותו כאשר לא יהיה עוד צורך.

    • הוסף הערות הדרגתיות למקטעים של הקוד עד שהבעיה תיעלם, ולאחר מכן הוסף אותה בחזרה ב זהירות כדי לאתר היכן הבעיה מתחילה.

    • שים לב שיישומים מסוימים ימשיכו לפעול אם המשתמש "נגע" ביישום. במקרה כזה, בזמן שאתה הופך לאוטומטי, סביר להניח שהיישום ימשיך לפעול לאחר מכן. ליישומי Office יש מאפיין "UserControl" באובייקט היישום שבאפשרותך לקרוא/לכתוב כדי לשנות אופן פעולה זה.

    • כמו כן, אפליקציות מסוימות יחליטו להמשיך לפעול אם התרחשה מספיק פעולה בממשק המשתמש. אם בכוונתך לצאת מהיישום, קרא לפעולת השירות Quit() שלו באובייקט Application. Word יכבה ללא קשר לספירת ההפניות שלו בעת קריאה ל-Quit. אופן פעולה זה אינו צפוי של COM. עם זאת, Excel יסתיר את עצמו כהלכה, אך ימשיך לפעול עד להפצת כל הממשקים יוצאי דופן. באופן כללי, עליך לשחרר את כל ההפניות הנמצאות בטיפול, ולבצע קריאה ל- Quit() רק אם בכוונתך לצאת מהיישום.

  3. אני יודע מה אני רוצה לעשות כמשתמש ביישום Office, אך כיצד ניתן לעשות זאת באופן תיכנותי באמצעות אוטומציה?

    מעניין אותך באילו אובייקטים, פעולות שירות ומאפיינים עליך להשתמש. הדרך הטובה ביותר ללמוד כיצד לנווט בין מודלי האובייקטים של Word, Excel ו- Powerpoint, בהתבסס על הפעולות שברצונך לבצע כמשתמש, היא להשתמש במקליט המאקרו. פשוט בחר מאקרו\'הקלט מאקרו חדש' בתפריט כלים, בצע את המשימה הרצויה ולאחר מכן בחר מאקרו\'הפסק הקלטה'. לאחר שתסיים להקליט, בחר מאקרו\פקודות מאקרו בתפריט כלים, בחר את המאקרו שהקלטת ולאחר מכן לחץ על ערוך. פעולה זו תעביר אותך אל קוד ה- VBA שנוצר, שישליך את המשימה שהקלטת. זכור שהמאקרו המוקלט לא יהיה הקוד הטוב ביותר האפשרי ברוב המקרים, אך הוא פועל היטב עבור דוגמה מהירה.

  4. האם ניתן להפוך יישום Office מוטבע לאוטומטי?

    בהחלט. החושה היא קבלת מצביע IDispatch: אפשרות זו נתונה ב- Visual C++ Technical Note 39 (TN039).
     

  5. כיצד ניתן לבצע לגשת למסמכי המסמך שלי במסמך Office?

    מאפייני המסמך נגישים באמצעות אוטומציה, או ישירות באמצעות IPropertyStorage.
     

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

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

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

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×