Ringkasan
Artikel ini menjawab pertanyaan umum mengenai otomatisasi untuk Microsoft Office dari Visual C++.
Informasi Selengkapnya
Daftar isi
-
Apa itu otomatisasi?
-
Saya baru untuk otomatisasi, di mana saya dapat menemukan sumber daya yang baik untuk mempelajari selengkapnya?
-
Apakah ada cara yang berbeda yang dapat menggunakan otomatisasi?
-
Apa itu COM?
-
Bagaimana melampirkan ke contoh menjalankan aplikasi Office?
-
Bagaimana saya melewati parameter opsional?
-
Bagaimana cara menangkap peristiwa yang terpapar oleh aplikasi Office?
-
Kode otomatisasi saya terlalu lambat. Bagaimana cara mempercepat hal?
-
Apa nilai besar galat ini, seperti-2147352573 atau 0x80030002, berarti?
-
Apa yang dimaksud dengan perpustakaan jenis?
-
Kode otomatisasi saya bekerja dengan Microsoft Excel 95, tetapi gagal dengan Microsoft Excel 97. Mengapa?
-
Mengapa tidak aplikasi saya mengotomasi tetap dalam memori selesai program saya?
-
Saya tahu apa yang ingin melakukan sebagai pengguna aplikasi Microsoft Office, tapi bagaimana ini secara sistematis menggunakan otomatisasi?
-
Saya dapat mengotomatisasi aplikasi Microsoft Office yang tertanam?
-
Bagaimana cara mengakses properti dokumen saya di Microsoft Office document?
Pertanyaan dan jawaban
-
Apa itu otomatisasi? Otomatisasi (sebelumnya OLE otomatisasi) adalah teknologi yang memungkinkan Anda untuk memanfaatkan fungsionalitas program yang sudah ada dan dimasukkan ke dalam aplikasi Anda sendiri. Misalnya, Anda dapat menggunakan Microsoft Word ejaan dan tata bahasa memeriksa kemampuan ke dalam aplikasi Anda tanpa Microsoft Word dapat dilihat oleh pengguna. Anda bahkan dapat menggunakan semua Microsoft Excel membuat bagan, pencetakan dan data alat analisis. Teknologi ini dapat sangat menyederhanakan dan mempercepat pengembangan Anda.
-
Saya baru untuk otomatisasi, di mana saya dapat menemukan sumber daya yang baik untuk mempelajari selengkapnya? Bab 24 David Kruglinski "di dalam Visual C++" (ISBN:1-57231-565 - 2) menyediakan Ikhtisar umum serta beberapa contoh besar. Selain itu, di Pangkalan Pengetahuan Microsoft adalah sumber informasi yang baik. Artikel ini sendiri adalah awal yang baik, dan Anda dapat menemukan referensi lebih spesifik dalam artikel Basis Pengetahuan Microsoft:
mencari sumber daya untuk belajar Otomasi OLEJika Anda lebih suka belajar dengan contoh, baca artikel berikut di Pangkalan Pengetahuan Microsoft:
HOWTO gunakan MFC untuk mengotomatisasi Excel & membuat/Format buku kerja baru
-
Apakah ada cara yang berbeda yang dapat menggunakan otomatisasi? Ada tiga cara dasar yang dapat Anda gunakan otomatisasi: MFC, #import, dan C C++:
-
Dengan MFC, menggunakan Visual C++ ClassWizard untuk menghasilkan "pembungkus kelas" dari perpustakaan jenis Microsoft Office. Kelas ini, serta kelas MFC lainnya, seperti COleVariant, COleSafeArray, COleException, menyederhanakan tugas otomatisasi. Metode ini biasanya disarankan atas yang lain, dan banyak contoh Pangkalan Pengetahuan Microsoft menggunakan MFC.
-
#import, petunjuk baru yang menjadi tersedia dengan Visual C++ 5.0 menciptakan VC ++ "smart pointer" dari perpustakaan jenis tertentu. Kuat, tetapi sering tidak disarankan karena ada referensi - menghitung masalah yang biasanya terjadi ketika digunakan dengan aplikasi Microsoft Office.
-
C C++ otomatisasi adalah banyak lebih sulit, tetapi kadang-kadang diperlukan untuk menghindari beban dengan MFC, atau masalah dengan #import. Pada dasarnya, Anda bekerja dengan api tersebut sebagai fungsi CoCreateInstance, dan COM antarmuka seperti IDispatch dan IUnknown.
Sangat penting untuk dicatat bahwa terdapat beberapa sedikit perbedaan antara otomatisasi dari C++ dibandingkan polos C, karena COM dirancang di kelas C++. Untuk informasi selengkapnya, baca artikel berikut di Pangkalan Pengetahuan Microsoft untuk contoh C:
HOWTO: menggunakan Otomasi OLE dari aplikasi C
-
-
Apa itu COM? Otomatisasi didasarkan pada Model objek komponen (COM). COM adalah perangkat lunak standar arsitektur didasarkan pada antarmuka, dan dirancang untuk memiliki kode dipisahkan ke objek mandiri. Menganggapnya sebagai ekstensi paradigma objek berorientasi pemrograman (pemrograman berorientasi objek), namun dapat diterapkan untuk memisahkan aplikasi. Setiap objek memperlihatkan serangkaian antarmuka, dan semua komunikasi ke objek, seperti inisialisasi, pemberitahuan, dan data transfer, terjadi melalui antarmuka ini. COM juga adalah serangkaian layanan yang disediakan oleh pustaka tautan dinamis (dll) yang diinstal dengan sistem operasi. Otomatisasi menggunakan banyak layanan tersebut. Salah satu contoh adalah layanan "Menyusun", yang paket aplikasi klien panggilan ke fungsi antarmuka aplikasi server anggota dan melewati mereka, dengan argumen mereka, untuk aplikasi server. Membuatnya terlihat antarmuka server yang terkena di ruang memori klien yang tidak terjadi apabila klien .exe dijalankan dalam ruang proses. Luarannya juga mendapatkan kembali nilai-nilai dari server metode kembali seluruh proses batas dan aman tangan panggilan klien. Ada banyak layanan lain yang penting untuk otomatisasi yang disediakan oleh Perpustakaan COM berbagai. Sumber informasi tentang tersebut termasuk "Di dalam Ole – edisi kedua" oleh Kraig Brockschmidt, ISBN 1-55615-843-2, "Di dalam COM" oleh Dale Rogerson - ISBN 1-57231-349-8, dan "Otomatisasi Programmer referensi," ISBN 1-57231-584-9.
-
Bagaimana melampirkan ke contoh menjalankan aplikasi Office? Gunakan GetActiveObject() API. Server otomatisasi mendaftarkan diri di ROT (menjalankan tabel objek), melalui RegisterActiveObject() API. Klien otomatisasi bisa mendapatkan pada contoh 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 banyak contoh menjalankan aplikasi Office yang ingin Anda pasang, Anda hanya dapat melampirkan ke contoh pertama yang diluncurkan menggunakan GetActiveObject() API. Secara teoretis, Anda dapat mengulang ROT untuk setiap hal yang masing-masing, namun aplikasi Office tidak mendaftarkan diri jika item lainnya sedang MEMBUSUK karena moniker sendiri tidak selalu sama (itu tidak dapat dibedakan tetap). Ini berarti bahwa Anda tidak dapat melampirkan contoh apa pun kecuali untuk yang pertama. Namun, karena aplikasi Office juga mendaftar dokumen di ROT, Anda dapat berhasil melampirkan item lain dengan iterasi ROT mencari dokumen khusus, melampirkan, kemudian mendapatkan objek aplikasi dari itu. Ada beberapa kode di artikel Pangkalan Pengetahuan Microsoft berikut ini untuk iterasi ROT dan Cari nama dokumen:
HOWTO: Dapatkan IDispatch Excel atau dokumen Word dari OCXAnda tidak perlu melakukan hal ini untuk PowerPoint, karena aplikasi contoh tunggal; Anda hanya dapat memiliki satu contoh dari berjalan.
-
Bagaimana saya melewati parameter opsional? Beberapa metode yang memiliki parameter "opsional". Dalam Visual Basic, Anda dapat begitu saja mengabaikan mereka saat memanggil metode. Namun, ketika menelepon dengan Visual C++ Anda harus menyampaikan varian khusus yang bidang .vt adalah VT_ERROR, dan kolom .scode adalah DISP_E_PARAMNOTFOUND. Yaitu:
// VARIANT used in place of optional-parameters. VARIANT varOpt; varOpt.vt = VT_ERROR; varOpt.scode = DISP_E_PARAMNOTFOUND;
Ini adalah benar-benar apa yang dilakukan Visual Basic balik layar.
-
Bagaimana cara menangkap peristiwa yang terpapar oleh aplikasi Office? Pada dasarnya Anda menerapkan antarmuka peristiwa yang ingin menangkap ("sink"), dan penataan sambungan penasihat dengan aplikasi ("sumber"). Artikel berikut ini memberikan contoh langkah demi langkah untuk Microsoft Word:
HOWTO: menangkap peristiwa aplikasi Microsoft Word97 menggunakan VC ++Secara umum, setup sambungan penasihat, Anda mendapatkan server IConnectionPointContainer dan panggilan FindConnectionPoint() dengan riset antarmuka peristiwa. Ini memberikan antarmuka IConnectionPoint dan semua yang tersisa adalah untuk memanggil Advise() dengan contoh antarmuka peristiwa. Server akan kemudian panggilan kembali melalui antarmuka ini ketika peristiwa ini terjadi.
-
Kode otomatisasi saya terlalu lambat. Bagaimana cara mempercepat hal? Penyebab umum kecepatan masalah dengan otomatisasi adalah dengan membaca dan menulis data yang berulang-ulang. Ini khas untuk klien Otomasi Excel. Namun, sebagian besar orang tidak menyadari bahwa data ini biasanya dapat ditulis atau membaca sekaligus menggunakan SAFEARRAY. Lihat artikel Basis Pengetahuan Microsoft berikut untuk informasi lebih lanjut dan informatif contoh:
HOWTO: menggunakan MFC untuk mengotomatisasi Excel dan mengisi kisaran dengan Array
HOWTO: menggunakan MFC untuk mengotomatisasi Excel & mendapatkan Array dari kisaran
HOWTO: menggunakan MFC untuk mengotomatisasi Excel dan membuat/Format buku kerja baruSelain itu, sangat penting untuk menunjukkan bahwa menggunakan clipboard kadang-kadang dapat meningkatkan kinerja. Misalnya, Anda dapat menyalin data ke clipboard, kemudian gunakan otomatisasi untuk memberitahu server untuk menempel. Atau sebaliknya; memberitahu server untuk salin ke clipboard, dan tempelkan ke aplikasi Anda.
-
Apakah nilai besar galat ini, seperti-2147352573, atau 0x80030002 berarti? Nilai ini disebut sebagai HRESULTs dan ditetapkan di winerror.h. Angka sangat besar karena bit pertama menunjukkan apakah galat hasil. Anda dapat menggunakan utilitas ErrLook.Exe yang dilengkapi dengan Visual C++ menerjemahkan angka-angka ini ke Deskripsi bermakna. Jika Anda ingin secara sistematis mendapatkan keterangan untuk galat, Anda dapat menggunakan FormatMessage() API. Lihat artikel Basis Pengetahuan Microsoft berikut untuk informasi lebih lanjut dan contoh penggunaan FormatMessage():
INFO: menerjemahkan kesalahan Otomasi untuk VB VBA
CONTOH : Decode32 dan Decode16 OLE galat kode Decoder alatCatatan: jika Anda menggunakan Visual C++ 6.0 dan variabel yang berisi nilai ini di jendela watch debug, tambahkan ", hr" (tanpa tanda kutip) untuk memiliki Visual C++ menerjemahkan untuk Anda!
-
Apa yang dimaksud dengan perpustakaan jenis? Perpustakaan jenis mirip dengan berkas header C C++. Berisi antarmuka, metode dan properti yang server penerbitan. Anda dapat melihat Perpustakaan jenis dengan penampil Objek OLE COM (Oleview.exe) yang dilengkapi dengan Visual C++. Berikut adalah daftar nama file Perpustakaan jenis 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
-
Kode otomatisasi saya bekerja dengan Excel 95, tetapi gagal dengan Excel 97. Apa yang terjadi? Model objek untuk Excel membuat perubahan yang signifikan dari versi 95 97. Excel 95 diimplementasikan semua metode dan properti pelaksanaan IDispatch tunggal. Ini berarti bahwa sering Anda dapat memanggil metode dimaksudkan untuk objek X, dari objek Y. Ini bukanlah desain yang baik, sehingga di Office 97, setiap objek sendiri terpisah Idispatch implementasi. Ini berarti bahwa jika Anda meminta metode atau properti dari objek X dari objek terpisah Y, Anda mendapatkan galat 0x80020003,-2147352573, "anggota tidak ditemukan." Untuk menghindari galat ini, Anda harus memastikan bahwa antarmuka IDispatch dasar Anda membuat panggilan dari satu semantik yang benar. Lihat artikel Basis Pengetahuan Microsoft berikut untuk informasi lebih lanjut:
HOWTO: pemecahan masalah "Anggota tidak ditemukan", 0x80020003 galat
-
Aplikasi saya mengotomasi tetap di memori setelah saya program selesai. Apa yang terjadi? Tentu saja, hal ini karena Anda lupa untuk melepaskan antarmuka diperoleh dan Anda harus melacak itu. Berikut adalah beberapa saran umum, dan hal-hal untuk mencari:
-
Jika Anda menggunakan #import, akan sangat mungkin Anda dapat menjalankan ke salah satu bug menghitung referensi yang berhubungan dengannya. Sering kali bug dapat bekerja di sekitar, tetapi biasanya itu lebih disukai untuk menggunakan salah satu metode otomatisasi lainnya. #import tidak bekerja dengan baik dengan aplikasi Office, karena Perpustakaan jenis dan penggunaan yang cukup kompleks. Selain itu, seperti referensi menghitung masalah sulit dilacak karena banyak tingkat interface COM panggilan balik layar dengan menggunakan #import.
-
Periksa untuk melihat jika Anda menelepon setiap metode, seperti membuka, atau baru, yang menghasilkan IDispatch * (LPDISPATCH), dan mengabaikan nilai kembali. Jika Anda, maka Anda meninggalkan antarmuka ini kembali dan harus mengubah kode Anda sehingga Anda mengeluarkan ketika tidak diperlukan.
-
Secara bertahap mengomentari bagian kode sampai masalah hilang, kemudian tambahkan kembali bijaksana untuk melacak mana masalah dimulai.
-
Perhatikan bahwa beberapa aplikasi akan tetap berjalan jika pengguna telah "menyentuh" aplikasi. Apabila ini terjadi saat Anda sedang mengotomatisasi, maka aplikasi mungkin akan tetap menjalankan sesudahnya. Aplikasi Office memiliki properti "UserControl" pada objek aplikasi yang Anda dapat baca/tulis untuk mengubah perilaku ini.
-
Selain itu, beberapa aplikasi akan memutuskan untuk tetap berjalan jika cukup-antarmuka pengguna "tindakan" telah terjadi. Jika Anda bermaksud untuk keluar dari aplikasi, kemudian memanggil metode Quit() pada objek aplikasi. Word akan mematikan terlepas dari jumlah referensi yang ketika Quit disebut. Ini bukan COM perilaku yang diharapkan. Excel, akan benar hanya menyembunyikan sendiri namun tetap berjalan sampai semua antarmuka beredar dirilis. Secara umum, Anda harus melepaskan semua referensi yang biasa, dan hanya panggilan Quit() jika Anda bermaksud untuk keluar dari aplikasi.
-
-
Saya tahu apa yang ingin melakukan sebagai pengguna aplikasi Office, tapi bagaimana ini secara sistematis otomatisasi? Apa yang Anda minati adalah objek, metode, dan properti apa yang Anda butuhkan untuk menggunakan. Cara terbaik untuk mempelajari cara menavigasi model objek Word, Excel, dan Powerpoint, berdasarkan apa yang ingin Anda lakukan sebagai pengguna, adalah dengan menggunakan perekam makro. Hanya memilih Macro\ 'Rekor baru makro' dari menu Alat, menjalankan tugas Anda tertarik, kemudian pilih Macro\ 'Menghentikan perekaman.' Setelah Anda selesai merekam, pilih Macro\Macros dari menu Alat, pilih makro yang direkam, kemudian klik Edit. Ini akan membawa Anda ke kode VBA yang akan melakukan tugas yang direkam. Perlu diingat makro rekaman tidak akan kode yang terbaik dalam kebanyakan kasus, tetapi apakah itu baik untuk contoh cepat.
-
Saya dapat mengotomatisasi aplikasi Office yang tertanam? Tentu saja. Trik mendapatkan IDispatch pointer: ini diberikan Visual C++ teknis catatan 39 (TN039). Lihat artikel Basis Pengetahuan Microsoft berikut ini contoh selangkah demi selangkah:
HOWTO: menanamkan dan mengotomatisasi Microsoft Excel Worksheet dengan MFC
-
Bagaimana cara mengakses properti dokumen saya di dokumen Office? Properti dokumen dapat diakses melalui otomatisasi, atau langsung melalui IPropertyStorage. Artikel Pangkalan Pengetahuan Microsoft berikut ini menunjukkan masing-masing metode:
HOWTO: menggunakan otomatisasi untuk mengambil kembali properti dokumen internal
HOWTO: membaca properti dokumen gabungan secara langsung dengan VC ++