Pierakstīties, izmantojot Microsoft
Pierakstīties vai izveidot kontu
Sveicināti!
Atlasīt citu kontu.
Jums ir vairāki konti
Izvēlieties kontu, ar kuru vēlaties pierakstīties.

Simptomi

Mēģinot izmantot GetObject (Microsoft Visual Basic) vai GetActiveObject (Microsoft Visual C++), lai automatizētu Microsoft Office lietojumprogrammu, tiek parādīts kāds no tālāk norādītajiem kļūdu ziņojumiem pat tad, ja ir palaista Office lietojumprogramma:

1. kļūdas ziņojums

Izpildlaika kļūda "429": ActiveX komponents nevar izveidot objektu

2. kļūdas ziņojums

Kļūda: 0x800401e3 "darbība nav pieejama"

Cēlonis

Lai gan Office lietojumprogramma darbojas, tā, iespējams, nav reģistrēta palaisto objektu tabulā (ROT). Office lietojumprogrammas palaistajai instancei ir jābūt reģistrētai ROT, pirms to var pievienot, izmantojot GetObject (Visual Basic) vai GetActiveObject (Visual C++). Ja Office lietojumprogramma tiek sākta, tā uzreiz nereģistrē tās palaistos objektus. Tādējādi tiek optimizēts lietojumprogrammas startēšanas process. Tā vietā, lai reģistrētos startēšanas laikā, Office lietojumprogramma reģistrē tās darba objektus ROT, tiklīdz tas zaudē fokusu. Tāpēc, ja mēģināt izmantot GetObject vai GetActiveObject , lai pievienotu Office lietojumprogrammas palaisto instanci, pirms lietojumprogramma ir pazaudējusi fokusu, iespējams, saņemsit kādu no iepriekš norādītajām kļūdām.

Risinājums

Izmantojot kodu, varat mainīt fokusu no Office lietojumprogrammas uz savu lietojumprogrammu (vai kādu citu lietojumprogrammu), lai to varētu reģistrēt. Turklāt, ja jūsu kods ir palaidis Office lietojumprogrammas exe failu, iespējams, būs jāgaida, līdz Office lietojumprogramma tiks pabeigta, pirms mēģināt pievienot palaistajai instancei. Koda paraugs ir paredzēts kā risinājums sadaļā Papildinformācija.

Statusa

Šo darbību nodrošina noformējums.

Papildinformācija

Vairākumā gadījumu izstrādātājiem, kas vēlas automatizēt Office lietojumprogrammu, ir jāizmanto CreateObject (Visual Basic) vai CoCreateInstance (Visual C++), lai palaistu jaunu Office lietojumprogrammas instanci. Tomēr ir gadījumi, kad, iespējams, vēlēsities automatizēt Office lietojumprogrammu, kas jau darbojas: piemēram, ja lietotājs iepriekš ir sācis Office lietojumprogrammu. Vai, ja esat palaidis Office lietojumprogrammas izpildāmo, izmantojot kodu, lai lietojumprogrammai varētu norādīt komandrindas slēdžus. Lai automatizētu palaisto Office lietojumprogrammu, ir jāizmanto GetObject vai GetActiveObject.

Darbības, kas jāveic, lai atveidotu darbību

  1. Startējiet programmu Microsoft Visual Basic un izveidojiet jaunu standarta EXE projektu. Form1 ir izveidots pēc noklusējuma.

  2. Pievienojiet CommandButton vadīklu pie Form1.

  3. Pievienojiet tālāk norādīto kodu formas koda modulī.

    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. Pārliecinieties, vai koda izlasē ir pareiza Excel. exe atrašanās vieta.

  5. Aizveriet programmu Microsoft Excel, ja tā jau darbojas.

  6. Nospiediet taustiņu F5, lai palaistu projektu, un noklikšķiniet uz Command1.

Risinājums

Lai novērstu šo problēmu, varat veikt tālāk norādītās darbības.

  • Pievērsiet uzmanību Office lietojumprogrammai, mainot funkcijas shell otro argumentu uz vbMinimizedFocus, vbMaximizedFocusvai vbNormalFocus.

  • Piešķiriet fokusam vizuālo pamata formu.

  • Mēģināt GetObject , kamēr tiek uzskaitīts Office lietojumprogrammas ielādes laiks.

Šajā pārskatītajā kodā ir parādīts šis risinājums.

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

C + C++ risinājums

Ja programmējat sadaļā C++, tālāk esošajā koda paraugā ir parādīts līdzīgs risinājums, kas parādīts iepriekš redzamajā Visual Basic izlasē. Ņemiet vērā, ka SetForegroundWindow tiek izmantota, lai pārvietotu fokusu prom no programmas Excel, ļaujot tai reģistrēt savus palaistos objektus.

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

Atsauces

Lai iegūtu papildinformāciju, noklikšķiniet uz šiem rakstu numuriem, lai skatītu rakstus Microsoft zināšanu bāzē:

192919 Drošas Access datu bāzes automatizēšana, izmantojot Visual Basic

237338 Kļūdas ziņojums, izmantojot WordMail: "Šī metode vai rekvizīts nav pieejams"

240794 Office lietojumprogrammas trajektorijas noteikšana

Nepieciešama papildu palīdzība?

Vēlaties vairāk opciju?

Izpētiet abonementa priekšrocības, pārlūkojiet apmācības kursus, uzziniet, kā aizsargāt ierīci un veikt citas darbības.

Kopienas palīdz uzdot jautājumus un atbildēt uz tiem, sniegt atsauksmes, kā arī saņemt informāciju no ekspertiem ar bagātīgām zināšanām.

Vai šī informācija bija noderīga?

Cik lielā mērā esat apmierināts ar valodas kvalitāti?
Kas ietekmēja jūsu pieredzi?
Nospiežot Iesniegt, jūsu atsauksmes tiks izmantotas Microsoft produktu un pakalpojumu uzlabošanai. Jūsu IT administrators varēs vākt šos datus. Paziņojums par konfidencialitāti.

Paldies par jūsu atsauksmēm!

×