Menurunkan Anggun dengan Tidak Adanya Antarmuka

Karena kontrol mungkin tidak mendukung antarmuka apa pun selain IUnknown, kontainer harus menurun dengan baik ketika menemukan tidak adanya antarmuka tertentu.

Seseorang mungkin mempertanyakan kegunaan kontrol dengan tidak lebih dari IUnknown. Tetapi pertimbangkan keuntungan yang diterima kontrol dari lingkungan pemrograman visual kontainer (seperti VB) ketika kontainer mengenali objek sebagai kontrol:

  • Tombol untuk objek muncul di kotak alat.
  • Seseorang dapat membuat objek dengan menyeretnya dari kotak alat ke formulir.
  • Seseorang dapat memberi objek nama yang dikenali di lingkungan pemrograman visual.
  • Nama yang sama dalam (3) di atas dapat segera digunakan dalam menulis kode lain untuk kontrol pada bentuk yang sama (atau bahkan bentuk yang berbeda).
  • Kontainer dapat secara otomatis menyediakan titik masuk kode untuk setiap peristiwa yang tersedia dari objek tersebut.
  • Kontainer menyediakan UI penjelajahan propertinya sendiri untuk properti apa pun yang tersedia.

Ketika objek tidak dikenali sebagai kontrol, maka berpotensi kehilangan semua fitur integrasi yang sangat kuat dan bermanfaat ini. Misalnya, di Visual Basic 4.0 sangat sulit untuk benar-benar mengintegrasikan beberapa objek acak yang bukan kontrol dalam arti lengkap, tetapi mungkin masih memiliki properti dan peristiwa. Karena gagasan Visual Basic 4 tentang kontrol sangat ketat, objek tidak mendapatkan salah satu fitur integrasi di atas. Tetapi bahkan kontrol dengan IUnknown, di mana seumur hidup kontrol hanya menentukan keberadaan beberapa sumber daya, harus dapat memperoleh kemampuan integrasi yang dijelaskan di atas.

Karena alat saat ini memerlukan serangkaian antarmuka kontrol yang besar untuk mendapatkan keuntungan apa pun, kontrol umumnya dipimpin ke implementasi berlebihan, sehingga berisi lebih banyak kode daripada yang mereka butuhkan. Kontrol yang bisa 7K mungkin berakhir menjadi 25K, yang merupakan masalah performa besar di area seperti Internet. Ini juga telah menyebabkan persepsi bahwa seseorang hanya dapat menerapkan kontrol dengan satu alat seperti CDK karena kompleksitas mengimplementasikan semua antarmuka, dan ini memiliki implikasi ketika DLL besar seperti OC30.DLL diperlukan untuk kontrol seperti itu, meningkatkan set kerja. Jika tidak semua antarmuka diperlukan, maka ini membuka banyak pengembang untuk menulis kontrol yang sangat kecil dan ringan dengan OLE lurus atau dengan alat lain juga, meminimalkan overhead untuk setiap kontrol.

Inilah sebabnya mengapa lampiran ini mengenali kontrol sebagai objek apa pun dengan CLSID dan antarmuka IUnknown. Bahkan dengan tidak lebih dari IUnknown, kontainer dengan lingkungan pemrograman harus dapat menyediakan setidaknya fitur #3 dan ) entri registri, ia mendapatkan #1 dan #2. Jika objek menyediakan I Koneksi ionPointContainer (dan IProvideClassInfo umumnya) untuk beberapa set peristiwa, objek mendapatkan #5, dan jika mendukung IDispatch untuk properti dan metode, ia mendapatkan #6, serta integrasi kode yang lebih baik dalam kontainer.

Singkatnya, objek harus dapat mengimplementasikan sesedikit IDispatch dan satu set peristiwa yang diekspos melalui I Koneksi ionPointContainer untuk mendapatkan semua fitur visual di atas.

Dengan mengingat hal ini, tabel berikut menjelaskan apa yang mungkin dilakukan kontainer tanpa adanya antarmuka yang mungkin. Perhatikan bahwa hanya antarmuka tersebut yang tercantum bahwa kontainer akan langsung mendapatkan melalui QueryInterface. Antarmuka lain, seperti IOleInPlaceActiveObject, diperoleh melalui cara lain.

Antarmuka Arti Ketidakhadiran Antarmuka
IViewObject2
Kontrol tidak memiliki visual yang akan menggambar dirinya sendiri, jadi tidak memiliki batasan yang pasti untuk disediakan. Dalam run-time, kontainer tidak mencoba menggambar apa pun ketika antarmuka ini tidak ada. Dalam waktu desain, kontainer setidaknya harus menggambar beberapa jenis persegi panjang default dengan nama di dalamnya untuk kontrol seperti itu, sehingga pengguna di lingkungan pemrograman visual dapat memilih objek dan memeriksa properti, metode, dan peristiwa yang ada. Menangani tidak adanya IViewObject2 sangat penting untuk dukungan pemrograman visual yang baik.
IOleObject
Kontrol tidak memerlukan situs apa pun, juga tidak mengambil bagian dalam negosiasi tata letak objek yang disematkan. Informasi apa pun (seperti tingkat kontrol) yang mungkin diharapkan kontainer dari antarmuka ini harus diisi dengan default yang disediakan kontainer.
IOleInPlaceObject
Kontrol tidak aktif di tempat (seperti label) dan dengan demikian tidak pernah mencoba untuk mengaktifkan dengan cara ini. Satu-satunya aktivasi mungkin adalah halaman propertinya.
IOleControl
Kontrol tidak memiliki mnemonics dan tidak ada penggunaan properti sekitar, dan tidak peduli apakah kontainer mengabaikan peristiwa. Dengan tidak adanya antarmuka ini, kontainer hanya tidak memanggil metodenya.
IDataObject
Kontrol tidak menyediakan kumpulan properti atau rendering visual apa pun yang dapat di-cache, sehingga kontainer akan memilih untuk menyimpan beberapa presentasi default tanpa adanya antarmuka ini (dukungan untuk CF_METAFILEPICT, khususnya) dan menonaktifkan fungsionalitas terkait kumpulan properti apa pun.
IDispatch
Kontrol tidak memiliki properti atau metode kustom. Kontainer tidak perlu mencoba menampilkan properti kontrol apa pun dalam hal ini, dan harus melarang panggilan metode kustom apa pun yang tidak dikenali kontainer sebagai milik kontrol yang diperluas sendiri (yang dapat mendukung metode dan properti). Karena kontrol yang diperluas umumnya mendelegasikan panggilan IDispatch tertentu ke kontrol, kontrol yang diperluas seharusnya tidak mengharapkan kontrol memiliki IDispatch sama sekali.
I Koneksi ionPointContainer
Kontrol tidak memiliki peristiwa, sehingga kontainer tidak perlu memikirkan penanganan apa pun.
IProvideClassInfo
IProvideClassInfo2
Kontrol tidak memiliki informasi jenis atau peristiwa, atau kontainer perlu masuk ke informasi jenis kontrol melalui entri registri kontrol. Keberadaan antarmuka ini adalah pengoptimalan.
ISpecifyPropertyPages
Kontrol tidak memiliki halaman properti, jadi jika kontainer memiliki UI yang akan memanggilnya, kontainer harus menonaktifkan UI tersebut.
IPerPropertyBrowsing
Kontrol tidak memiliki nama tampilan itu sendiri, tidak ada string dan nilai yang telah ditentukan, dan tidak ada pemetaan properti ke halaman. Antarmuka ini hampir selalu digunakan untuk menghasilkan antarmuka pengguna kontainer, sehingga elemen UI tersebut akan dinonaktifkan tanpa adanya antarmuka ini.
IPersist*
Kontrol tidak memiliki status persisten untuk dibicarakan, sehingga kontainer tidak perlu khawatir tentang menyimpan data khusus kontrol apa pun. Kontainer, tentu saja akan menyimpan informasinya sendiri tentang kontrol dalam bentuk atau dokumennya sendiri, tetapi kontrol itu sendiri tidak memiliki apa pun untuk berkontribusi pada informasi tersebut.
IOleCache
IOleCache2
Objek tidak mendukung penembolokan. Kontainer masih dapat mendukung penembolokan hanya dengan membuat cache data itu sendiri menggunakan CreateDataCache.

Kontainer