Secara umum, ada tiga cara untuk memprogram bersama antara VB dan VC: satu adalah dengan membuat DLL di VC dan memanggil DLL di VB; satu lagi adalah dengan membuat kontrol ActiveX (.ocx) di VC dan memasukkannya ke dalam VB dan yang lainnya adalah membuat DLL di VC Hasilkan server ActiveX Automation di VB dan menyebutnya di VB. Secara relatif, metode pertama memiliki persyaratan terendah untuk pemrogram VC, tetapi memerlukan kerja sama dari mitra Anda.
Mari kita bicara tentang pemrograman VC++ terlebih dahulu. Pertama buat proyek Win32 DLL di VC++. Tambahkan beberapa fungsi ke proyek ini untuk dipanggil oleh pengguna VB. Agar suatu fungsi dalam DLL dapat dipanggil oleh VB, ia harus memenuhi dua syarat: satu adalah metode pemanggilannya adalah stdcall, dan yang lainnya harus diekspor. Untuk melakukan yang pertama, cukup tambahkan kata kunci __stdcall sebelum deklarasi fungsi. menyukai:
sampel __stdcall pendek (nLen pendek, *buffer pendek)
Untuk melakukan yang kedua, Anda perlu menambahkan baris berikut ke file *.def:
EKSPOR
sampel @1
Contoh di sini adalah nama fungsi yang ingin Anda panggil di VB, @1 mewakili nomor fungsi di DLL, dan setiap fungsi berbeda-beda. Perhatikan bahwa nama fungsi di sini peka huruf besar-kecil. Adapun kebutuhan untuk mentransfer data dalam jumlah besar, Anda bisa melakukannya dengan menggunakan array untuk menyimpan data di VB, lalu meneruskan ukuran dan alamat array ke VC (untuk cara memprogram di VB, saya akan perkenalkan di bawah). Sama seperti contoh di atas, nLen adalah ukuran array dan buffer adalah alamat array. Dengan dua item ini, Anda dapat memprosesnya seperti array VC. Sedangkan untuk grafik keluaran, Anda dapat menghasilkan format WMF atau BMP dan biarkan VB menyebutnya. Namun, menurut saya itu juga bisa di-output langsung ke jendela, selama VB meneruskan pegangan jendela hWnd dan hDC dan posisi gambar jendela (sistem koordinat yang digunakan oleh VB dan VC harus konsisten) ke VC. Properti AutoRedraw VB harus False, dan program menggambar VC dipanggil dalam event Paint.
Mari kita bicara lagi tentang pemrograman VB. Cara VB memanggil DLL sama dengan cara memanggil Windows API, yang umumnya diperkenalkan di buku VB. Untuk contoh di atas, pertama-tama deklarasikan fungsi VC:
Deklarasikan sampel Fungsi Lib "mydll.dll" (ByVal nLen Sebagai Integer, buffer Sebagai Integer) Sebagai Integer
Di sini mydll.dll adalah nama dll Anda. Anda mungkin memperhatikan bahwa kedua parameter dideklarasikan secara berbeda, dengan ByVal ditambahkan ke parameter pertama. Aturannya begini: Jika parameter dideklarasikan sebagai pointer atau array di VC, ByVal tidak akan ditambahkan, jika tidak, ByVal akan ditambahkan. Memanggil fungsi ini di VB menggunakan sintaks berikut:
sampel 10, a(0)
Array a() di sini digunakan untuk menyimpan data, dan 10 adalah panjang array. Parameter kedua di sini tidak boleh a(), tetapi harus menjadi data pertama yang diteruskan. Ini adalah kunci pemrograman VB.
Berikut adalah beberapa kemungkinan masalah yang mungkin Anda temui. Salah satu masalahnya adalah VB mungkin melaporkan bahwa dll tidak dapat ditemukan. Anda dapat meletakkan dll di direktori sistem dan memastikan bahwa pernyataan Deklarasi VB sudah benar. Masalah lainnya adalah VB melaporkan tidak dapat menemukan fungsi yang diperlukan. Hal ini biasanya karena file *.def tidak disetel di VC. Situasi ketiga adalah VB memberitahu Anda bahwa konversi tidak dapat dilakukan. Ini mungkin karena kata kunci __stdcall tidak ditambahkan di VC, atau mungkin tipe parameter VB dan VC tidak konsisten. Perhatikan bahwa int di VC adalah 4 bytes (setara dengan VB Long), sedangkan Integer VB hanya 2 byte. Harus dipastikan bahwa jumlah parameter di VB dan VC sama, dan jumlah byte yang ditempati juga sama. Hal terakhir yang perlu diperhatikan adalah array tidak boleh melebihi batas di VC, jika tidak maka akan menyebabkan program VB crash.
1. Keuntungan menelepon DLL
Sebagai fondasi sistem operasi Windows, perpustakaan tautan dinamis (DLL) memiliki kinerja aplikasi yang unggul:
DLL memperluas fitur suatu aplikasi. Karena DLL secara dinamis dimuat ke dalam ruang alamat suatu proses, aplikasi dapat menentukan pada saat runtime operasi apa yang perlu dilakukan dan kemudian memuat kode yang sesuai untuk melakukan operasi tersebut sesuai kebutuhan.
DLL dapat ditulis dalam berbagai bahasa. Misalnya, VB digunakan untuk menulis antarmuka program aplikasi, dan C++ digunakan untuk menulis operasi dasar seperti algoritma dan komunikasi.
DLL menyederhanakan pengelolaan proyek perangkat lunak. Jika kelompok kerja yang berbeda mengerjakan modul yang berbeda selama pengembangan perangkat lunak, proyek akan lebih mudah dikelola.
DLL membantu menghemat memori. Jika dua atau lebih aplikasi menggunakan DLL yang sama, halaman DLL hanya perlu dimasukkan ke dalam RAM satu kali, dan semua aplikasi dapat berbagi halaman individualnya.
DLL memfasilitasi berbagi sumber daya. DLL dapat berisi sumber daya seperti templat kotak dialog, string, ikon, dan bitmap, dan beberapa aplikasi dapat menggunakan DLL untuk berbagi sumber daya ini.
DLL membantu dalam pelokalan aplikasi. Misalnya, aplikasi yang hanya berisi kode dan tidak ada komponen antarmuka pengguna dapat memuat DLL yang berisi komponen antarmuka pengguna yang dilokalkan.
DLL membantu menyelesaikan perbedaan platform. Versi Windows yang berbeda dilengkapi dengan fungsi yang berbeda, dan pengembang sering kali ingin memanggil fungsi baru. Namun, jika kode sumber berisi panggilan ke fungsi baru, dan aplikasi akan dijalankan pada versi Windows yang tidak menyediakan fungsi tersebut, pemuat sistem operasi akan menolak menjalankan proses tersebut. Jika fungsi-fungsi baru ini disimpan dalam DLL, aplikasi dapat memuatnya ke versi Windows yang lebih lama dan berhasil memanggil fungsi tersebut.
2. Temukan titik masuk DLL
Pengguna yang pertama kali melakukan kontak dengan DLL sering kali mengalami masalah: DLL yang dibuat di lingkungan VC berjalan dengan baik di VC, tetapi ketika dipanggil dalam aplikasi VB, entri "kesalahan konvensi panggilan" atau "tidak ditemukan". titik" kesalahan. Hal ini terutama disebabkan oleh kelalaian berikut.
Pertama-tama, perlu dicatat bahwa deklarasi fungsi di DLL dan deklarasi fungsi di VB harus sama persis dalam hal nama, tipe pengembalian, tipe parameter, jumlah parameter, dll. Berikan perhatian khusus pada masalah kapitalisasi.
Kedua, fungsi entri harus ditambahkan ke file .def DLL.
Terakhir, kata kunci eksternal "c" dan _stdcall harus ditambahkan sebelum definisi fungsi.
Silakan merujuk ke contoh aplikasi untuk format spesifik.
3. Melewati parameter array di DLL
Karena DLL sering digunakan untuk melakukan beberapa operasi tingkat rendah, aplikasi sering kali perlu meneruskan sejumlah besar data ke DLL. Di C++, pointer adalah pilihan terbaik untuk operasi array, tetapi tidak ada konsep pointer di VB. Hal ini biasanya dapat diselesaikan dengan dua cara.
Pertama, saat mendeklarasikan DLL di VB, gunakan byref alih-alih byval untuk meneruskan penunjuk array ke DLL.
Selain itu, dengan mendeklarasikan array sebagai varian, Anda bisa langsung meneruskan array ke DLL.
4. Contoh aplikasi
Berikut ini menggunakan contoh spesifik untuk mengilustrasikan proses pemanggilan DLL yang dibuat di lingkungan VC di VB.
Buat DLL untuk pemrosesan sinyal, "SigPro.dll", yang berisi fungsi "Fourier" untuk perhitungan Fourier.
Pernyataan di VC:
Tambahkan kode berikut ke "SigPro.h",
Copy kode kodenya sebagai berikut:
eksternal "C"
{
double EKSPOR _stdcall Fourier(panjang int *Sampel,int NumSam,int OvertoneOrder,bool SinOrCos);
}
Tambahkan kode berikut ke "SigPro.cpp",
eksternal "C"
EKSPOR ganda _stdcall Fourier(panjang int *Sampel,int NumSam,int OvertoneOrder,bool SinOrCos)
{
ke dalam aku;
hasil ganda=0,0;
jika(SinOrCos==benar)
{
untuk(i=0;i<NumSam;i++)
{
hasil=hasil+*(Sampel+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
kalau tidak
{
untuk(i=0;i<NumSam;i++)
{
hasil=hasil+*(Sampel+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
hasil =hasil*2/NumSam;
hasil pengembalian;
}
Tambahkan kode berikut ke "SigPro.def",
EKSPOR
Fourier
Pernyataan panggilan di VB:
Deklarasikan Publik Fungsi Fourier Lib "SigPro" (ByRef Sample() Selama, ByVal NumSam Sebagai Integer, ByVal OvertoneOrder Sebagai Integer, ByVal SinOrCos Sebagai Boolean) Sebagai Double