GetObject oder GetActiveObject kann eine laufende Office-Anwendung nicht finden.

Der Support für Office 2003 wurde eingestellt

Microsoft stellte am 8. April 2014 den Support für Office 2003 ein. Diese Änderung wirkt sich auf Ihre Softwareupdates und Sicherheitsoptionen aus. Erfahren Sie, was das für Sie bedeutet und wie Sie Ihren Schutz aufrechterhalten können.

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 238610
Problembeschreibung
Beim GetObject (Microsoft Visual Basic) oder GetActiveObject (Microsoft Visual C++) verwenden, um eine Microsoft Office-Anwendung automatisieren, erhalten Sie eine der folgenden Fehlermeldungen angezeigt, obwohl die Office-Anwendung läuft:
Fehlermeldung 1
Laufzeitfehler '429':
ActiveX-Komponente kann nicht Objekt erstellt werden.
Fehlermeldung 2
Fehler: 0x800401e3 "Der Vorgang ist nicht verfügbar"
Ursache
Obwohl die Office-Anwendung ausgeführt wird, kann es nicht in Running Object Table (ROT) registriert. Eine laufende Instanz einer Office-Anwendung muss in der ROT registriert sein, bevor es mithilfe von GetObject (Visual Basic) oder GetActiveObject (Visual C++) zugeordnet werden kann.

Wenn eine Office-Anwendung gestartet wird, erfasst es ihre laufenden Objekte nicht sofort. Diese Vorgehensweise Startvorgang der Anwendung optimiert. Anstatt die Registrierung beim Start registriert eine Office-Anwendung ihre laufenden Objekte in der ROT, sobald es den Fokus verliert. Daher, wenn Sie versuchen, mit GetObject oder GetActiveObject zur einer laufenden Instanz einer Office-Anwendung anzufügen, bevor die Anwendung den Fokus verloren hat, Sie einer der obigen Fehler erhalten.
Lösung
Mit Code ändern Sie verlagern Fokus von der Office-Anwendung auf Ihre Anwendung (oder eine andere Anwendung), damit sich die Office-Anwendung selbst in der ROT registrieren kann. Wenn Code Exe-Datei der Office-Anwendung starten, müssen Sie außerdem die Office-Anwendung geladen vor dem Anhängen an ausgeführte Instanz warten. Zur Umgehung dieses Problems im Abschnitt "Weitere Informationen" wird ein Codebeispiel bereitgestellt.
Status
Dieses Verhalten ist entwurfsbedingt.
Weitere Informationen
In den meisten Fällen müssen Entwickler, die eine Office-Anwendung automatisieren möchten CreateObject (Visual Basic) oder CoCreateInstance (Visual C++) verwenden, um eine neue Instanz der Office-Anwendung zu starten.

Es gibt jedoch Fälle, empfiehlt eine Office-Anwendung automatisieren, die bereits ausgeführt wird: z. B. wenn der Benutzer die Office-Anwendung zuvor gestartet. Oder wenn Sie mit Code, damit Sie Befehlszeilenoptionen für die Anwendung angeben, können die Office-Anwendung ausführbare Datei gestartet. Um die laufende Office-Anwendung automatisieren möchten, müssen Sie GetObject oder GetActiveObjectverwenden.

Schritte zum Reproduzieren des Verhaltens

  1. Starten Sie Microsoft Visual Basic, und erstellen Sie eine neue Standard-EXEproject. Form1 wird standardmäßig erstellt.
  2. Fügen Sie eine Befehlsschaltfläche zu Form1 hinzu.
  3. Code-Modul des Formulars den folgenden Code hinzufügen.
    Private Sub Command1_Click()    Dim oExcel As Object    ' Launch a new instance of Microsoft Excel:    Shell "C:\Program Files\Microsoft Office\Office\Excel.EXE", _       vbMinimizedNoFocus    ' An error 429 occurs on the following line:    Set oExcel = GetObject(, "Excel.Application")    MsgBox oExcel.Name    Set oExcel = NothingEnd Sub					
  4. Sicherstellen Sie, dass der Speicherort der Excel.exe Thecode Beispiel korrekt ist.
  5. Beenden Sie Microsoft Excel, wenn es bereits ausgeführt wird.
  6. Drücken Sie F5, um das Projekt auszuführen und auf Command1.

Dieses Problem umgehen

Um das Problem zu umgehen, können wie folgt vor:
  • Fokus auf die Office-Anwendung durch Secondargument der Shell-Funktion VbMinimizedFocus, VbMaximizedFocusoder VbNormalFocusändern.
  • Dem Visual Basic-Formular den Fokus.
  • Versuchen Sie GetObject unter Berücksichtigung der Office-Anwendung Loadtime.
Der folgende überarbeitete Code veranschaulicht diese Methode.
Private Declare Sub Sleep Lib "kernel32" _    (ByVal dwMilliseconds As Long)Private Sub Command1_Click()    Dim intSection As Integer    Dim intTries As Integer    Dim oExcel As Object        ' Enable error handler for this procedure:    On Error GoTo ErrorHandler        ' Launch Microsoft Excel, giving it focus:    Shell "C:\Program Files\Microsoft Office\Office\Excel.EXE", _        vbMinimizedFocus 'other options for starting with        'focus: vbMaximizedFocus and vbNormalFocus        ' Move focus back to this form. (This ensures the Office    '  application registers itself in the ROT, allowing    '  GetObject to find it.)    Me.SetFocus        ' Attempt to use GetObject to reference the running    '  Office application:    intSection = 1 'attempting GetObject...    Set oExcel = GetObject(, "Excel.Application")    intSection = 0 'resume normal error handling        ' Now you can automate Microsoft Excel:    MsgBox oExcel.Name & ": able to GetObject after " & _        intTries + 1 & " tries.", vbMsgBoxSetForeground        ' Finished with automation so release your reference:    Set oExcel = Nothing        ' Exit procedure:    Exit Sub    ErrorHandler:    If intSection = 1 Then 'GetObject may have failed because the    'Shell function is asynchronous; enough time has not elapsed    'for GetObject to find the running Office application. Wait    'wait 1/2 seconds and retry the GetObject. If you try 20 times    'and GetObject still fails, assume some other reason    'for GetObject failing and exit the procedure.        intTries = intTries + 1        If intTries < 20 Then            Sleep 500 ' wait 1/2 seconds            Resume 'resume code at the GetObject line        Else            MsgBox "GetObject still failing. Process ended.", _                vbMsgBoxSetForeground        End If    Else 'intSection = 0 so use normal error handling:        MsgBox Error$    End IfEnd Sub				

Abhilfe für C++

Wenn Programmierung in C++ wird im folgenden Codebeispiel ähnlichen Umgehung im obigen Visual Basic-Beispiel veranschaulicht. Beachten Sie, dass SetForegroundWindow Fokus von Excel, sodass ihre laufenden Objekte registriert.
//Store the handle of the currently active window...HWND hwndCurrent = ::GetForegroundWindow();//Launch Excel and wait until it is waiting for//user input...STARTUPINFO Start;PROCESS_INFORMATION ProcInfo;ZeroMemory(&Start,sizeof(STARTUPINFO));Start.cb=sizeof(Start);Start.dwFlags = STARTF_USESHOWWINDOW;Start.wShowWindow = SW_SHOWMINIMIZED;//Change the path to Excel as needed...LPSTR pszExcelPath =       "c:\\program files\\microsoft office\\office\\excel.exe";::CreateProcess(NULL, pszExcelPath, 0, 0, 1,       NORMAL_PRIORITY_CLASS, 0, NULL, &Start, &ProcInfo);if((::WaitForInputIdle(ProcInfo.hProcess, 10000))==WAIT_TIMEOUT){    ::MessageBox(NULL, "Timed out waiting for Excel.", NULL,                   MB_OK);}//Restore the active window to the foreground...//  NOTE: If you comment out this line, the code will fail!::SetForegroundWindow(hwndCurrent);//Initialize COM library...::CoInitialize(NULL);//Attach to the running instance...CLSID clsid;CLSIDFromProgID(L"Excel.Application", &clsid);  IUnknown *pUnk = NULL;IDispatch *pDisp = NULL;for(int i=1;i<=5;i++) //try attaching for up to 5 attempts{   HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);   if(SUCCEEDED(hr))    {       hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);       break;   }   ::Sleep(1000);}        if (!pDisp) {    ::MessageBox(NULL, "Failed to find instance!!", "Error",                  MB_ICONHAND);}else {    ::MessageBox(NULL, "Got instance of Excel!", "Success", MB_OK);}//Release the no-longer-needed IUnknown...if (pUnk)     pUnk->Release();//... Add your automation code for Excel here ...//Release pDisp when no longer needed...if (pDisp)    pDisp->Release();//Cleanup COM...CoUninitialize();				
Informationsquellen
Klicken Sie für weitere Informationen auf die folgenden Artikelnummer, um die betreffende Artikel in der Microsoft Knowledge Base anzuzeigen:
192919 Automatisieren eine gesicherte Access-Datenbank mit Visual Basic
237338 Verwendung von WordMail Fehlermeldung: "Diese Methode oder Eigenschaft ist nicht verfügbar"
240794 Wie bestimmt den Pfad für eine Office-Anwendung
Fehler 429 ACC2003 ACC2007 XL2003 XL2007 WD2003 WD2007 PPT2003 PPT2007

Warnung: Dieser Artikel wurde automatisch übersetzt.

خصائص

رقم الموضوع: 238610 - آخر مراجعة: 10/04/2015 11:24:00 - المراجعة: 7.0

Microsoft Office Excel 2007, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft Visual Basic for Applications 6.0, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Office Access 2007, Microsoft Office Access 2003, Microsoft Access 2002 Standard Edition, Microsoft Access 2000 Standard Edition, Microsoft Access 97 Standard Edition, Microsoft Office PowerPoint 2007, Microsoft Office PowerPoint 2003, Microsoft PowerPoint 2002 Standard Edition, Microsoft PowerPoint 2000 Standard Edition, Microsoft PowerPoint 97 Standard Edition, Microsoft Office Word 2007, Microsoft Word 2002 Standard Edition, Microsoft Word 2000 Standard Edition, Microsoft Word 97 Standard Edition

  • kbautomation kbprb kbmt KB238610 KbMtde
تعليقات