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.

Özet

Bu makalede Visual C++'tan Microsoft Office'e Otomasyon ile ilgili sık sorulan sorular yanıtlanmaktadır.

Ek Bilgi

İçindekiler Tablosu

  1. Otomasyon nedir?

  2. Otomasyon'da yeniyim, daha fazla bilgi edinmek için iyi kaynakları nereden bulabilirim?

  3. Otomasyonu kullanmanın farklı yolları var mı?

  4. COM nedir?
     

  5. Bir Office uygulamasının çalışan örneğine ekleme Nasıl yaparım??

  6. İsteğe bağlı parametreler geçir Nasıl yaparım??

  7. Office uygulamaları tarafından kullanıma sunulan olayları Nasıl yaparım? yakalar?
     

  8. Otomasyon kodum çok yavaş. İşleri nasıl hızlandırabilirim?

  9. -2147352573 veya 0x80030002 gibi bu büyük hata değerleri ne anlama gelir?

  10. Tür kitaplığı nedir?

  11. Otomasyon kodum Microsoft Excel 95 ile çalıştı, ancak Microsoft Excel 97 ile başarısız oluyor. Neden?

  12. Otomatikleştirdiğim uygulama programım bittikten sonra neden bellekte kalıyor?

  13. Microsoft Office uygulaması kullanıcısı olarak ne yapmak istediğimi biliyorum, ancak otomasyon kullanarak bunu program aracılığıyla nasıl yapabilirim?

  14. Ekli bir Microsoft Office uygulamasını otomatikleştirebilir miyim?

  15. Microsoft Office belgesinde belge özelliklerime Nasıl yaparım? erişin?

Sorular ve Yanıtlar

  1. Otomasyon nedir?

    Otomasyon (eski adı OLE Otomasyonu), mevcut bir programın işlevselliğinden yararlanmanızı ve kendi uygulamalarınıza dahil etmenizi sağlayan bir teknolojidir. Örneğin, Microsoft Word kullanıcılarınızın görebilmesi için Microsoft Word yazım ve dil bilgisi denetimi özelliklerini uygulamanızda kullanabilirsiniz. Hatta tüm Microsoft Excel grafik, yazdırma ve veri çözümleme araçlarını da kullanabilirsiniz. Bu teknoloji geliştirmenizi büyük ölçüde basitleştirebilir ve hızlandırabilir.
     

  2. Otomasyon'da yeniyim, daha fazla bilgi edinmek için iyi kaynakları nereden bulabilirim? David Kruglinski'nin "Inside Visual C++" (ISBN:1-57231-565- 2) bölümünün 24. bölümü genel bir genel bakış ve bazı harika örnekler sağlar. Ayrıca, Microsoft Bilgi Bankası iyi bir bilgi kaynağıdır.
    Örneğin öğrenmeyi tercih ediyorsanız lütfen Microsoft Bilgi Bankası'ndaki aşağıdaki makaleye bakın:
     

    179706 HOWTO Excel'i Otomatikleştirmek & Yeni Çalışma Kitabı Oluşturmak/Biçimlendirmek için MFC Kullanma

  3. Otomasyonu kullanmanın farklı yolları var mı?

    Otomasyonu kullanmanın üç temel yolu vardır: MFC, #import ve C/C++:
     

    • MFC ile Visual C++ ClassWizard'ı kullanarak Microsoft Office tür kitaplıklarından "sarmalayıcı sınıflar" oluşturun. Bu sınıfların yanı sıra COleVariant, COleSafeArray, COleException gibi diğer MFC sınıfları otomasyon görevlerini basitleştirir. Bu yöntem genellikle diğerleri üzerinde önerilir ve Microsoft Bilgi Bankası örneklerinin çoğu MFC kullanır.

    • Visual C++ 5.0 ile kullanıma sunulan yeni bir yönerge olan #import, belirtilen tür kitaplığından VC++ "akıllı işaretçiler" oluşturur. Çok güçlüdür, ancak genellikle Microsoft Office uygulamalarıyla kullanıldığında oluşan başvuru sayma sorunları nedeniyle önerilmez.

    • C/C++ Otomasyonu çok daha zordur, ancak bazen MFC'nin ek yükünü veya #import ile ilgili sorunları önlemek için gereklidir. Temel olarak, CoCreateInstance() gibi API'lerle ve IDispatch ve IUnknown gibi COM arabirimleriyle çalışırsınız.

    COM, C++ sınıfı çevresinde tasarlandığından, Otomasyon ile C++ arasında düz C ile karşılaştırıldığında bazı küçük farklılıklar olduğunu unutmayın.
     

  4. COM nedir?

    Otomasyon, Bileşen Nesne Modeli'ni (COM) temel alır. COM, arabirimleri temel alan standart bir yazılım mimarisidir ve kodun bağımsız nesnelere ayrılması için tasarlanmıştır. Bunu Nesne Odaklı Programlama (OOP) paradigması uzantısı olarak düşünün, ancak ayrı uygulamalar için geçerlidir. Her nesne bir dizi arabirimi kullanıma sunar ve bir nesneyle başlatma, bildirimler ve veri aktarımı gibi tüm iletişimler bu arabirimler aracılığıyla gerçekleşir.

    COM, işletim sistemiyle birlikte yüklenen dinamik bağlantı kitaplıkları (DLL' ler) tarafından sağlanan bir hizmet kümesidir. Otomasyon bu hizmetlerin çoğunu kullanır. Örneklerden biri, istemci uygulamasının çağrılarını sunucu uygulamasının arabirimlerinin üye işlevlerine paketleyen ve bunları bağımsız değişkenleriyle sunucu uygulamasına geçiren "Marshalling" hizmetidir. Sunucunun arabirimlerinin istemcinin bellek alanında kullanıma sunulduğunu gösterir; bu durum istemcinin kendi işlem alanında çalışan bir .exe olması gibi bir durum değildir. Ayrıca, marshalling sunucunun yöntemlerinden dönüş değerlerini işlem sınırları boyunca geri alır ve istemcinin çağrısının eline güvenli bir şekilde geçirir. Çeşitli COM kitaplıkları tarafından sağlanan Otomasyon için gerekli olan birçok hizmet daha vardır. Bunlar hakkında bilgi kaynakları arasında Kraig Brockschmidt'in "Inside Ole - Second Edition", ISBN 1-55615-843-2, "Inside COM" by Dale Rogerson - ISBN 1-57231-349-8 ve "Automation Programmer's Reference," ISBN 1-57231-584-9 yer alır.

  5. Bir Office uygulamasının çalışan örneğine ekleme Nasıl yaparım??

    GetActiveObject() API'sini kullanın. Otomasyon sunucuları, RegisterActiveObject() API'sini kullanarak kendilerini ROT'ye (Çalışan Nesne Tablosu) kaydeder. Otomasyon istemcileri aşağıdaki gibi kodlarla çalışan örneğe ulaşabilir:

     

          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    

    NOT: Eklemek istediğiniz Office uygulamasını çalıştıran birden çok örnek varsa, yalnızca GetActiveObject() API'sini kullanarak başlatılan ilk örneğe ekleyebilirsiniz.

    Teorik olarak, tek tek her örnek için ROT'yi yineleyebilirsiniz, ancak başka bir örnek ZATEN ROT'deyse Office uygulamaları kendilerini kaydetmez çünkü kendi adı her zaman aynıdır (yine de ayırt edilemedi). Bu, ilk örnek dışında herhangi bir örneğe ekleyebileceğiniz anlamına gelir. Ancak, Office uygulamaları belgelerini ROT'ye de kaydettiklerinden, ROT'yi belirli bir belgeyi arayarak yineleyerek, belgeye ekleyerek ve ardından Uygulama nesnesini buradan alarak diğer örneklere başarıyla ekleyebilirsiniz.
    Tek örnekli bir uygulama olduğundan PowerPoint için bunu yapmanız gerekmez; yalnızca bir örneğini çalıştırabilirsiniz.

  6. İsteğe bağlı parametreleri geçirmek Nasıl yaparım??

    Bazı yöntemlerin "isteğe bağlı" parametreleri vardır. Visual Basic'te, yöntemini çağırırken bunları rastgele atlayabilirsiniz. Ancak, Visual C++ ile çağırırken .vt alanı VT_ERROR ve .scode alanı DISP_E_PARAMNOTFOUND olan özel bir VARIANT geçirmeniz gerekir. Yani:
     

          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    

    Bu, Visual Basic'in sahne arkası için yaptığı işlemdir.

  7. Office uygulamaları tarafından kullanıma sunulan olayları Nasıl yaparım? yakalar?

    Temel olarak, yakalamak istediğiniz olay arabirimini ("havuz") uygular ve uygulamayla ("kaynak") bir danışmanlık bağlantısı ayarlarsınız.

    Genel olarak, danışmanlık bağlantısını ayarlamak için sunucunun IConnectionPointContainer'ını alır ve olay arabiriminin IID'siyle FindConnectionPoint() öğesini çağırırsınız. Bu size bir IConnectionPoint arabirimi sağlar ve geriye tek kalan olay arabiriminizin bir örneğiyle Advise() çağrısı yapmaktır. Daha sonra bu olaylar gerçekleştiğinde sunucu bu arabirim üzerinden geri çağrı yapacaktır.

  8. Otomasyon kodum çok yavaş. İşleri nasıl hızlandırabilirim?

    Otomasyon ile ilgili hız sorunlarının yaygın nedenlerinden biri verilerin tekrar tekrar okunması ve yazmasıdır. Bu, Excel Otomasyonu istemcileri için tipiktir. Ancak, çoğu kişi bu verilerin genellikle SAFEARRAY kullanılarak aynı anda yazıldığını veya okunabileceğinin farkında değildir. Daha fazla bilgi ve bilgilendirici örnekler için aşağıdaki Microsoft Bilgi Bankası makalesine bakın:

    179706 NASıL YAPıLıR: Excel'i Otomatikleştirmek ve Yeni Çalışma Kitabı
    Oluşturmak/Biçimlendirmek için MFC Kullanma Ayrıca, panonun kullanılmasının bazen performansı artırabileceğini belirtmek önemlidir. Örneğin, verilerinizi panoya kopyalayabilir ve ardından otomasyon kullanarak sunucuya yapıştırmasını söyleyebilirsiniz. Ya da tam tersi; sunucuya panoya kopyalamasını söyleyin ve uygulamanıza yapıştırın.

  9. -2147352573 veya 0x80030002 gibi bu büyük hata değerleri ne anlama gelir?

    Bu değerler HRESULTs olarak bilinir ve winerror.h dosyasında tanımlanır. İlk bit hata sonucu olup olmadığını gösterdiğinden sayılar çok büyüktür. Bu sayıları anlamlı açıklamalara çevirmek için Visual C++ ile birlikte gelen ErrLook.Exe yardımcı programını kullanabilirsiniz.

    Program aracılığıyla hatalar için bir açıklama almak istiyorsanız FormatMessage() API'sini kullanabilirsiniz.

    NOT: Visual C++ 6.0 kullanıyorsanız ve hata ayıklama izleme penceresinde bu değeri içeren bir değişkene sahipseniz, Visual C++'ın sizin için çevirmesini sağlamak için sonuna ", hr" (tırnak işaretleri olmadan) ekleyin!

  10. Tür kitaplığı nedir?

    Tür kitaplığı C/C++ üst bilgi dosyasına benzer. Bir sunucunun yayımlamış olduğu arabirimleri, yöntemleri ve özellikleri içerir. Tür kitaplığını Visual C++ ile birlikte gelen OLE/COM Nesne Görüntüleyicisi (Oleview.exe) ile görüntüleyebilirsiniz. Microsoft Office 95, 97 ve 2000 için tür kitaplığı dosya adlarının listesi aşağıdadır:



    Office Uygulama | Tür kitaplığı
    ------------------------+----------------
    Word 95 ve önceki | wb70en32.tlb
    Excel 95 ve önceki | xl5en32.olb
    Powerpoint 95 ve önceki | Powerpoint.tlb
    Access 95 ve önceki | msaccess.tlb
    Bağlayıcı 95 | binder.tlb
    Schedule+ | sp7en32.olb
    Proje | pj4en32.olb
    Team Manager | mstmgr1.olb
    Word 97 | msword8.olb
    Excel 97 | excel8.olb
    Powerpoint 97 | msppt8.olb
    Access 97 | msacc8.olb
    Bağlayıcı 97 | msbdr8.olb
    Graph 97 | graph8.olb
    Outlook 97 | msoutl8.olb
    Outlook 98 | msoutl85.olb
    Word 2000 | msword9.olb
    Excel 2000 | excel9.olb
    PowerPoint 2000 | msppt9.olb
    Access 2000 | msacc9.olb
    Outlook 2000 | msoutl9.olb
    Word 2002 | msword.olb
    Excel 2002 |
    excel.exe PowerPoint 2002 | msppt.olb
    Access 2002 | msacc.olb
    Outlook 2002 | msoutl.olb

     

  1. Otomasyon kodum Excel 95 ile çalıştı, ancak Excel 97 ile başarısız oluyor. Ne oluyor?

    Excel'in nesne modeli, sürüm 95'ten 97'ye önemli bir değişiklik yaptı. Excel 95, tüm yöntemlerini ve özelliklerini tek bir IDispatch uygulamasında uyguladı. Bu, genellikle Y nesnesinden X nesnesine yönelik yöntemleri çağırabileceğiniz anlamına geliyordu. Bu iyi bir tasarım olmadığından, Office 97'de her nesnenin kendi ayrı Idispatch uygulaması vardır. Başka bir deyişle, X nesnesinden ayrı bir Y nesnesinden yöntem veya özellik isterseniz 0x80020003, -2147352573, "Üye bulunamadı" hatasını alırsınız. Bu hatayı önlemek için, çağrı yaptığınız temel IDispatch arabiriminin anlamsal olarak doğru olduğundan emin olmanız gerekir.
     

  2. Otomatikleştirdiğim uygulama, programım tamamlandıktan sonra bellekte kalıyor. Ne oluyor?

    Büyük olasılıkla, bunun nedeni edinilmiş bir arabirimi yayınlamayı unutmuş olmanızdır ve bunu izlemeniz gerekir. Bazı genel öneriler ve aranacak şeyler şunlardır:
     

    • #import kullanıyorsanız, kendisiyle ilişkili başvuru sayma hatalarından biriyle karşılaşmış olabilirsiniz. Genellikle hatalar geçici olarak değiştirilebilir, ancak genellikle diğer Otomasyon yöntemlerinden birini kullanmak tercih edilir. tür kitaplıkları ve kullanımı oldukça karmaşık olduğundan #import Office uygulamalarıyla çok iyi çalışmaz. Ayrıca, #import kullanılırken arabirim düzeyinde com çağrılarının çoğu arka planda olduğundan bu tür başvuru sayma sorunlarını izlemek zordur.

    • IDispatch * (LPDISPATCH) döndüren Open veya New gibi herhangi bir yöntemi çağırıp çağırmadığınıza bakın ve dönüş değerini yoksayın. Kullanıyorsanız, döndürülen bu arabirimi bırakıyorsunuz demektir ve artık gerekli olmadığında serbest bırakmak için kodunuzu değiştirmeniz gerekir.

    • Sorun ortadan kalkana kadar kodunuzun bölümlerini aşamalı olarak açıklama satırı yapın, ardından sorunun nerede başladığını izlemek için geri ekleyin.

    • Kullanıcı uygulamaya "dokunduğunda" bazı uygulamaların çalışmaya devam edeceğine dikkat edin. Otomatikleştirme sırasında bu durum oluşursa, uygulama büyük olasılıkla daha sonra çalışmaya devam eder. Office uygulamalarının Application nesnesinde bu davranışı değiştirmek için okuyabileceğiniz/yazabileceğiniz bir "UserControl" özelliği vardır.

    • Ayrıca, yeterli kullanıcı arabirimi "eylemi" oluştuysa bazı uygulamalar çalışmaya devam etmeye karar verir. Uygulamadan çıkmak istiyorsanız Uygulama nesnesinde Quit() yöntemini çağırın. Çıkış çağrıldığında başvuru sayısına bakılmaksızın Word kapatılır. Bu, COM davranışı beklenmez. Ancak Excel düzgün bir şekilde kendini gizler ancak tüm bekleyen arabirimler yayınlanana kadar çalışmaya devam eder. Genel olarak, tüm bekleyen başvuruları serbest bırakmalı ve yalnızca uygulamanın çıkışını planlıyorsanız Quit() çağrısı yapmalısınız.

  3. Office uygulaması kullanıcısı olarak ne yapmak istediğimi biliyorum, ancak bunu Otomasyon aracılığıyla program aracılığıyla nasıl yapabilirim?

    İlgilendiğiniz şey, hangi nesneleri, yöntemleri ve özellikleri kullanmanız gerektiğidir. Kullanıcı olarak yapmak istediğiniz şeye bağlı olarak Word, Excel ve Powerpoint'in nesne modellerinde gezinmeyi öğrenmenin en iyi yolu Makro Kaydedicisi'ni kullanmaktır. Araçlar menüsünden Makro\'Yeni Makro Kaydet' öğesini seçin, ilgilendiğiniz görevi yürüterek Makro\'Kaydı Durdur'u seçin. Kaydı tamamladıktan sonra Araçlar menüsünden Makro\Makrolar'ı seçin, kaydettiğiniz makroyu seçin ve ardından Düzenle'ye tıklayın. Bu sizi, kaydettiğiniz görevi gerçekleştirecek oluşturulan VBA koduna götürür. Kaydedilen makronun çoğu durumda mümkün olan en iyi kod olmadığını, ancak hızlı bir örnek için çok iyi olduğunu unutmayın.

  4. Ekli bir Office uygulamasını otomatikleştirebilir miyim?

    Kesinlikle. İşin püf noktası IDispatch işaretçisini almaktır: Bu, Visual C++ Teknik Not 39'da (TN039) verilmiştir.
     

  5. Office belgesinde belge özelliklerime Nasıl yaparım? erişin?

    Belge özelliklerine Otomasyon veya doğrudan IPropertyStorage aracılığıyla erişilebilir.
     

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!

×