Funkcia GetObject alebo GetActiveObject sa nedá nájsť spustenej aplikácii Office

Preklady článku Preklady článku
ID článku: 238610 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

PRIZNAKY

Pri pokuse použiť Funkcia GetObject (Microsoft Visual Basic) alebo GetActiveObject (Microsoft Visual C++) na automatizáciu balíka Microsoft Office, dostanete jeden z nasledovných chybové hlásenia, aj keď aplikácia balíka Office je spustená:
Chybové hlásenie 1
Chyba spustenia "429":
ActiveX súčasť nie je možné vytvoriť objekt
Chybové hlásenie 2
Chyba (Error): 0x800401e3 "Operácia nie je k dispozícii"

PRICINA

Hoci je spustená aplikácia balíka Office, to nemusí byť registrované v pohotovostnom objektu tabuľky (ROT). Spustené inštancie úradu žiadosti musia byť zaregistrované v hniloby pred môže byť pripojená k pomocou Funkcia GetObject (Visual Basic) alebo GetActiveObject (Visual C++).

Pri spustení aplikácie balíka Office je robí nie okamžite registra jej prevádzkových objektov. Toto optimalizuje proces spúšťania aplikácie. Namiesto na registráciu pri spustení, úrad jeho prevádzkové objekty aplikácie registrov v hniloby raz stráca zameranie. Preto, ak sa pokúsite použiť Funkcia GetObject alebo GetActiveObject pripojiť k spustené inštancie aplikácie balíka Office pred uplatňovanie stratil zameranie, môže dostávať jednu z vyššie uvedených chýb.

RIESENIE

Použitím kódu, môžete zmeniť zameranie z úradu uplatnenie vlastné aplikácie (alebo inej aplikácie) umožňuje zaregistrovať na HNILOBU. Okrem toho, ak váš kód je začatie Aplikácia balíka Office exe súbor, budete musieť čakať na úrad žiadosť na načítanie pred pokusom pripojiť k behu inštancia. Kód vzorky sa poskytuje ako riešenie "Viac informácií" sekcia.

STAV

Toto správanie je predvolené.

DALSIE INFORMACIE

Vo väčšine situácií, vývojárov, ktorí chcú automatizovať Aplikácia balíka Office je potrebné použiť CreateObject (Visual Basic) alebo CoCreateInstance (Visual C++) začať novú inštanciu úradu aplikácia.

Existujú však prípady, kde možno preferujete automatizovať aplikácii balíka Office, že je už beží: napríklad, ak používateľ predtým začala aplikácia balíka Office. Alebo ak ste začal úrad spustiteľný súbor aplikácie pomocou kódu tak, aby ste mohli zadať príkazového riadka Prepínače pre uplatňovanie. Na automatizáciu beží Office žiadosti, musíte použiť Funkcia GetObject alebo GetActiveObject.

Kroky na reprodukovanie správanie

  1. Spustiť Microsoft Visual Basic a vytvoriť nové štandardné EXE projekt. Form1 sa vytvorí na základe predvoleného nastavenia.
  2. Pridať CommandButton kontroly Form1;
  3. Pridať nasledujúci kód do formulára kód modulu.
    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 = Nothing
    End Sub
    					
  4. Skontrolujte, či je správne umiestnenie Excel.exe vzorka kódu.
  5. Ukončite program Microsoft Excel, ak je už spustená.
  6. Stlačením klávesu F5 spustenie projektu a kliknite na tlačidlo Command1.

Riešenie

Ak chcete obísť tento problém, môžete:
  • Umiestniť fokus na aplikácia balíka Office zmenou druhý argumentom funkcie Shell buď vbMinimizedFocus, vbMaximizedFocus, alebo vbNormalFocus.
  • Dať Visual Basic formulára zameranie.
  • Pokus Funkcia GetObject zatiaľ čo účtovné pre aplikácie balíka Office zaťaženie čas.
Nasledujúce revidovanými ilustruje toto riešenie.
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 If
End Sub
				

Riešenie pre C++

Ak sú programovanie v c ++, nasledujúce kód vzorky demonštruje, podobné riešenie, ktoré uvedená vyššie vzorky jazyka Visual Basic. Všimnite si, že SetForegroundWindow sa používa na premiestnenie zameranie preč z programu Excel, umožňuje zaregistrovať jeho prevádzkové objekty.
//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();
				

ODKAZY

Ďalšie informácie zobrazíte kliknutím na nasledujúce čísla článkov databázy Microsoft Knowledge Base:
192919Automatizácia zabezpečených databázy Access pomocou Visual Basic
237338 Chybové hlásenie pri používaní programu WordMail: "Táto metóda alebo vlastnosť nie je k dispozícii"
240794 Ako zistiť cestu pre aplikácie balíka Office

Vlastnosti

ID článku: 238610 - Posledná kontrola: 23. októbra 2011 - Revízia: 3.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • 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
Kľúčové slová: 
kbautomation kbprb kbmt KB238610 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:238610

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com