Microsoft hesabıyla oturum açın
Oturum açın veya hesap oluşturun.
Merhaba,
Farklı bir hesap seçin.
Birden çok hesabınız var
Oturum açmak istediğiniz hesabı seçin.

Belirtiler

Microsoft Office uygulamasını otomatikleştirmek için GetObject (Microsoft Visual Basic) veya GetActiveObject (Microsoft Visual C++) kullanmaya çalıştığınızda, Office uygulaması çalışıyor olsa bile aşağıdaki hata iletilerinden birini alırsınız:

Hata iletisi 1

Çalışma zamanı hatası '429':
ActiveX bileşeni nesne oluşturamıyor

Hata iletisi 2

Hata: "İşlem kullanılamıyor" 0x800401e3

Neden

Office uygulaması çalışıyor olsa da, Çalışan Nesne Tablosu'na (ROT) kaydedilmemiş olabilir. Çalışan bir Office uygulamasının GetObject (Visual Basic) veya GetActiveObject (Visual C++) kullanılarak eklenebilmesi için önce ROT'ye kaydedilmesi gerekir.

Bir Office uygulaması başlatıldığında, çalışan nesnelerini hemen kaydetmez. Bu, uygulamanın başlangıç işlemini iyileştirir. Bir Office uygulaması başlangıçta kaydetmek yerine, odak kaybedildiğinde çalışan nesnelerini ROT'ye kaydeder. Bu nedenle, uygulama odağı kaybetmeden önce Bir Office uygulamasının çalışan örneğine eklemek için GetObject veya GetActiveObject kullanmayı denerseniz, yukarıdaki hatalardan birini alabilirsiniz.

Çözüm

Kodu kullanarak, odağı Office uygulamasından kendi uygulamanıza (veya başka bir uygulamaya) değiştirerek rot'a kaydolmasını sağlayabilirsiniz. Ayrıca, kodunuz Office uygulamasının exe dosyasını başlatıyorsa, çalışan örneğe eklemeye çalışmadan önce Office uygulamasının yüklenmesinin tamamlanmasını beklemeniz gerekebilir. "Daha Fazla Bilgi" bölümünde geçici bir çözüm olarak bir kod örneği sağlanır.

Durum

Bu davranış tasarımdan kaynaklanır.

Daha Fazla Bilgi

Çoğu durumda, bir Office uygulamasını otomatikleştirmek isteyen geliştiricilerin Office uygulamasının yeni bir örneğini başlatmak için CreateObject (Visual Basic) veya CoCreateInstance (Visual C++) kullanması gerekir.

Ancak, zaten çalışmakta olan bir Office uygulamasını otomatikleştirmeyi tercih edebileceğiniz durumlar vardır: örneğin, kullanıcı Office uygulamasını daha önce başlattıysa. Ya da uygulama için komut satırı anahtarları belirtebilmeniz için office uygulamasının yürütülebilir dosyasını kod kullanarak başlattıysanız. Çalışan Office uygulamasını otomatikleştirmek için GetObject veya GetActiveObject kullanmanız gerekir.

Davranışı yeniden oluşturma adımları

  1. Microsoft Visual Basic'i başlatın ve yeni bir Standart EXE projesi oluşturun. Form1 varsayılan olarak oluşturulur.

  2. Form1'e CommandButton denetimi ekleyin.

  3. Formun kod modülüne aşağıdaki kodu ekleyin.

    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. Kod örneğinde Excel.exe konumunun doğru olduğundan emin olun.

  5. Zaten çalışıyorsa Microsoft Excel'den çıkın.

  6. Projeyi çalıştırmak için F5 tuşuna basın ve Ardından Komut1'e tıklayın.

Geçici Çözüm

Sorunu geçici olarak çözmek için şunları yapabilirsiniz:

  • Shell işlevinin ikinci bağımsız değişkenini vbMinimizedFocus, vbMaximizedFocus veya vbNormalFocus olarak değiştirerek Office uygulamasına odaklanın.

  • Odağı Visual Basic formunuza verin.

  • Office uygulamasının yükleme süresini hesaplarken GetObject'i deneme.

Aşağıdaki düzeltilmiş kodda bu geçici çözüm gösterilmektedir.

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

C++ için geçici çözüm

C++ dilinde programlama kullanıyorsanız, aşağıdaki kod örneğinde yukarıdaki Visual Basic örneğinde gösterilene benzer bir geçici çözüm gösterilmektedir. Odağı Excel'den uzaklaştırmak ve çalışan nesnelerini kaydetmesini sağlamak için SetForegroundWindow'un kullanıldığına dikkat edin.

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

Başvurular

Daha fazla bilgi için, makaleyi görüntülemek üzere aşağıdaki makale numaralarına tıklayın:

Office uygulamasının yükleme yolunu bulma

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.

Topluluklar, soru sormanıza ve soruları yanıtlamanıza, geri bildirimde bulunmanıza ve zengin bilgiye sahip uzmanlardan bilgi almanıza yardımcı olur.

Bu bilgi yararlı oldu mu?

Dil kalitesinden ne kadar memnunsunuz?
Deneyiminizi ne etkiledi?
Gönder’e bastığınızda, geri bildiriminiz Microsoft ürün ve hizmetlerini geliştirmek için kullanılır. BT yöneticiniz bu verileri toplayabilecek. Gizlilik Bildirimi.

Geri bildiriminiz için teşekkürler!

×