Otomatisasi Office menggunakan Visual C++

Ringkasan

Artikel ini menjawab pertanyaan umum tentang otomatisasi ke Microsoft Office dari Visual C++.

Informasi Selengkapnya

Daftar isi

  1. Apa itu otomatisasi?

  2. Saya baru menggunakan otomatisasi, di mana saya bisa menemukan sumber daya yang baik untuk mempelajari selengkapnya?

  3. Apakah ada cara lain yang bisa saya gunakan untuk otomatisasi?

  4. Apa itu COM?

  5. Bagaimana cara melampirkan ke contoh menjalankan aplikasi Office?

  6. Bagaimana cara melewati parameter opsional?

  7. Bagaimana cara menangkap kejadian yang diekspos oleh aplikasi Office?

  8. Kode otomatisasi saya terlalu lambat. Bagaimana cara mempercepat?

  9. Apa artinya nilai kesalahan besar ini, seperti-2147352573 atau 0x80030002, artinya?

  10. Apa itu pustaka tipe?

  11. Kode otomatisasi saya bekerja dengan Microsoft Excel 95, tetapi gagal dengan Microsoft Excel 97. Mengapa?

  12. Mengapa aplikasi yang saya otomatisasi tetap berada di memori setelah program saya selesai?

  13. Saya tahu apa yang ingin saya lakukan sebagai pengguna aplikasi Microsoft Office, tapi bagaimana cara melakukannya secara programatik menggunakan otomatisasi?

  14. Bisakah saya mengotomatisasi aplikasi Microsoft Office yang disematkan?

  15. Bagaimana cara mengakses properti dokumen saya di dokumen Microsoft Office?

Pertanyaan dan jawaban

  1. Apa itu otomatisasi? Otomatisasi (sebelumnya OLE Automation) adalah teknologi yang memungkinkan Anda memanfaatkan fungsionalitas program yang sudah ada dan menggabungkannya ke dalam aplikasi Anda sendiri. Misalnya, Anda bisa menggunakan kapabilitas ejaan dan tata bahasa Microsoft Word untuk aplikasi Anda tanpa Microsoft Word yang dapat dilihat oleh pengguna Anda. Anda bahkan dapat menggunakan semua alat analisis data, pencetakan, dan data Microsoft Excel. Teknologi ini bisa sangat menyederhanakan dan mempercepat pengembangan Anda.

  2. Saya baru menggunakan otomatisasi, di mana saya bisa menemukan sumber daya yang baik untuk mempelajari selengkapnya? Bab 24 dari David Kruglinski "Inside Visual C++" (ISBN: 1-57231-565-2) memasok gambaran umum serta beberapa contoh hebat. Selain itu, basis pengetahuan Microsoft adalah sumber informasi yang baik. Artikel ini sendiri adalah permulaan yang baik, dan Anda bisa menemukan referensi yang lebih spesifik dalam artikel berikut ini di Basis Pengetahuan Microsoft:

    152023 Menemukan sumber daya untuk mempelajari Otomasi OLE Jika Anda lebih suka mempelajari dengan contoh, silakan lihat artikel berikut ini di Basis Pengetahuan Microsoft:

    179706 HOWTO menggunakan MFC untuk mengotomatisasi Excel & membuat/memformat buku kerja baru

  3. Apakah ada cara lain yang bisa saya gunakan untuk otomatisasi? Ada tiga cara dasar yang bisa Anda gunakan untuk otomatisasi: MFC, #import, dan C/C++:

    • Dengan MFC, gunakan ClassWizard Visual C++ untuk menghasilkan "kelas pembungkus" dari pustaka tipe Microsoft Office. Kelas ini, serta kelas MFC lainnya, seperti COleVariant, COleSafeArray, COleException, menyederhanakan tugas otomatisasi. Metode ini biasanya direkomendasikan untuk yang lainnya, dan sebagian besar contoh Basis Pengetahuan Microsoft menggunakan MFC.

    • #import, perintah baru yang menjadi tersedia dengan Visual C++ 5,0, membuat VC + + "Smart pointer" dari pustaka tipe tertentu. Sangat ampuh, tapi sering tidak direkomendasikan karena masalah penghitungan referensi yang biasanya terjadi ketika digunakan dengan aplikasi Microsoft Office.

    • Otomatisasi C/C++ jauh lebih sulit, tapi terkadang diperlukan untuk menghindari overhead dengan MFC, atau masalah dengan #import. Pada dasarnya, Anda bekerja dengan api tersebut sebagai Kocreateinstance (), dan antarmuka COM seperti IDispatch dan IUnknown.

    Penting untuk dicatat bahwa ada sedikit perbedaan antara otomatisasi dari C++ dibandingkan dengan Plain C, karena COM telah didesain di sekitar kelas C++. Untuk informasi selengkapnya, lihat artikel berikut ini di Pangkalan Pengetahuan Microsoft untuk contoh C:

    181473 HOWTO: menggunakan Otomasi OLE dari aplikasi C

  4. Apa itu COM? Otomatisasi didasarkan pada model objek komponen (COM). COM adalah arsitektur perangkat lunak standar berdasarkan antarmuka, dan dirancang agar kode dipisahkan menjadi objek mandiri. Anggap sebagai ekstensi paradigma pemrograman berorientasi objek (OOP), tapi berlaku untuk aplikasi terpisah. Setiap objek memperlihatkan sekumpulan antarmuka, dan semua komunikasi ke suatu objek, seperti inisialisasi, pemberitahuan, dan transfer data, terjadi melalui antarmuka ini. COM juga merupakan sekumpulan layanan yang disediakan oleh pustaka tautan dinamis (DLLs) yang diinstal dengan sistem operasi. Otomatisasi menggunakan banyak layanan tersebut. Salah satu contohnya adalah layanan "menyusun", yang mengemas aplikasi klien panggilan ke fungsi anggota antarmuka aplikasi server dan meneruskan yang, dengan argumennya, ke aplikasi server. Ini membuatnya terlihat bahwa antarmuka server terekspos dalam ruang memori klien, yang bukan merupakan kasus saat klien. exe berjalan dalam ruang prosesnya sendiri. Penyusunan juga mendapatkan nilai yang dikembalikan dari metode server kembali melintasi batas proses dan dengan aman ke tangan panggilan klien. Ada banyak layanan lain yang penting untuk otomatisasi yang disediakan oleh berbagai pustaka COM. Sumber informasi tentang itu termasuk "Inside Ole-Second Edition" oleh kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" oleh Dale Rogerson-ISBN 1-57231-349-8, dan "referensi programmer otomatisasi," ISBN 1-57231-584-9.

  5. Bagaimana cara melampirkan ke contoh menjalankan aplikasi Office? Gunakan GetActiveObject () API. Server otomatisasi mendaftarkan diri dalam ROT (menjalankan tabel objek), melalui RegisterActiveObject () API. Klien otomatisasi bisa masuk ke instance yang sedang berjalan dengan kode seperti:

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

    Catatan: jika ada beberapa contoh yang menjalankan aplikasi Office yang ingin Anda lampirkan, Anda hanya akan bisa melampirkan ke instans pertama yang diluncurkan menggunakan GetActiveObject () api. Secara teoritis, Anda bisa mengulangi ROT untuk setiap contoh individu, tapi aplikasi Office tidak mendaftarkan diri jika instance lainnya sudah dalam ROT karena moniker untuk dirinya sendiri selalu sama (tidak dapat dibedakan). Ini berarti Anda tidak bisa melampirkan ke contoh apa pun kecuali untuk yang pertama. Namun, karena aplikasi Office juga mendaftarkan dokumen mereka dalam ROT, Anda bisa dengan sukses dilampirkan ke instance lain dengan mengulangi ROT mencari dokumen tertentu, melampirkannya, lalu mendapatkan objek aplikasinya darinya. Ada beberapa kode di artikel Basis Pengetahuan Microsoft berikut ini untuk iterasi ROT dan mencari nama dokumen:

    190985 HOWTO: mendapatkan IDispatch dari dokumen Excel atau Word dari OCX Anda tidak perlu melakukan ini untuk PowerPoint, karena merupakan aplikasi contoh tunggal; Anda hanya bisa memiliki satu contoh yang berjalan.

  6. Bagaimana cara melewati parameter opsional? Beberapa metode memiliki parameter "opsional". Dalam Visual Basic, Anda bisa secara santai menghilangkan mereka saat memanggil metode. Namun, saat melakukan panggilan dengan Visual C++ Anda harus melewati varian khusus yang bidang. VT-nya adalah VT_ERROR, dan bidang. scode DISP_E_PARAMNOTFOUND. Yaitu:

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

    Inilah yang dilakukan Visual Basic di balik layar.

  7. Bagaimana cara menangkap kejadian yang diekspos oleh aplikasi Office? Pada dasarnya Anda menerapkan antarmuka acara yang ingin Anda tangkap ("Sink"), dan menyiapkan koneksi penasihat dengan aplikasi ("sumber"). Artikel berikut ini memberi Anda contoh langkah demi langkah untuk Microsoft Word:

    183599 HOWTO: Catch kejadian aplikasi Microsoft Word97 menggunakan VC + + Secara umum, untuk menyetel koneksi penasihat, Anda mendapatkan IConnectionPointContainer server dan memanggil FindConnectionPoint () dengan IID dari antarmuka acara. Ini memberi Anda antarmuka IConnectionPoint dan semua yang tersisa adalah untuk memanggil saran () dengan contoh antarmuka acara Anda. Server akan memanggil kembali antarmuka ini saat kejadian tersebut terjadi.

  8. Kode otomatisasi saya terlalu lambat. Bagaimana cara mempercepat? Penyebab umum masalah kecepatan dengan otomatisasi adalah dengan pembacaan berulang dan penulisan data. Ini biasanya untuk klien Otomasi Excel. Namun, kebanyakan orang tidak menyadari bahwa data ini biasanya dapat ditulis atau dibaca sekaligus menggunakan SAFEARRAY. Lihat artikel Pangkalan Pengetahuan Microsoft berikut ini untuk informasi selengkapnya dan contoh informatif:

    186120 HOWTO: Gunakan MFC untuk mengotomatisasi Excel dan mengisi rentang dengan array

    186122 HOWTO: Gunakan MFC untuk mengotomatisasi Excel & mendapatkan larik dari rentang

    179706 HOWTO: Gunakan MFC untuk mengotomatisasi Excel dan membuat/memformat buku kerja baru Selain itu, penting untuk menunjukkan bahwa menggunakan clipboard terkadang dapat meningkatkan kinerja. Misalnya, Anda dapat menyalin data ke clipboard, lalu menggunakan otomatisasi untuk memberi tahu server untuk menempelkan. Atau sebaliknya; Kirim server ke salin ke clipboard, dan tempelkan ke aplikasi Anda.

  9. Apa yang dimaksud nilai kesalahan besar ini, seperti-2147352573, atau 0x80030002? Nilai ini dikenal sebagai HRESULTs dan ditentukan dalam winerror. h. Angka sangat besar karena bit pertama mewakili Apakah itu adalah hasil kesalahan. Anda dapat menggunakan utilitas ErrLook. exe yang disertakan dengan Visual C++ untuk menerjemahkan angka ini ke dalam deskripsi yang bermakna. Jika Anda ingin mendapatkan Deskripsi kesalahan secara terprogram, Anda bisa menggunakan FormatMessage () API. Lihat artikel Pangkalan Pengetahuan Microsoft berikut ini untuk informasi selengkapnya dan contoh penggunaan FormatMessage ():

    186063 INFO: menerjemahkan kesalahan otomatisasi untuk VB/VBA

    122957 SAMPEL: alat decoder kode kesalahan Decode32 dan Decode16 OLECatatan: jika Anda menggunakan Visual c++ 6,0 dan memiliki variabel yang berisi nilai ini di jendela debug debug, tambahkan ", HR" (tanpa tanda kutip) untuk memuat visual c++, Terjemahkan untuk Anda!

  10. Apa itu pustaka tipe? Pustaka tipe mirip dengan file header C/C++. Memuat antarmuka, metode, dan properti yang dipublikasi server. Anda bisa menampilkan pustaka tipe dengan penampil Objek OLE/COM (Oleview. exe) yang disertakan dengan Visual C++. Berikut ini adalah daftar nama file pustaka tipe untuk Microsoft Office 95, 97, dan 2000: Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 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. Kode otomatisasi saya bekerja dengan Excel 95, tetapi gagal dengan Excel 97. Apa yang terjadi? Model objek untuk Excel membuat perubahan signifikan dari versi 95 ke 97. Excel 95 menerapkan semua metodenya dan propertinya dalam satu implementasi IDispatch. Ini berarti sering kali Anda dapat memanggil metode yang dimaksudkan untuk objek X, dari objek Y. Ini bukan desain yang bagus, jadi di Office 97, setiap objek memiliki implementasi Idispatch yang terpisah. Ini berarti bahwa jika Anda meminta metode atau properti dari objek X dari Y objek terpisah, Anda mendapatkan kesalahan 0x80020003,-2147352573, "anggota tidak ditemukan." Untuk menghindari kesalahan ini, Anda perlu memastikan bahwa antarmuka IDispatch yang mendasari Anda melakukan panggilan adalah yang benar. Lihat artikel Pangkalan Pengetahuan Microsoft berikut ini untuk informasi selengkapnya:

    172108 HOWTO: pemecahan masalah "anggota tidak ditemukan", 0x80020003 kesalahan

  2. Aplikasi yang saya otomatisasi tetap berada di memori setelah program saya selesai. Apa yang terjadi? Kemungkinan besar, ini karena Anda lupa untuk melepaskan antarmuka yang diperoleh dan Anda perlu melacaknya. Berikut adalah beberapa saran umum, dan hal-hal untuk dicari:

    • Jika Anda menggunakan #import, sangat mungkin Anda bisa masuk ke salah satu bug penghitungan referensi yang terkait dengannya. Sering kali bug bisa dikerjakan, tapi biasanya lebih disukai untuk menggunakan salah satu metode otomatisasi lainnya. #import tidak berfungsi sangat baik dengan aplikasi Office, karena tipe pustaka dan penggunaannya cukup kompleks. Selain itu, masalah penghitungan referensi tersebut sulit dilacak karena banyak panggilan COM tingkat antarmuka yang ada di balik layar saat menggunakan #import.

    • Periksa untuk melihat apakah Anda memanggil metode apa pun, seperti buka, atau baru, yang mengembalikan IDispatch * (LPDISPATCH), dan mengabaikan nilai yang dikembalikan. Jika Anda, maka Anda meninggalkan antarmuka yang dikembalikan ini dan perlu mengubah kode Anda sehingga Anda melepaskannya ketika tidak lagi diperlukan.

    • Secara bertahap Komentari bagian kode Anda hingga masalah menghilang, lalu tambahkan dengan bijaksana untuk melacak di mana masalah dimulai.

    • Perhatikan bahwa beberapa aplikasi akan tetap berjalan jika pengguna telah "menyentuh" aplikasi. Jika hal ini terjadi saat Anda sedang mengotomatisasi, aplikasi mungkin akan tetap berjalan sesudahnya. Aplikasi Office memiliki properti "UserControl" pada objek aplikasi yang bisa Anda baca/tulis untuk mengubah perilaku ini.

    • Selain itu, beberapa aplikasi akan memutuskan untuk tetap berjalan jika cukup "tindakan" antarmuka pengguna telah terjadi. Jika Anda bermaksud keluar dari aplikasi untuk keluar, maka Panggil metode Quit () pada objek aplikasi. Word akan mati terlepas dari jumlah referensi saat keluar disebut. Perilaku ini tidak diharapkan. Excel, bagaimanapun, akan hanya menyembunyikan dirinya sendiri tapi tetap berjalan sampai semua antarmuka yang luar biasa dilepaskan. Secara umum, Anda harus melepaskan semua referensi yang menonjol, dan hanya panggilan keluar () jika Anda bermaksud aplikasi berhenti.

  3. Saya tahu apa yang ingin saya lakukan sebagai pengguna aplikasi Office, tapi bagaimana cara melakukannya secara programatik melalui otomatisasi? Apa yang Anda minati adalah objek, metode, dan properti apa yang perlu Anda gunakan. Cara terbaik untuk mempelajari cara menavigasi model objek dari Word, Excel, dan PowerPoint, berdasarkan apa yang ingin Anda lakukan sebagai pengguna, adalah menggunakan perekam makro. Cukup pilih makro \ ' Rekam makro baru ' dari menu Alat, jalankan tugas yang Anda minati, lalu pilih makro \ ' Hentikan perekaman. ' Setelah selesai merekam, pilih Macro\Macros dari menu Alat, pilih makro yang Anda Rekam, lalu klik Edit. Ini akan membawa Anda ke kode VBA yang akan menyelesaikan tugas yang Anda Rekam. Ingatlah bahwa makro yang direkam tidak akan menjadi kode yang paling mungkin dalam kebanyakan kasus, tapi sangat baik untuk contoh cepat.

  4. Bisakah saya mengotomatisasi aplikasi Office yang disematkan? Benar. Caranya adalah mendapatkan penunjuk IDispatch: ini diberikan di Visual C++ Technical Note 39 (TN039). Lihat artikel Pangkalan Pengetahuan Microsoft berikut ini untuk contoh langkah-demi-langkah:

    184663 HOWTO: menyematkan dan mengotomatisasi lembar kerja Microsoft Excel dengan MFC

  5. Bagaimana cara mengakses properti dokumen saya di dokumen Office? Properti dokumen dapat diakses melalui otomatisasi, atau langsung melalui IPropertyStorage. Artikel Basis Pengetahuan Microsoft berikut ini memperlihatkan setiap metode:

    179494 HOWTO: Gunakan otomatisasi untuk mengambil properti dokumen bawaan

    186898 HOWTO: membaca properti dokumen majemuk secara langsung dengan VC + +

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Terima kasih atas umpan balik Anda!

Terima kasih atas umpan balik Anda! Sepertinya menghubungkan Anda ke salah satu agen dukungan Office kami akan sangat membantu.

×