GetObject- och CreateObject-beteende Office automatiseringsservrar
Anteckning
Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.
Sammanfattning
I den här artikeln beskrivs de olika beteenden som uppstår när du använder funktionerna GetObject och CreateObject med olika versioner av Microsoft Office-program.
GetObject och CreateObject är funktioner som tillhandahålls av Microsoft Visual Basic och Microsoft Visual Basic for Applications (VBA). Informationen gäller dock även Microsoft Visual C++ om du behandlar referenser till GetObject som anrop till GetActiveObject API, och referenser till CreateObject som anrop till CoCreateInstanceAPI.
Mer information
GetObject
GetObject används för att bifoga till en instans av en automatiseringsserver som körs. Det finns några olika sätt att anropa GetObject, men syntaxen som rekommenderas för Microsoft Office är följande:
set xlApp = GetObject(, "Excel.Application")
Om en instans Microsoft Excel körs när den här koden körs har du åtkomst till objektmodellen för instansen som körs via xlApp-variabeln. Om ingen instans körs får du följande snabbmeddelande:
Run-time error '429':
ActiveX component can't create object
Om flera instanser av Microsoft Excel körs, bifogar GetObject till den instans som startas först. Om du sedan stänger den första förekomsten bifogar ett annat samtal till GetObject den andra instansen som startades, och så vidare.
Du kan bifoga till en specifik instans om du vet namnet på ett öppet dokument i den instansen. Om till exempel en instans av Excel körs med en öppen arbetsbok med namnet Bok2 har följande kod bifogats till den instansen även om det inte är den tidigaste instansen som startades:
Set xlApp = GetObject("Book2").Application
CreateObject
CreateObject används för att starta en ny instans av en automationsserver. Till exempel:
set xlApp = CreateObject("Excel.Application")
Beroende på om servern är utformad som enkel användning eller multianvändning kan det hända att en annan serverprocess startas eller inte. Det här kan vara en viktig skillnad när du bestämmer om du ska stänga av en automatiseringsinstans. Om en instans redan körs innan du bifogar till en multianvändarserver kan det vara bra att undvika att programmässigt stänga av servern när du är klar med att automatisera den.
Följande tabell fungerar som en användbar referens när en lösning implementeras med Microsoft Office. Den visar beteenden och attribut för de olika versionerna och programmen i Microsoft Office, till exempel om serverns standard visas vid lansering, om den är Enkelanvändning eller Flera användare, om den har egenskapen UserControl, om den har metoden Quit och klassnamnet för huvudfönstret.
| Program | Synlig | Inst den förser dig med | Has UserControl | Har QuitClassName | Klassnamn |
|---|---|---|---|---|---|
| Excel 97, 2000, 2002, 2003, 2007 | Nej | Enkelanvändning | Ja | Ja | XlMain |
| Word 97, 2000, 2002, 2003, 2007 | Nej | Enkelanvändning | Ja | Ja | ÖjdApp |
| PowerPoint 97 | Nej | Multianvända | Nej | Ja | PP97FrameClass |
| PowerPoint 2000 | Nej | Multianvända | Nej | Ja | PP9FrameClass |
| PowerPoint 2002 | Nej | Multianvända | Nej | Ja | PP10FrameClass |
| PowerPoint 2003 | Nej | Multianvända | Nej | Ja | PP11FrameClass |
| PowerPoint 2007 | Nej | Multianvända | Nej | Ja | PP12FrameClass |
| Access 97 | Ja | Enkelanvändning | Ja | Ja | OMain |
| Access 2000, 2002, 2003, 2007 | Nej | Enkelanvändning | Ja | Ja | OMain |
| Project 98, 2000 | Nej | Multianvända | Ja | Ja | JWinproj-WhimperMainClass |
Huvudfönstrets klassnamn är användbart för att anropa FindWindow API när du vill ta reda på det bekvämt om någon instans redan körs. Egenskapen UserControl är en boolesk egenskap som anger om serverprogrammet stängs av automatiskt när den senaste referensen släpps (anges till ingenting). Med metoden Quit kan du åsidosätta egenskapen UserControl i fall där det är nödvändigt (till exempel när en instans inte stängs av efter att den sista referensen har släppts).
I allmänhet rekommenderar Microsoft att du använder en ny instans av ett Office-program i stället för att bifoga till en instans som användaren kanske använder. Det är bäst att skapa en instans med hjälp av Application ProgID och sedan öppna eller skapa nya objekt därifrån. Andra ProgIDs, till exempel Excel. Blad och Word.Document o.s.v. är avsedda att användas i OLE (object linking and Embedding) och kan ge inkonsekventa resultat när de används med CreateObject. Genom att använda Application ProgID undviker du potentiella problem genom att uttryckligen starta servern för automatisering (inte inbäddning).
När du är klar med Automation-servern släpper du alla referenser till den och anropar dess Avsluta-metod (om den är tillgänglig) så att servern avslutas som förväntat. Om du vill konfigurera en instans via Automation och sedan lämna den öppen så att användaren kan använda den måste du ange egenskapen UserControl till SANT och sedan släppa alla referenser. Servern förblir då igång (eftersom egenskapen UserControl är SANT) och avslutas korrekt när användaren stänger programmet (eftersom det inte finns några utestående referenser).
Obs! För Word är egenskapen UserControl skrivskyddat. Det kan inte anges till Sant eller Falskt. Word körs alltid när den sista referensen släpps.