Rumah / Internet / Tidak dapat membuat objek dengan wadah activex. Buat wadah untuk kontrol ActiveX. Fungsi Kontainer Dasar

Tidak dapat membuat objek dengan wadah activex. Buat wadah untuk kontrol ActiveX. Fungsi Kontainer Dasar

Sistem dan tersedia semua terkait. Kesalahan ini memiliki penyebab dan solusi berikut:

    Kelas tidak terdaftar. Misalnya, tidak ada kelas yang disebutkan di registri sistem, atau kelas disebutkan tetapi menunjuk ke file dengan tipe yang salah, atau ke file yang tidak dapat ditemukan. Jika memungkinkan, jalankan aplikasi objek. Jika informasi registri salah atau kedaluwarsa, aplikasi akan memeriksa registri dan memperbaiki informasi tersebut. Jika menjalankan aplikasi tidak menyelesaikan masalah, jalankan kembali penginstal aplikasi;

    Tidak bisa menggunakan DLL Yang dibutuhkan oleh objek karena tidak ditemukan atau ditemukan rusak. Pastikan semua DLL terkait tersedia. Misalnya, Objek Akses Data (DAO) memerlukan dukungan untuk DLL yang bervariasi menurut platform. Jika ini adalah penyebab kesalahan, Anda perlu menjalankan ulang penginstal untuk item tersebut;

    Objek tersedia di mesin, tetapi dilisensikan, dan tidak dapat memeriksa apakah lisensi yang diperlukan untuk membuat instance objek tersedia.

    Beberapa objek hanya dapat dipakai setelah komponen menemukan kunci lisensi A yang mengonfirmasi bahwa objek ini terdaftar untuk instantiasi pada komputer ini. Jika ada referensi ke objek di set dengan benar atau kunci yang benar disediakan secara otomatis.

    Jika upaya untuk membuat instance adalah hasil dari pemanggilan fungsi BuatObjek atau DapatkanObjek, objek harus menemukan kuncinya. Dalam hal ini, ia dapat mencari registri sistem atau mencari berkas khusus, yang dibuat selama penginstalan (misalnya, dengan ekstensi .LIC). Jika kunci tidak dapat ditemukan, objek tidak dapat dipakai. Jika pengguna akhir salah mengonfigurasi aplikasi objek, dihapus secara permanen file yang diinginkan atau mengubah registri sistem, objek tidak akan dapat menemukan kuncinya. Jika kunci tidak dapat ditemukan, objek tidak dapat dipakai. Dalam hal ini, instantiasi mungkin bekerja pada sistem pengembang, tetapi tidak pada sistem pengguna. Pengguna harus menginstal ulang objek berlisensi;

    Anda mencoba menggunakan fungsi get object DapatkanObjek untuk mendapatkan referensi ke kelas yang dibuat dengan Visual Basic. DapatkanObjek tidak dapat digunakan untuk mendapatkan referensi ke kelas yang dibuat dengan Visual Basic;

    Akses ke objek secara eksplisit ditolak. Misalnya, Anda mencoba mengakses objek data yang sedang digunakan dan dikunci untuk mencegah kebuntuan. Dalam hal ini, Anda mungkin dapat mengakses objek di lain waktu.

Untuk mendapatkan informasi tambahan pilih item yang ingin Anda tanyakan dan tekan F1 (Windows) atau HELP (Macintosh).

Alexander Kostarev
Programmer departemen teknologi R-Style Software Lab.

Membuat kontrol ActiveX secara luas tercakup dalam literatur khusus. Namun, ini membahas teknik untuk menulis wadah ActiveX jauh lebih jarang, sebagian besar hanya sebagai bagian dari interaksinya dengan objek ActiveX. Bahkan lebih sedikit publikasi dikhususkan untuk prosedur pengembangan wadah yang mendukung antarmuka pemrograman (API) mereka sendiri, yang memungkinkan bekerja dengannya dan objek yang dikandungnya dari aplikasi lain atau bahasa skrip. Contoh wadah tersebut adalah produk perangkat lunak seperti Microsoft Visual Basic, Borland Delphi, dll.

Namun demikian, sejumlah tugas tidak dapat diselesaikan berdasarkan wadah yang ada - ini memerlukan wadah kontrol khusus. Salah satu tantangan tersebut adalah membuat aplikasi yang dapat diperluas yang memungkinkan Anda mengotomatiskan operasi umum yang tidak dapat diperkirakan selama pengembangan. Otomatisasi mengharuskan aplikasi mengekspos objeknya secara eksternal dan diintegrasikan dengan alat pengembangan ekstensi. Membangun antarmuka pengguna dalam banyak kasus didasarkan pada penyisipan berbagai kontrol ke dalam formulir - wadah objek ActiveX. Demikian ciptaan alat membutuhkan pembuatan wadah ActiveX.

Kami akan mempertimbangkan beberapa masalah yang muncul saat memperkenalkan arsitektur komponen ke dalam kompleks alat, serta metode untuk menyelesaikannya. Ini mungkin menarik bagi pengembang wadah kontrol dan pengembang objek ActiveX itu sendiri, karena artikel ini menunjukkan tujuan dan penggunaan berbagai metode antarmuka standar untuk kontrol sisi kontainer.

Solusi yang diusulkan didasarkan pada pengalaman mengembangkan kompleks alat RS-Formulir - yang baru produk perangkat lunak Lab Perangkat Lunak Gaya-R. RS-Formulir termasuk alat pengembangan GUI pengguna aktif Platform Windows, lingkungan eksekusi untuk program yang dibuat menggunakan bahasa RSL*, C, dan C++, serta sistem debug untuk program RSL.

*Objek RSL - bahasa pemrograman level tinggi, dibuat oleh R-Style Software Lab. Lihat http://www.softlab.ru/products/rsl/ untuk detailnya. - Catatan. ed.

Sebagai bagian dari proyek, versi pertama perancang formulir diimplementasikan (Gbr. 1), yang memungkinkan Anda membuat formulir, menyematkan kontrol standar dan objek ActiveX arbitrer di dalamnya, menyimpan formulir yang sudah jadi dalam penyimpanan pada media penyimpanan permanen dan memuatnya dari itu. Dengan bantuan desainer, Anda dapat melihat properti, metode, dan kejadian dari setiap elemen kontrol yang disematkan dalam formulir, mengubah nilai properti.

Perancang didasarkan pada wadah (formulir) kontrol ActiveX yang menyediakan fungsionalitas yang dijelaskan di atas. Selain itu, formulir mendukung berbagai pilihan pengaturan untuk presentasinya, termasuk persentase pengikatan elemen yang disematkan ke perbatasan, kontrol urutan pintasannya oleh keyboard, visibilitasnya, jenis huruf dan ukuran font, warna latar belakang, teks, dll.

Selain mengembangkan antarmuka pengguna grafis, perancang memiliki mekanisme untuk menghasilkan kode secara otomatis dalam C++ dan RSL. Penting untuk dicatat bahwa semua operasi yang dilakukan pada formulir di desainer juga tersedia dalam mode runtime dari kode program.

Beras. 1. Desainer formulir.

Dibuat di desainer bentuk grafik dapat digunakan dalam aplikasi C/C++ apa pun, serta dari bahasa skrip apa pun seperti Visual Basic atau RSL. Saat menggunakan formulir dalam aplikasi C++ yang dikembangkan dengan pustaka MFC, perancang dapat digunakan sebagai editor sumber daya dialog.

Sekarang mari kita bahas konsep membangun wadah dan prinsip bekerja dengan kontrol ActiveX.

Fungsi Kontainer Dasar

Setiap wadah kontrol harus memiliki fungsionalitas yang memungkinkan Anda membuat objek ActiveX, memastikan operasinya yang benar, menghapusnya dari memori akses acak, serta menyimpan item di toko objek pada media penyimpanan permanen dan memuatnya darinya*. Wadah mencakup sejumlah komponen (Gbr. 2) yang menyediakan standar (menurut teknologi Microsoft ActiveX) fungsionalitas yang diperlukan agar kontrol berfungsi dengan benar.

* Masalah umum dalam membangun wadah dan server objek COM dibahas dalam buku oleh D. Chappel "ActiveX and OLE Technologies" - M .: "Edisi Rusia", 1997.

Wadah memelihara koleksi (misalnya, daftar) objek koneksi dengan kontrol ActiveX, satu objek koneksi per kontrol. Selain itu, wadah yang dapat diprogram harus menyediakan mekanisme standar untuk memanipulasi elemen koleksi ini.

Objek situs kontrol bertanggung jawab atas interaksi yang benar dari elemen yang sesuai dengan wadah. Setiap objek koneksi berisi subobjek yang memperluas kontrol dengan kumpulan properti, metode, dan kejadian khusus container. Sub-objek seperti itu disebut kontrol yang diperluas. Contoh properti yang diperluas adalah nama (Nama), lokasi dalam wadah (Lebar, Kiri), dan seterusnya. Set yang ditentukan adalah properti dari wadah, bukan dari kontrol individu apa pun, meskipun itulah yang terlihat oleh pengguna sistem. Ada beberapa opsi untuk menerapkan kontrol yang diperluas. Misalnya, itu bisa menjadi sub-objek dari objek komunikasi (lihat Gambar 2) atau objek COM nyata yang menggabungkan kontrol asli. Masing-masing opsi memiliki kelebihan dan kekurangannya sendiri. Dalam artikel ini, kami hanya mempertimbangkan metode pertama.

Setiap kontrol yang diperluas berisi sebagai sub-objek, sebuah objek peristiwa tenggelam dari kontrol terkaitnya (Gambar 2). Tugasnya mencakup identifikasi utama dari peristiwa yang diterima (apakah pemrosesan peristiwa khusus diperlukan atau tidak) dan, jika perlu, mentransfernya ke objek pemiliknya (kontrol yang diperluas), yang menyediakan perutean peristiwa di sepanjang hierarki objek penampung.

Skrip Pembuatan Kontrol

Menyuntikkan kontrol ke dalam wadah terdiri dari tiga fase: membuat objek ActiveX, menginisialisasinya, dan mengaktifkannya.

Kontrol dibuat di ruang alamat penampung menggunakan fungsi COM standar seperti CoCreateInstance. CLSID unik global yang sesuai diteruskan ke fungsi sebagai ID kontrol. Perlu dicatat bahwa wadah harus mendukung berbagai opsi untuk mengidentifikasi objek COM dalam sistem - seperti pengidentifikasi program ProgID, pengidentifikasi kelas unik dalam bentuk string, dll.

Tujuan utama fase inisialisasi adalah meneruskan pointer ke antarmuka IOleClientSite dari objek koneksi ke kontrol melalui fungsi IOleObject::SetClientSite dan memanggil fungsi IPersistStreamInit::InitNew atau IPersistStreamInit::Load (tergantung pada apakah objek dimuat dari penyimpanan atau tidak). Melewati objek pointer ke antarmuka IOleClientSite dapat terjadi sebelum memuat/inisialisasi atau setelah; momen transmisi ditentukan oleh keberadaan atribut OLEMISC_SETCLIENTSITEFIRST (IOleObject::GetMiscStatus). Ini penting, karena pointer yang lewat menentukan pada titik waktu mana kontrol akan menerima nilai properti ambien dari wadah. Jika fitur ini diabaikan, maka fungsi lebih lanjut dari objek ActiveX mungkin salah.

Kemudian, dalam kerangka fase yang dipertimbangkan, Anda perlu melakukan inisialisasi awal properti kontrol yang diperluas yang melengkapi objek ActiveX yang dibuat. Misalnya, Anda perlu mengatur nama objek dengan benar (menginisialisasi properti Name, yang menyediakan identifikasi kontrol di dalam container). Kontrol apa pun yang disematkan dalam wadah yang dapat diprogram harus mendukung properti ini, tetapi itu masih merupakan properti wadah. Seringkali, secara default, objek diberi nama pendek kelas tempat mereka berada (nama ini dikembalikan oleh metode IOleObject::GetUserType untuk parameter USERCLASSTYPE_SHORT), dengan indeks numerik ditambahkan untuk memastikan bahwa nama kontrol di wadahnya unik. Jika menerima nama yang ditentukan gagal, atau jika tidak memenuhi logika wadah, maka beberapa nama yang telah ditentukan dapat diberikan dengan indeks yang sesuai.

Mengaktifkan kontrol menyiratkan urutan tindakan tertentu. Langkah pertama adalah membuat backlink objek ActiveX ke objek tautan di wadah (situs kontrol). Untuk melakukan ini, metode IOleObject::Advise dipanggil, meneruskan sebagai parameter penunjuk ke antarmuka standar objek koneksi IAdviseSink. Selanjutnya, Anda perlu meminta antarmuka keluarga IViewObject dengan benar (sesuai dengan spesifikasi, objek ActiveX dapat mendukung antarmuka IViewObject, IViewObject2, IViewObjectEx yang ada dalam hierarki pewarisan) dan membuat umpan balik untuknya dengan memanggil IViewObject:: Metode SetAdvise meneruskan pointer ke IAdviseSink. Selain itu, Anda perlu memberi tahu kontrol nama wadahnya (ini diimplementasikan dengan memanggil metode IOleObject::SetHostName), meminta dan menyimpan semua antarmuka yang diperlukan untuk pekerjaan yang benar dengan objek ActiveX (setidaknya IOleInPlaceObject dan IOleControl). Hal terakhir yang harus dilakukan untuk merender kontrol secara visual adalah dengan memanggil fungsi IOleObject::DoVerb* dengan parameter OLEIVERB_INPLACEACTIVATE.

*Dalam implementasi ATL, fungsi ini bertanggung jawab, antara lain, untuk membuat jendela untuk kontrol normal (berjendela).

Skrip Penghapusan Kontrol

Untuk menghapus kontrol yang disematkan dalam wadah dari memori, Anda harus mengecualikan dari koleksi objek asosiasi dengan kontrol yang terkait dengannya, dan kemudian melakukan dua operasi secara berurutan: break masukan dan membebaskan pointer yang disimpan ke antarmuka objek ActiveX.

Untuk memutuskan tautan balik, Anda harus terlebih dahulu memberi tahu elemen yang dihapus tentang perlunya melepaskan (dengan memanggil metode IUnknown::Release) pointer yang dipegangnya ke antarmuka IAdviseSink dari objek tautan. Untuk melakukan ini, metode IViewObject::SetAdvise dipanggil (melewati NULL sebagai argumen) dan IOleObject::Unadvise, yang perlu dilengkapi dengan pengidentifikasi hubungan yang disimpan selama fase aktivasi. Selanjutnya, Anda perlu mengaktifkan prosedur untuk deinisialisasi objek ActiveX (dengan memanggil fungsi IOleObject::Close). Langkah selanjutnya adalah memberi tahu kontrol untuk membebaskan penunjuk antarmuka IOleClientSite dengan memanggil IOleObject::SetClientSite dengan parameter NULL.

Fase melepaskan pointer yang disimpan ke antarmuka kontrol terdiri dari memanggil metode Rilis pada mereka satu per satu. Segera setelah pointer terakhir dibebaskan, objek (sesuai dengan teknologi COM) akan dihapus dari RAM.

Simpan dan Muat Script

Menyimpan objek kontainer dalam penyimpanan, terlepas dari jenis yang terakhir, menyimpan properti kontainer (seperti properti lingkungan) dan kumpulan kontrol yang disematkan, yaitu ID dan properti (termasuk yang diperluas) dari setiap objek yang milik koleksi. Pengenal kontrol dapat menjadi pengidentifikasi unik global dari kelas CLSID. Ini akan memungkinkan tahap inisialisasi untuk membuat objek ActiveX yang diperlukan dan memuatnya dengan data yang ada di penyimpanan setelah pengidentifikasi yang ditentukan. Untuk menyimpan properti kontrol, misalnya, ke aliran, metode Simpan dari antarmuka objek ActiveX standar IPersistStreamInit dipanggil. Untuk memuat, metode Load dari antarmuka yang sama disebut.

Prosedur penyimpanan ini memastikan bahwa objek kontainer kemudian dipulihkan dari penyimpanan. Metode yang dijelaskan berfungsi dengan baik, asalkan tidak ada perubahan versi atau penghapusan kontrol apa pun dari sistem yang terjadi dari waktu penyimpanan hingga waktu pemuatan. Situasi seperti itu sering muncul saat memigrasi penyimpanan data dari satu komputer ke komputer lain di mana kontrol ActiveX yang disimpan belum diinstal atau didaftarkan. Dalam hal ini, memuat objek kontainer dari penyimpanan akan mengakibatkan penghentian program yang fatal, atau menyebabkan kesalahan saat memuat seluruh kontainer secara keseluruhan. Untuk mencegah kesalahan, perlu untuk secara jelas menetapkan batas antara data dari berbagai kontrol, menulis ke penyimpanan setelah pengidentifikasi objek ukuran informasi yang disimpan olehnya. Ini akan memungkinkan fase beban untuk secara akurat memposisikan dirinya di awal setiap data objek ActiveX, serta melewati kontrol yang tidak terdaftar di sistem, tetapi memuat objek kontainer secara keseluruhan.

Antarmuka Koleksi Objek ActiveX

Menurut standar, wadah kontrol harus menyediakan interaksi antara objek ActiveX yang tertanam di dalamnya. Untuk melakukan ini, Anda harus mendukung antarmuka IOleContainer, yang memungkinkan Anda menghitung semua kontrol yang dimasukkan ke dalamnya. Jika ada kontrol yang diperluas, pencacahan harus melintasi antarmuka IUnknown-nya, bukan antarmuka objek yang mendasarinya.

Untuk menyediakan akses ke koleksi ke klien otomatisasi, gunakan antarmuka koleksi objek standar. Koleksi standar mencakup metode Tambah, Hapus, Hapus, Item, dan properti _NewEnum dan Hitung, yang menyediakan iterasi elemen yang komprehensif. Misalnya, Visual Basic untuk setiap konstruk menggunakan properti _NewEnum untuk menghitung elemen, sedangkan untuk konstruk berikutnya menggunakan properti Count dan metode Item. Di Object RSL, properti _NewEnum digunakan saat memanggil metode CreateEnum objek ActiveX standar. Ini diilustrasikan, misalnya, oleh program RSL yang mencetak nama file yang dibuka di aplikasi menggunakan metode yang ditentukan. Microsoft Excel(teksnya diberikan di bawah).

impor rslx; ob = ActiveX("Excel.Application", null, benar); id = ob.Workbooks.CreateEnum; while (en.next) println(en.item.Name) end;

Skenario di atas memungkinkan Anda mengembangkan fungsi untuk menambahkan kontrol ke wadah dan menghapusnya darinya. Dalam kebanyakan kasus, fungsi add membuat objek tautan dengan kontrol (yang menyimpan semua pointer ke antarmuka objek ActiveX yang diperlukan untuk berfungsi) dan memanggil fungsi serupa di dalamnya. Yang terakhir, pada gilirannya, mengimplementasikan skenario implementasi yang dijelaskan di atas (mungkin tanpa fase aktivasi). Jika pembuatan objek ActiveX di RAM berhasil, maka fungsi wadah menambahkan objek tautan yang sesuai ke koleksi. Seringkali, karena kesamaannya, prosedur untuk menyematkan dan memuat kontrol dari penyimpanan digabungkan.

* * *

Kami telah membahas di sini masalah utama yang terkait dengan membangun wadah kontrol: injeksi, tampilan visual, menyimpan dan memuat objek ActiveX, serta penghapusan yang benar dari RAM. Namun, dalam proses menciptakan lingkungan kerja grafis, kami perlu menerapkan beberapa wadah yang akan berbeda satu sama lain dalam antarmuka otomatisasi yang disediakan, subset objek ActiveX yang dapat disuntikkan, set properti, metode, dan peristiwa kontrol yang diperluas, dll. Untuk ini, model diusulkan yang memungkinkan Anda membuat berbagai elemen wadah dan terintegrasi dengan baik dengan perpustakaan ATL. Kemerdekaan dari antarmuka tertentu dicapai melalui penggunaan kelas template, yang parameternya adalah antarmuka ini.

*Misalnya, kontrol Tab adalah wadah untuk halaman properti, yang merupakan wadah tujuan umum.

Model ini memungkinkan Anda untuk dengan cepat membuat varian dasar dari berbagai objek ActiveX yang memiliki "logika wadah" yang melekat di dalamnya. Selain itu, infrastruktur yang diimplementasikan memungkinkan Anda membuat container yang bukan merupakan kontrol. Wadah seperti itu dapat ditempatkan sebagai Jendela jendela ke bagian mana pun dari aplikasi yang sedang dikembangkan dan kemudian, dengan mengirimkan pesan yang sesuai, menerapkan berbagai kontrol ke dalamnya.

Hasilnya adalah arsitektur yang cukup fleksibel untuk membangun wadah, yang dengannya Anda dapat membuat Wizard (Wizard) yang meluas Kegunaan Lingkungan Microsoft Visual Studio ke mekanisme pembuatan kerangka wadah.


Mengedit registri Windows secara manual untuk menghapus kunci yang tidak valid Kesalahan 800A01AD tidak disarankan kecuali Anda adalah profesional layanan PC. Kesalahan yang dibuat saat mengedit registri dapat membuat PC Anda tidak dapat digunakan dan menyebabkan kerusakan yang tidak dapat diperbaiki pada perangkat Anda sistem operasi. Faktanya, bahkan satu koma di tempat yang salah dapat mencegah komputer Anda melakukan booting!

Karena risiko ini, kami sangat menyarankan untuk menggunakan pembersih registri tepercaya seperti WinThruster [Unduh] (Dikembangkan oleh Mitra Bersertifikat Emas Microsoft) untuk memindai dan memperbaiki Kesalahan 800A01AD. Dengan menggunakan [Unduh] Pembersih Registri, Anda dapat mengotomatiskan proses menemukan entri registri yang rusak, referensi file yang hilang (seperti yang menyebabkan kesalahan %%error_name%%), dan tautan rusak di dalam registri. Sebelum setiap pemindaian, secara otomatis dibuat salinan cadangan, yang memungkinkan Anda untuk membatalkan perubahan apa pun dengan satu klik dan melindungi Anda dari kemungkinan kerusakan pada komputer Anda. Bagian terbaiknya adalah memperbaiki kesalahan registri [Unduh] dapat secara drastis meningkatkan kecepatan dan kinerja sistem.


Peringatan: Kecuali Anda adalah pengguna PC tingkat lanjut, kami TIDAK menyarankan untuk mengedit Registry Windows secara manual. Penggunaan Editor Registri yang salah dapat menyebabkan masalah serius dan memerlukan menginstal ulang windows. Kami tidak menjamin bahwa masalah akibat penyalahgunaan Registry Editor dapat diselesaikan. Anda menggunakan Peninjau Suntingan Registri dengan risiko Anda sendiri.

Sebelum memulihkan secara manual Registri Windows, Anda perlu membuat cadangan dengan mengekspor bagian registri yang terkait dengan Kesalahan 800A01AD (misalnya, ActiveX):

  1. Klik pada tombol Memulai.
  2. Memasuki " memerintah" di bilah pencarian... JANGAN TEKAN BELUM MEMASUKI!
  3. Memegang kunci CTRL-Shift pada keyboard, tekan MEMASUKI.
  4. Dialog akses akan ditampilkan.
  5. Klik Ya.
  6. Kotak hitam terbuka dengan kursor berkedip.
  7. Memasuki " regedit" dan tekan MEMASUKI.
  8. Di Peninjau Suntingan Registri, pilih kunci terkait Error 800A01AD (mis. ActiveX) yang ingin Anda buat cadangannya.
  9. Di menu Mengajukan Pilih Ekspor.
  10. Terdaftar Menyimpan ke pilih folder tempat Anda ingin menyimpan salinan cadangan kunci ActiveX.
  11. di lapangan Nama file masukkan nama untuk file cadangan, seperti "ActiveX Backup".
  12. Pastikan lapangan Rentang ekspor nilai yang dipilih Cabang yang dipilih.
  13. Klik Menyimpan.
  14. File akan disimpan dengan ekstensi .reg.
  15. Anda sekarang memiliki cadangan entri registri terkait ActiveX Anda.

Langkah selanjutnya untuk mengedit registri secara manual tidak akan dibahas dalam artikel ini, karena kemungkinan besar akan merusak sistem Anda. Jika Anda ingin informasi lebih lanjut tentang mengedit registri secara manual, silakan lihat tautan di bawah ini.