Office-automatisering med Visual C++

Sammanfattning

I den här artikeln besvaras vanliga frågor om automation för Microsoft Office från Visual C++.

Mer information

Innehålls förteckning

  1. Vad är Automation?

  2. Jag är nybörjare i automatisering, var kan jag hitta bra resurser för att lära dig mer?

  3. Finns det olika sätt jag kan använda Automation?

  4. Vad är COM?

  5. Hur ansluter jag till en instans av ett Office-program som körs?

  6. Hur överför jag valfria parametrar?

  7. Hur fångar jag in händelser som utsätts för Office-program?

  8. Min Automation-kod är för långsam. Hur kan jag komma igång?

  9. Vad innebär de här enorma fel värdena, till exempel-2147352573 eller 0x80030002,?

  10. Vad är ett typ bibliotek?

  11. Min Automation-kod fungerade med Microsoft Excel 95 men fungerar inte med Microsoft Excel 97. Varför?

  12. Varför kan jag automatisera minnet när programmet är färdigt?

  13. Jag vet vad jag vill göra som ett Microsoft Office-program, men hur gör jag det program mässigt med Automation?

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

  15. Hur kommer jag åt Mina dokument egenskaper i ett Microsoft Office-dokument?

Frågor och svar

  1. Vad är Automation? Automatisering (tidigare OLE-automatisering) är en teknik som gör att du kan dra nytta av ett befintligt program och infoga det i dina egna program. Du kan till exempel använda stavnings-och grammatikkontrollen i Microsoft Word i programmet utan att Microsoft Word visas för användarna. Du kan till och med använda alla verktyg för diagram-, utskrifts-och data analys. Tekniken gör det enkelt att förenkla och påskynda din utveckling.

  2. Jag är nybörjare i automatisering, var kan jag hitta bra resurser för att lära dig mer? Kapitel 24 av David Kruglinski ' i Visual C++ "(ISBN: 1-57231-565-2) tillhandahåller en allmän översikt samt några fantastiska exempel. Dessutom är Microsoft Knowledge Base en bra informations källa. Den här artikeln är en bra början och du hittar mer specifika referenser i följande artikel i Microsoft Knowledge Base:

    152023 Hitta resurser för att studera OLE automation Om du föredrar att lära dig av exempel kan du läsa följande artikel i Microsoft Knowledge Base:

    179706 HOWTO använda MFC för att automatisera Excel & skapa/formatera en ny arbets bok

  3. Finns det olika sätt jag kan använda Automation? Det finns tre grundläggande sätt att använda Automation: MFC, #import och C/C++:

    • Med MFC kan du använda Visual C++-ClassWizard för att generera "wrapper classes" från Microsoft Office Type Libraries. Dessa klasser och andra MFC-klasser, till exempel COleVariant, COleSafeArray, COleException, underlättar automatiserings uppgifterna. Den här metoden rekommenderas vanligt vis över de andra och de flesta av exemplen i Microsoft Knowledge Base använder MFC.

    • #import, ett nytt direktiv som blev tillgängligt med Visual C++ 5,0, skapar VC + + "smarta pekare" från ett angivet typ bibliotek. Det är mycket kraftfullt men ofta inte rekommenderat på grund av referens problem som normalt inträffar när det används med Microsoft Office-program.

    • C/C++ Automation är mycket svårare, men ibland nödvändigt för att undvika omkostnader med MFC eller problem med #import. I stort sett 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 skillnader mellan automatisering från C++ jämfört med vanlig C, eftersom COM var utformad i C++-klassen. Mer information finns i följande artikel i Microsoft Knowledge Base för ett C-exempel:

    181473 HOWTO: använda OLE-automatisering från ett C-program

  4. Vad är COM? Automation baseras på COM (Component Object Model). COM är en vanlig program arkitektur baserad på gränssnitt och är utformade för att avgränsas med självständiga objekt. Tänk på det som en förlängning av OOP-paradigm (Object objektorienterat PROGRAMMING), men gäller för separata program. Varje objekt visar 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 en uppsättning tjänster som tillhandahålls av DLL-filer (Dynamic Link Libraries) med operativ systemet. Automatisering använder många av dessa tjänster. Ett exempel är "marshaling"-tjänsten, som programmerar klient programmets samtal till medlems funktionerna i Server programmets gränssnitt och vidarebefordrar dem, med deras argument, till serverprogrammet. Det visar sig att serverns gränssnitt visas i klientens minnes utrymme, vilket inte är fallet när klienten är en. exe-enhet som körs i sitt eget process utrymme. När du gör det får du också tillbaka värdena från serverns metoder över hela process gränserna och på ett säkert sätt. Det finns många andra tjänster som är nödvändiga för automatisering och som tillhandahålls av olika COM-bibliotek. Informations källor om de inkluderar "inuti OLE-Second Edition" genom Kraig Brockschmidt, ISBN 1-55615-843-2, "inuti COM" av Magnus Rogerson-ISBN 1-57231-349-8 och "Automation Programmer ' s Reference," ISBN 1-57231-584-9.

  5. Hur ansluter jag till en instans av ett Office-program som körs? Använd API: t GetActiveObject (). Automation-servrar registrerar sig i objektets RÖTANGREPP (med tabellen aktiva) via API: t RegisterActiveObject (). Automation-klienter kan komma åt instansen med kod som:

          // 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 av Office-programmet som du vill bifoga kan du bara ansluta till den första instans som startats med GetActiveObject () API. Teoretiskt sett kan du iterera med RÖTANGREPP för varje enskild instans, men Office-programmen registreras inte automatiskt om en annan instans redan är i matningen, eftersom monikern för sig själv är alltid densamma (det kan vara en åtskillnad). Det innebär att du inte kan koppla till en instans förutom den första. Men eftersom Office-apparna också registrerar sina dokument i en RÖTANGREPP kan du lyckas lägga till andra förekomster genom att söka efter ett visst dokument, koppla till det och sedan hämta programobjektet. Det finns en kod i följande Microsoft Knowledge Base-artikel för att iterera och leta efter ett dokument namn:

    190985 HOWTO: Hämta IDispatch för ett Excel-eller Word-dokument från ett OCX Du behöver inte göra det här för PowerPoint eftersom det är ett program med en enda instans. Du kan bara ha en instans av den.

  6. Hur överför jag valfria parametrar? Vissa metoder har "valfria" parametrar. I Visual Basic kan du hoppa över dem när du anropar den. Men när du anropar Visual C++ måste du överföra en speciell 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 vad Visual Basic gör för att Visa scener.

  7. Hur fångar jag in händelser som utsätts för Office-program? I princip implementerar du det händelse gränssnitt du vill fånga ("Sink") och installerar en rekommendations anslutning till programmet ("källan"). I följande artikel finns steg-för-steg-exempel för Microsoft Word:

    183599 HOWTO: fånga Microsoft Word97-program händelser med hjälp av VC + + För att du ska kunna konfigurera den råd givande anslutningen kan du generellt skaffa serverns IConnectionPointContainer och ringa FindConnectionPoint () med IID för händelse gränssnittet. Detta ger dig ett IConnectionPoint gränssnitt och allt som det är till för att ringa Advise () med en instans av händelse gränssnittet. Servern ringer då tillbaka via det här gränssnittet när de här händelserna inträffar.

  8. Min Automation-kod är för långsam. Hur kan jag komma igång? En vanlig orsak till snabba problem med automatisering är att det är oftare att läsa och skriva data. Det här är typiskt för Excel automation-klienter. De flesta är emellertid inte medvetna om att dessa data vanligt vis kan skrivas eller läsas samtidigt med SAFEARRAY. Se följande Microsoft Knowledge Base-artiklar för mer information och informativa exempel:

    186120 HOWTO: använda MFC för att automatisera Excel och fylla ett område med en matris

    186122 HOWTO: använda MFC för att automatisera Excel & att få en matris från ett område

    179706 HOWTO: använda MFC för att automatisera Excel och skapa/formatera en ny arbets bok Dessutom är det viktigt att peka på det du kan göra för att använda Urklipp. Du kan till exempel kopiera data till Urklipp och sedan använda Automation för att ange vilken server som ska klistras in. Eller vice versa; be servern kopiera till Urklipp och klistra in den i ditt program.

  9. Vad innebär de här enorma fel värdena, till exempel-2147352573, eller 0x80030002? Dessa värden kallas HRESULTs och definieras i WinError. h. Talen är så stora att den första biten representerar om det är ett fel resultat. Du kan använda verktyget ErrLook. exe som medföljer Visual C++ för att översätta dessa nummer till meningsfulla beskrivningar. Om du vill få en beskrivning av felet programmatiskt kan du använda API: t FormatMessage (). Mer information och exempel på användning av FormatMessage () finns i följande artiklar i Microsoft Knowledge Base:

    186063 INFO: översätter automatiserings fel för VB/VBA

    122957 EXEMPEL: Decode32 och Decode16 OLE felkod för kodnings avkodareObs! om du använder visual c++ 6,0 och har en variabel som innehåller det här värdet i fönstret fel söknings bevakning, lägger du till ", HR" (utan citat tecken) för att låta Visual C++ översätta det åt dig!

  10. Vad är ett typ bibliotek? Ett typ bibliotek liknar en C/C++ Header-fil. Den innehåller gränssnitten, metoderna och egenskaperna som en server publicerar. Du kan visa typ biblioteket med OLE/COM-objekt (Oleview. exe) som medföljer Visual C++. Här är en lista över namn på typ bibliotek för Microsoft Office 95, 97 och 2000: Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.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 Binder 97 | msbdr8.olb Graph 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 Automation-kod fungerade med Excel 95 men fungerar inte med Excel 97. Vad händer? Objekt modellen för Excel gjorde en betydande ändring från version 95 till 97. Excel 95 har implementerat alla dess metoder och egenskaper i en enda implementering av IDispatch. Det här avsåg att ofta kunna anropa metoder avsedda för objekt-X, från objekt Y. Det här var inte en bra design, så i Office 97 har alla objekt sin egen egen IDispatch-implementering. Det innebär att om du begär en metod eller egenskap från objekt X från ett separat objekt Y visas felet 0x80020003,-2147352573, "medlemmen hittas inte". För att undvika det här felet måste du kontrol lera att det underliggande IDispatch-gränssnittet du ringer från är det semantiskt korrekta. Mer information finns i följande artiklar i Microsoft Knowledge Base:

    172108 HOWTO: fel sökning "medlemmen hittades inte", 0x80020003 fel

  2. Det program jag automatiserar finns kvar i minnet när mitt program är klart. Vad händer? Troligen är det troligt att du har glömt att släppa ett skaffat gränssnitt och du måste följa upp det. Här är några allmänna förslag och saker att leta efter:

    • Om du använder #import är det troligt att du kan köra en av de program fel för inventering som är associerade med den. Ofta kan program felen bearbetas, men vanligt vis är det lämpligt att använda någon av de andra Automation-metoderna. #import fungerar inte bra med Office-programmen eftersom dess typ bibliotek och användning är ganska komplexa. Dessutom är det svårt att spåra problem med referens räkning eftersom det finns många olika COM-samtal på gränssnitts nivå när du använder #import.

    • Kontrol lera om du ringer till alla metoder, till exempel öppna eller nytt, som returnerar ett IDispatch * (LPDISPATCH) och ignorerar returvärdet. Om du gör det kommer du att överge det här gränssnitts gränssnittet och måste ändra koden så att den släpps när den inte längre behövs.

    • Lägga till en gradvis kommentar i avsnitt i koden tills problemet försvinner och Lägg sedan till det judiciously för att hålla reda på var problemet startar.

    • Vissa program fortsätter att fungera om användaren har "bepekat" programmet. Om det inträffar när du automatiserar dig kommer programmet antagligen att fortsätta köras efteråt. Office-programmen har egenskapen "UserControl" för programobjektet som du kan läsa och skriva för att ändra detta.

    • Vissa program bestämmer sig också om det finns tillräckligt med användar gränssnitt "åtgärd". Om du håller på att avsluta programmet kan du anropa dess quit ()-metod på programobjektet. Word stängs av oavsett dess referens nummer när quit anropas. Det här är inte ett COM-beteende. Excel kan emellertid bara dölja sig själv, men hålla igång tills alla utestående gränssnitt släpps. I allmänhet bör du släppa alla utestående referenser och bara avsluta samtal () om du vill att programmet ska avslutas.

  3. Jag vet vad jag vill göra som en Office-programanvändare, men hur kan jag programmatiskt genom automatisering? Vad du är intresse rad av är vilka objekt, metoder och egenskaper du behöver använda. Det bästa sättet att lära sig att navigera bland objekt modellerna i Word, Excel och PowerPoint, baserat på vad du vill göra som en användare, är att använda makro inspelningen. Välj makro \ ' spela in nytt makro ' på menyn verktyg, kör den uppgift som du är intresse rad av och välj sedan makro \ ' stoppa inspelning ". När du är klar med inspelningen väljer du Macro\Macros på Verktyg-menyn, väljer makrot du spelade in och klickar sedan på Redigera. Då kommer du till den genererade VBA-kod som kommer att utföra den uppgift som du har spelat in. Kom ihåg att det inspelade makrot inte är den bästa möjliga koden i de flesta fall, men det gör det väldigt bra för ett snabbt exempel.

  4. Kan jag automatisera ett inbäddat Office-program? Anser. Det är bara att få IDispatch-pekaren: det ges i Visual C++ Technical NOTE 39 (TN039). I följande Microsoft Knowledge Base-artikel finns en steg-för-steg-exempel:

    184663 HOWTO: bädda in och automatisera ett Microsoft Excel-kalkylblad med MFC

  5. Hur kommer jag åt Mina dokument egenskaper i ett Office-dokument? Dokument egenskaperna är tillgängliga via automatisering eller direkt via IPropertyStorage. Följande artiklar i Microsoft Knowledge Base visar respektive metod:

    179494 HOWTO: Använd Automation för att hämta inbyggda dokument egenskaper

    186898 HOWTO: läsa sammansatta dokument egenskaper direkt med VC + +

Behöver du mer hjälp?

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Microsoft Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

×