Logga in med Microsoft
Logga in eller skapa ett konto.
Hej,
Välj ett annat konto.
Du har flera konton
Välj det konto som du vill logga in med.

Sammanfattning

Den här artikeln besvarar vanliga frågor om automatisering till Microsoft Office från Visual C++.

Mer information

Innehållsförteckning

  1. Vad är automatisering?

  2. Jag har inte använt Automation tidigare, var hittar jag bra resurser för att lära mig mer?

  3. Finns det olika sätt att använda automation?

  4. Vad är COM?
     

  5. Hur gör jag för att bifoga till den pågående instansen av ett Office-program?

  6. Hur gör jag för att klara valfria parametrar?

  7. Hur gör jag för att fånga händelser som exponeras av Office-programmen?
     

  8. Min automationskod är för långsam. Hur gör jag det snabbare?

  9. Vad betyder dessa enorma felvärden, som -2147352573 eller 0x80030002?

  10. Vad är ett typbibliotek?

  11. Min automationskod fungerade med Microsoft Excel 95, men fungerar inte med Microsoft Excel 97. Varför?

  12. Varför stannar programmet jag automatiserar i minnet när programmet är klart?

  13. Jag vet vad jag vill göra som Microsoft Office-programanvändare, men hur gör jag det programmässigt med hjälp av automation?

  14. Kan jag automatisera ett inbäddat Microsoft Office-program?

  15. Hur gör jag för att komma åt mina dokumentegenskaper i ett Microsoft Office-dokument?

Frågor och svar

  1. Vad är automatisering?

    Automation (tidigare OLE Automation) är en teknik som gör att du kan dra nytta av ett befintligt programs funktioner och införliva den i dina egna program. Du kan till exempel använda funktionerna för stavnings- och grammatikkontroll i Microsoft Word i programmet utan att Microsoft Word visas för användarna. Du kan även använda alla diagram-, utskrifts- och dataanalysverktyg i Microsoft Excel. Den här tekniken kan förenkla och påskynda din utveckling avsevärt.
     

  2. Jag har inte använt Automation tidigare, var hittar jag bra resurser för att lära mig mer? Kapitel 24 i David Kruglinskis "Inside Visual C++" (ISBN:1-57231-565- 2) ger en allmän översikt samt några bra exempel. Dessutom är Microsoft Knowledge Base en bra informationskälla.
    Om du föredrar att lära dig efter exempel kan du läsa följande artikel i Microsoft Knowledge Base:
     

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

  3. Finns det olika sätt att använda automation?

    Du kan använda Automation på tre grundläggande sätt: MFC, #import och C/C++:
     

    • Med MFC kan du använda Visual C++ ClassWizard för att generera "omslagsklasser" från Microsoft Office-typbiblioteken. Dessa klasser, liksom andra MFC-klasser, såsom COleVariant, COleSafeArray, COleException, förenklar uppgifterna för automation. Den här metoden rekommenderas vanligtvis framför de andra, och de flesta av Microsoft Knowledge Base-exemplen använder MFC.

    • #import, ett nytt direktiv som blev tillgängligt med Visual C++ 5.0, skapar VC++ "smarta pekare" från ett visst typbibliotek. Det är mycket kraftfullt, men rekommenderas ofta inte på grund av referensräkning av problem som vanligtvis uppstår när de används med Microsoft Office-programmen.

    • C/C++ Automation är mycket svårare, men ibland nödvändigt för att undvika kostnader med MFC, eller problem med #import. I grund och botten arbetar du med sådana API:er som CoCreateInstance() och COM-gränssnitt som IDispatch och IUnknown.

    Det är viktigt att observera att det finns vissa små skillnader mellan Automatisering från C ++ jämfört med vanlig C, eftersom COM utformades runt C ++-klassen.
     

  4. Vad är COM?

    Automation baseras på COM (Component Object Model). COM är en vanlig programvaruarkitektur baserad på gränssnitt och utformad för att ha kod uppdelad i fristående objekt. Tänk på det som en förlängning av OOP-paradigmet (Object Oriented Programming), men tillämpligt för separata program. Varje objekt exponerar en uppsättning gränssnitt och all kommunikation till ett objekt, till exempel initiering, meddelanden och dataöverföring, sker via dessa gränssnitt.

    COM är också en uppsättning tjänster som tillhandahålls av DLL-bibliotek (Dynamic Link Libraryes) som installeras med operativsystemet. Automation använder många av dessa tjänster. Ett exempel är "Marshalling"-tjänsten, som paketerar klientprogrammets anrop till medlemsfunktionerna i serverprogrammets gränssnitt och skickar dem, med argumenten, till serverprogrammet. Det gör att det verkar som om serverns gränssnitt exponeras i klientens minnesutrymme, vilket inte är fallet när klienten är en .exe som körs i sitt eget processutrymme. Marshalling får också returvärdena från serverns metoder tillbaka över processgränserna och säkert i händerna på klientens samtal. Det finns många andra tjänster som är nödvändiga för automatisering som tillhandahålls av de olika COM-biblioteken. Källor till information om dem inkluderar "Inside Ole - Second Edition" av Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" av Dale Rogerson - ISBN 1-57231-349-8 och "Automation Programmer's Reference", ISBN 1-57231-584-9.

  5. Hur gör jag för att bifoga till den pågående instansen av ett Office-program?

    Använd API:t GetActiveObject(). Automationsservrar registrerar sig själva i ROT (Running Object Table), via RegisterActiveObject()-API:t. Automatiseringsklienterna kan komma åt den instans som körs med kod, till exempel:

     

          // 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();
    
    

    Obs! Om det finns flera instanser som kör det Office-program som du vill bifoga kan du bara bifoga till den första instansen som startades med API:t GetActiveObject().

    Teoretiskt sett kan du iterera ROT för varje enskild instans, men Office-apparna registrerar sig inte om en annan instans redan finns i ROT eftersom monikern för sig själv alltid är densamma (det kunde inte urskiljas ändå). Det innebär att du inte kan bifoga till någon instans förutom den första. Men eftersom Office-apparna också registrerar sina dokument i ROT kan du bifoga till andra instanser genom att iterera ROT-filen och leta efter ett visst dokument, bifoga till det och sedan hämta Application-objektet från det.
    Du behöver inte göra detta för PowerPoint eftersom det är ett program med en enda instans. kan du bara köra en instans av den.

  6. Hur gör jag för att klara valfria parametrar?

    Vissa metoder har "valfria" parametrar. I Visual Basic kan du tillfälligt utelämna dem när du anropar metoden. Men när du ringer med Visual C++ måste du skicka en särskild VARIANT vars VT-fält är VT_ERROR och .scode-fältet är DISP_E_PARAMNOTFOUND. Det är:
     

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

    Det här är verkligen vad Visual Basic gör bakom kulisserna.

  7. Hur gör jag för att fånga händelser som exponeras av Office-programmen?

    I grund och botten implementerar du det händelsegränssnitt du vill fånga ("mottagare") och konfigurerar en rådgivande anslutning med programmet ("källan").

    I allmänhet får du serverns IConnectionPointContainer och anropa FindConnectionPoint() med IID för händelsegränssnittet för att konfigurera den rådgivande anslutningen. Det ger dig ett IConnectionPoint-gränssnitt och allt som finns kvar är att anropa Advise() med en instans av ditt händelsegränssnitt. Servern anropas sedan via det här gränssnittet när dessa händelser inträffar.

  8. Min automationskod är för långsam. Hur gör jag det snabbare?

    En vanlig orsak till hastighetsproblem med Automation är upprepad läsning och skrivning av data. Detta är typiskt för Excel Automation-klienter. Men de flesta är inte medvetna om att dessa data vanligtvis kan skrivas eller läsas på en gång med SAFEARRAY. Mer information och informativa exempel finns i följande Microsoft Knowledge Base-artikel:

    179706 HOWTO: Använd MFC för att automatisera Excel och skapa/formatera en ny arbetsbok
    Det är också viktigt att påpeka att användningen av Urklipp ibland kan förbättra prestandan. Du kan till exempel kopiera dina data till Urklipp och sedan använda automation för att tala om för servern att klistra in. Eller vice versa; uppmana servern att kopiera till Urklipp och klistra in den i programmet.

  9. Vad betyder dessa enorma felvärden, till exempel -2147352573 eller 0x80030002?

    Dessa värden kallas HRESULTs och definieras i winerror.h. Talen är så stora eftersom den första biten representerar om det är ett felresultat eller inte. Du kan använda det ErrLook.Exe verktyg som medföljer Visual C++ för att översätta talen till beskrivande beskrivningar.

    Om du programmässigt vill få en beskrivning av felen kan du använda API:t FormatMessage().

    Obs! Om du använder Visual C++ 6.0 och har en variabel som innehåller det här värdet i felsökningsfönstret lägger du till ", hr" (utan citattecken) för att Visual C++ ska översätta det åt dig!

  10. Vad är ett typbibliotek?

    Ett typbibliotek liknar en C/C++-rubrikfil. Den innehåller gränssnitt, metoder och egenskaper som en server publicerar. Du kan visa typbiblioteket med OLE/COM-objektvisaren (Oleview.exe) som medföljer Visual C++. Här är en lista över filnamnen för typbibliotek för Microsoft Office 95, 97 och 2000:



    Office-program | Typbibliotek
    ------------------------+----------------
    Word 95 och tidigare | wb70en32.tlb
    Excel 95 och tidigare | xl5en32.olb
    Powerpoint 95 och tidigare | Powerpoint.tlb
    Access 95 och tidigare | msaccess.tlb
    Pärm 95 | pärm.tlb
    Schedule+ | sp7en32.olb
    Project | pj4en32.olb
    Team Manager-| mstmgr1.olb
    Word 97 | msword8.olb
    Excel 97 | excel8.olb
    Powerpoint 97 | msppt8.olb
    Access 97 | msacc8.olb
    Pärm 97 | msbdr8.olb
    Diagram 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. Min automationskod fungerade med Excel 95, men fungerar inte med Excel 97. Vad händer?

    Objektmodellen för Excel har gjort en betydande ändring från version 95 till 97. Excel 95 implementerade alla dess metoder och egenskaper i en enda implementering av IDispatch. Det innebar att man ofta kunde anropa metoder avsedda för objekt X, från objekt Y. Det var ingen bra design, så i Office 97 har varje objekt en egen separat Idispatch-implementering. Det innebär att om du ber om en metod eller egenskap från objekt X från ett separat objekt Y får du felet 0x80020003 , -2147352573, "Medlem hittades inte". För att undvika det här felet måste du kontrollera att det underliggande IDispatch-gränssnittet du ringer samtal från är det semantiskt korrekta.
     

  2. Programmet jag automatiserar stannar i minnet när programmet är klart. Vad händer?

    Troligtvis beror det på att du har glömt att släppa ett skaffat gränssnitt och du måste spåra det. Här är några allmänna förslag och saker att leta efter:
     

    • Om du använder #import är det mycket troligt att du kan stöta på en av de referensräkningsbuggar som är associerade med den. Ofta kan buggarna kringgås, men vanligtvis är det föredraget att använda någon av de andra automationsmetoderna. #import fungerar inte så bra med Office-programmen, eftersom dess typbibliotek och användning är ganska komplexa. Sådana problem med att räkna referenser är också svåra att spåra eftersom många COM-samtal på gränssnittsnivå är bakom kulisserna när #import används.

    • Kontrollera om du anropar några metoder, till exempel Öppna eller Nytt, som returnerar en IDispatch * (LPDISPATCH) och ignorerar returvärdet. Om du är, då du överge detta returnerade gränssnitt och kommer att behöva ändra din kod så att du släpper den när det inte längre behövs.

    • Kommentera gradvis ut delar av koden tills problemet försvinner och lägg sedan till det på ett omdömesgillt sätt för att spåra var problemet börjar.

    • Observera att vissa program körs även om användaren har "rört" programmet. Om detta inträffar medan du automatiserar kommer programmet förmodligen att fortsätta köras efteråt. Office-programmen har egenskapen "UserControl" på programobjektet som du kan läsa/skriva för att ändra det här beteendet.

    • Vissa program bestämmer sig också för att fortsätta köra om tillräckligt med "åtgärd" i användargränssnittet har inträffat. Om du tänker avsluta programmet anropar du metoden Avsluta() i application-objektet. Word stängs av oavsett antalet referenser när Avsluta anropas. Detta är inte förväntat COM-beteende. Excel döljer sig dock på rätt sätt men fortsätter att köras tills alla enastående gränssnitt släpps. I allmänhet bör du släppa alla utestående referenser och bara anropa Avsluta() om du tänker avsluta programmet.

  3. Jag vet vad jag vill göra som Användare av Office-program, men hur gör jag det programmässigt via Automation?

    Det du är intresserad av är vilka objekt, metoder och egenskaper du behöver använda. Det bästa sättet att lära sig att navigera i objektmodellerna i Word, Excel och Powerpoint, baserat på vad du vill göra som användare, är att använda makroinspelningen. Välj bara Makro\'Spela in nytt makro' på verktygsmenyn, utför uppgiften du är intresserad av och välj sedan Makro\'Stoppa inspelning.' När du är klar med inspelningen väljer du Makro\Makron på verktygsmenyn, väljer det makro du spelade in och klickar sedan på Redigera. Detta tar dig till den genererade VBA-kod som utför uppgiften du spelade in. Tänk på att det inspelade makrot inte är den bästa möjliga koden i de flesta fall, men det gör mycket bra för ett snabbt exempel.

  4. Kan jag automatisera ett inbäddat Office-program?

    Absolut. Tricket är att få IDispatch-pekaren: detta anges i Visual C++ Technical Note 39 (TN039).
     

  5. Hur gör jag för att komma åt mina dokumentegenskaper i ett Office-dokument?

    Dokumentegenskaperna är åtkomliga via Automation eller direkt via IPropertyStorage.
     

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.

Hade du nytta av den här informationen?

Hur nöjd är du med språkkvaliteten?
Vad påverkade din upplevelse?
Genom att trycka på skicka, kommer din feedback att användas för att förbättra Microsofts produkter och tjänster. IT-administratören kan samla in denna data. Sekretesspolicy.

Tack för din feedback!

×