ID Artikel: 106553 - Kajian Terakhir: 14 September 2011 - Revisi: 2.0

Bagaimana menulis c dll dan menyebutnya dari Visual Basic

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menguraikan cara menggunakan dll dengan Visual Basic. Ini mencakup isu-isu berikut:

Bagian A

  • 1.0 Apakah DLL?
  • 1.1 Mengapa menggunakan DLL?
  • 1.2 Anatomi DLL.
  • 1.3 Isu manajemen memori DLL.
  • 1.4 Membangun DLL menggunakan Visual C++.
  • 1.5 Contoh C DLL.

Bagian B

  • 2.0 Memanggil dll dari Visual Basic.
  • 2.1 DLL parameter.
  • 2.2 Pemecahan masalah.
  • 2.3 Contoh Visual Basic panggilan Program.

INFORMASI LEBIH LANJUT

BAGIAN A

1.0 Apakah DLL?

Dll (Dynamic Link Library) adalah aspek penting dari Windows. DLL berisi fungsi yang program eksekusi Anda dapat memanggil selama eksekusi. Dengan kata lain, DLL adalah perpustakaan fungsi yang program Anda dapat menghubungkan dengan secara dinamis.

Link dapat statis atau dinamis. Statis link tidak berubah. Semua alamat informasi yang diperlukan oleh program Anda untuk mengakses fungsi perpustakaan tetap ketika file eksekusi yang dibuat dan tetap tidak berubah selama eksekusi.

Link dinamis dibuat yang diperlukan. Ketika program Anda membutuhkan fungsi yang tidak file eksekusi, Windows beban dinamis link perpustakaan (DLL), membuat semua fungsi yang tersedia untuk aplikasi Anda. Pada waktu itu, Windows menyelesaikan alamat dari masing-masing fungsi dan dinamis link ke aplikasi Anda.

Custom semua kontrol yang digunakan dalam Visual Basic yang dll. Satu-satunya perbedaan adalah bahwa mereka memerlukan penanganan khusus dari pesan yang diterima dari Visual Basic.

1.1 Mengapa menggunakan dll?

Berikut adalah empat alasan mengapa Anda mungkin ingin menggunakan DLL:

  • Akses ke C Run-Time fungsi:

    Run-time c library memiliki banyak fungsi yang berguna yang tidak akan tersedia untuk Visual Basic programer kalau bukan untuk dll. Sebagai contoh, fungsi _dos_getdiskfree memungkinkan Anda untuk menghitung jumlah total ruang disk dan ruang disk kosong yang tersedia pada drive.
  • Fungsi akses untuk Windows API (Application Programming Interface) yang Memerlukan rutinitas panggilan balik:

    Beberapa fungsi Windows API memerlukan fungsi panggilan balik. Panggil balik fungsi adalah fungsi yang Windows akan memanggil sementara mengeksekusi API panggilan. Contoh fungsi semacam ini adalah EnumTaskWindows, yang akan memberikan menangani semua jendela yang dimiliki oleh tugas tertentu.
  • Kecepatan:

    C adalah sepenuhnya dikompilasi bahasa yang bekerja pada tingkat yang cukup dekat dengan asli kode mesin. Ini berarti bahwa pelaksanaan program bahwa adalah baik yang ditulis dalam c akan cepat.
  • Beban pada penggunaan:

    Kode dan data dari DLL dimuat hanya bila diperlukan. DLL dapat diatur, sehingga hanya diperlukan bagian dimuat secara seluruh DLL. Hal ini mengurangi jumlah memori yang dibutuhkan dan waktu dibawa ke beban.

1.2 Anatomi DLL

Setiap DLL harus berisi LibMain fungsi dan harus berisi keluar Windows Prosedur (WEP) Selain untuk diekspor fungsi yang dapat dipanggil oleh sebuah program yang dapat dijalankan.

  • LibMain:

    DLL harus berisi LibMain fungsi. Fungsi LibMain disebut oleh sistem untuk menginisialisasi DLL. LibMain disebut hanya sekali - ketika program pertama yang memerlukan DLL di-load. Berikut ini adalah Parameter berlalu untuk LibMain:
    -PEGANGAN: Pegangan untuk contoh DLL.
    -KATA: Perpustakaan data segmen.
    -KATA: Tumpukan ukuran.
    -LPSTR: parameter baris perintah.
  • WEP:

    WEP (Windows keluar prosedur) melakukan pembersihan untuk DLL sebelum Perpustakaan diturunkan. Meskipun fungsi WEP diperlukan untuk setiap DLL dalam versi sebelumnya dari sistem operasi Windows, untuk versi 3.1 itu opsional. WEP harus dimasukkan dalam berkas definisi modul (.DEF) dalam Visual C, misalnya:
    EKSPOR
    WEP
  • Diekspor fungsi:

    Ini adalah fungsi yang ingin Anda panggil dari Anda DLL. Mereka dilambangkan oleh _export. _export digunakan untuk kompatibilitas. Semua fungsi yang ingin Anda panggil harus juga tercantum dalam (.DEF) file Anda DLL.

1.3 Isu-isu manajemen memori DLL

Menggunakan model memori yang besar.

C menyimpan semua variabel yang didefinisikan sebagai statis atau global (didefinisikan di luar fungsi) di program tumpukan ruang, dan c menyimpan semua variabel lain pada tumpukan.

Dalam model kecil dan menengah, semua pointer adalah dekat secara default. Ini berarti bahwa data yang diakses oleh 16-bit offset ke salah satu segmen data (DS) pendaftaran, atau tumpukan segmen (SS) mendaftar. Sayangnya, Kompilator tidak memiliki cara untuk mengetahui apakah offset dari DS atau SS. Dalam sebagian besar program ini tidak akan menjadi masalah karena DS dan SS menunjuk ke segmen yang sama. DLL, bagaimanapun, adalah kasus khusus.

DLL telah segmen data sendiri tetapi berbagi dengan tumpukan dengan panggilan program. Ini berarti bahwa DS dan SS tidak menunjukkan sama yang baru. Solusi yang termudah untuk masalah ini adalah untuk membangun DLL model memori besar di mana semua variabel yang direferensikan oleh nilai 32-bit.

Mengapa mengalokasikan memori dinamis?

Mengalokasikan memori dinamis adalah teknik Windows-ramah. Menyatakan array besar data mengambil ruang di salah satu program Anda tumpukan, yang terbatas 64 K, atau Anda program Data segmen, yang boros ruang disk dan Windows memori. Lebih baik untuk meminta Windows memori ketika Anda membutuhkannya, dan kemudian gratis bila Anda telah selesai.

Mengalokasikan memori

Pada Windows, Anda dapat mengalokasikan secara dinamis dua jenis memori, lokal dan global. Memori lokal terbatas untuk 64 K, dan dalam kasus DLL, lokal memori bersama dengan program yang disebut DLL. Memori global semua memori yang tersedia untuk Windows setelah itu telah dimuat.

Lokal memori dialokasikan dan berhasil menggunakan LocalAlloc, LocalLock LocalUnlock, dan LocalFree fungsi--seperti dalam contoh ini:
   char* pszBuffer;
   ....
   pszBuffer = (char *) LocalAlloc (LPTR, 20);
   ...
   LocalFree (pszBuffer);
				
Itu lebih cepat untuk mengalokasikan memori lokal daripada untuk mengalokasikan memori global. Namun alokasi dari tumpukan lokal terbatas 64 K, yang harus dibagi di antara semua program yang menelepon DLL. Lebih baik untuk menggunakan lokal memori ketika kecil, pendek tinggal blok memori diperlukan.

Global memori dialokasikan dan berhasil menggunakan GlobalAlloc, GlobalLock GlobalUnlock, dan GlobalFree fungsi--seperti dalam contoh ini:
   HGLOBAL hglb;
   char* pszBuffer;

   hglb = GlobalAlloc (GHND, 2048);
      // GHND allocates the memory as moveable and
      // initialized to 0
      // 2048 is the amount of memory to be allocated...
   pszBuffer = GlobalLock (hglb);
   ...
   GlobalUnlock (hglb);
   GlobalFree (hglb);
				
Fungsi GlobalAlloc mengalokasikan memori dalam kelipatan 4 k.

Jika Anda ingin berbagi memori dialokasikan dalam DLL dengan program lain, Anda harus mengalokasikan menggunakan bendera GMEM_SHARED. Jika Anda ingin berbagi memori melalui DDE, Anda harus mengalokasikan itu dengan menggunakan bendera GMEM_DDESHARE.

Berhati-hati ketika menyimpan Data dalam variabel statis

Jika Anda mencoba untuk menyimpan data dalam DLL menggunakan variabel global atau statis, tidak akan terkejut jika nilai-nilai ini telah berubah ketika Anda selanjutnya menelepon Anda DLL. The data yang disimpan dalam cara ini akan menjadi umum untuk semua aplikasi yang mengakses DLL. tidak peduli berapa banyak aplikasi menggunakan DLL, ada hanya satu contoh dari DLL. Cara terbaik untuk melakukannya adalah untuk kembali struktur dari DLL dan melewati mereka di lagi ketika mereka dibutuhkan.

Menangani file

Hal ini tidak mungkin untuk berbagi file menangani antara aplikasi atau dll. Setiap aplikasi ini memiliki tabel file-menangani sendiri. Untuk dua aplikasi untuk menggunakan sama file menggunakan DLL, mereka harus baik membuka file secara individual.

1.4 Membangun DLL menggunakan Visual C++

Berikut adalah langkah-langkah yang diperlukan untuk membangun DLL menggunakan Visual C++:

  1. Mulai Visual C++.
  2. Membuat proyek baru dengan memilih baru dari menu proyek. Pilih opsi untuk mengakses pilihan berikut:

    • Menetapkan jenis proyek "Windows dynamic-link perpustakaan (.DLL)"
    • Mengosongkan kotak centang "Gunakan Microsoft Foundation Classes".
    Anda juga dapat mengatur atau melihat opsi ini kemudian dengan memilih proyek dari menu opsi.
  3. Menambahkan Anda yang ada.C dan.DEF file untuk proyek dengan menggunakan dialog kotak yang muncul ketika Anda memilih Edit dari menu proyek. Atau masukkan kode secara langsung dalam jendela edit Visual C++. (Lihat.C dan .DEF kode contoh di bawah ini.)
  4. Dari menu proyek, memilih membangun <yourname>.DLL pilihan. </yourname>

1.5 Contoh C DLL

DLL berikut berisi GetDiskInfo fungsi, yang dapat disebut dari Visual Basic. Itu akan kembali ruang disk yang tersedia, saat ini drive nama dan nama volume.
      C Code Example, DISKINFO.C:

   #include <windows.h>
   #include <dos.h>

   int CALLBACK LibMain (HANDLE hInstance, WORD wDataSeg, WORD wHeapSize,
   LPSTR lpszCmdLine)

   // The following is required only under Windows version 3.1
   // Win32 does not require or support UnlockData()
   {
      if (wHeapSize > 0)
         UnlockData (0);  //Unlocks the data segment of the library.
      return 1;
   }

   void __export CALLBACK GetDiskInfo (char *cDrive, char *szVolumeName,
   unsigned long *ulFreeSpace)
   {
      unsigned drive;
      struct _diskfree_t driveinfo;
      struct _find_t c_file;

      _dos_getdrive (&drive);
      _dos_getdiskfree( drive, &driveinfo );

      if (!_dos_findfirst( "*.*", _A_VOLID, &c_file ))
         wsprintf( szVolumeName, "%s", c_file.name);
      else
         wsprintf ( szVolumeName, "NO LABEL");

      *cDrive = drive + 'A' -1;

      *ulFreeSpace = (unsigned long) driveinfo.avail_clusters * (unsigned
         long) driveinfo.sectors_per_cluster * (unsigned long)
         driveinfo.bytes_per_sector;
   }
				
Menggunakan DISKINFO berikut.DEF file dalam Visual C++:
Perpustakaan diskinfo
Deskripsi 'GetDiskInfo dapat dipanggil dari Visual Basic'
EXETYPE WINDOWS 3.1
KODE PRELOAD LITURGI DISCARDABLE
DATA PRELOAD TUNGGAL DAPAT DIPINDAH-PINDAHKAN
HEAPSIZE 4096
EKSPOR
GetDiskInfo @ 1
Catatan: Nama perpustakaan di.DEF berkas harus sama dengan DLL file nama, atau Visual Basic akan memberi Anda "Kesalahan dalam loading DLL." Untuk contoh, membuat file DISKINFO.DLL menggunakan pernyataan perpustakaan DISKINFO dalam.DEF file di atas.

BAGIAN B

2.0 Memanggil dll dari Visual Basic

Dalam Visual Basic, semua fungsi, termasuk fungsi DLL, yang ingin Anda panggilan pertama akan dinyatakan dengan menggunakan pernyataan menetapkan. Anda dapat menyatakan fungsi Anda di bagian Deklarasi bentuk atau modul. Jika Anda menyatakan DLL prosedur atau fungsi dalam bentuk, pribadi untuk bentuk. Untuk membuat publik, Anda harus melaporkannya dalam modul. Berikut adalah contoh menetapkan pernyataan:
   Declare Sub getdiskinfo Lib "c:\somepath\diskinfo.dll"
      (ByVal mydrive As String, ByVal myvolume As String, free As Long)
				
Anda harus menetapkan seluruh pernyataan sebagai satu, satu baris. Ini tertentu menetapkan pernyataan menyatakan prosedur yang ditetapkan pengguna GETDISKINFO terletak di DISKINFO yang dibuat pengguna.DLL file.

Setelah Anda menyatakan fungsi, Anda dapat memanggil dan menggunakan fungsi seperti Anda akan menelepon dan menggunakan fungsi Visual Basic.

2.1 DLL parameter

Karena dll biasanya ditulis dalam C, dll dapat menggunakan berbagai parameter tidak secara langsung didukung oleh Visual Basic. Akibatnya, ketika memberikan parameter, programmer harus menemukan jenis data yang sesuai untuk lulus.

Lewat argumen dengan nilai atau referensi

Secara default, Visual Basic melewati semua argumen oleh referensi. (Ketika melewati oleh referensi, Visual Basic persediaan 32-bit alamat jauh.) Namun, banyak Fungsi DLL mengharapkan sebuah argumen untuk diteruskan oleh nilai. Ini dapat dicapai dengan menempatkan kata kunci ByVal di depan Deklarasi argumen.

Bagian berikut menunjukkan kepada Anda bagaimana untuk mengubah parameter ke Visual Basic.

8-16 Bit numerik parameter

Melewati parameter angka 8-16 bit (int, pendek, unsigned int, ditandatangani pendek, BOOL, dan kata) sebagai Integer.

Parameter angka 32-bit

Melewati parameter angka 32-bit (lama, ditandatangani lama, dan DWORD) sepanjang.

Menangani objek

Menangani semua adalah nilai-nilai unik 16-bit integer yang terkait dengan jendela dan dilewati oleh nilai, sehingga melewati parameter ini sebagai Integer.

String

String termasuk tipe data LPSTR dan LPBYTE (pointer ke karakter atau pointer ke unsigned karakter). Melewati parameter ini sebagai (ByVal paramname Sebagai String). Untuk lulus Visual Basic string langsung, melewati mereka sebagai (param sebagai String).

Untuk informasi tambahan mengenai lewat string antara Visual Basic and C DLL, silakan lihat artikel berikut pada Basis Pengetahuan Microsoft:
118643  (http://support.microsoft.com/kb/118643/EN-US/ ) Bagaimana untuk melewati sebuah String atau String array antara VB dan C DLL
Catatan: Visual Basic string memerlukan penanganan khusus, sehingga tidak lulus string langsung kecuali DLL secara eksplisit membutuhkan itu.

Petunjuk untuk nilai-nilai numerik

Lewat petunjuk untuk nilai-nilai numerik hanya tidak menggunakan kata kunci ByVal.

Struktur

Apakah Visual Basic buatan pengguna jenis sesuai dengan struktur yang diharapkan oleh DLL, struktur dapat disahkan oleh referensi.

Catatan: Struktur tidak disahkan oleh nilai.

Petunjuk untuk array

Lewat elemen pertama dari array referensi.

Pointer ke fungsi

Visual Basic tidak mendukung fungsi panggilan balik, sehingga DLL fungsi yang memiliki pointer ke fungsi tidak dapat digunakan dengan Visual Basic.

Null pointer

Jika DLL mengharapkan Null pointer, lulus sebagai (ByVal paramname sebagai apapun). Anda dapat menggunakan 0 & sebagai nilai paramname ketika memanggil DLL.

2.2 Pemecahan masalah

Berikut adalah solusi untuk masalah Anda mungkin mengalami.

Sumber daya sistem terus mendapatkan lebih rendah setelah DLL disebut

Jika Anda DLL menggunakan GDI objek, Anda harus ingat untuk membebaskan mereka setelah menggunakan mereka. Ini mungkin tidak jelas dalam Visual Basic, tapi ketika menggunakan Windows SDK (software development kit) jika Anda membuat objek GDI (untuk contoh, CreateBrushIndirect), Anda harus menghapusnya dengan menggunakan DeleteObject kemudian hari.

Buruk DLL panggilan Konvensi kesalahan

Kesalahan ini sering disebabkan oleh salah menghilangkan atau termasuk ByVal kata kunci dari pernyataan menetapkan. Kesalahan ini juga dapat disebabkan apabila salah parameter berlalu.

Kesalahan dalam Loading DLL

Kesalahan ini terjadi bila Anda memanggil prosedur dynamic-link perpustakaan dan file yang ditentukan dalam prosedur menetapkan pernyataan tidak dimuat. Anda dapat menggunakan Microsoft Windows API fungsi LoadLibrary untuk mengetahui lebih lanjut informasi spesifik tentang mengapa DLL gagal untuk memuat.

Umum perlindungan (GP) kesalahan

GP kesalahan terjadi ketika program Anda menulis untuk blok memori yang tidak milik itu. Dua kemungkinan alasan untuk ini adalah:

  • Anda melampaui batas-batas array. C tidak memeriksa yang array subskrip Anda menulis untuk ini berlaku. Oleh karena itu, Anda dapat dengan mudah menulis memori Anda tidak sendiri.
  • Anda menggunakan pointer ke lokasi memori yang Anda telah dibebaskan. The pilihan terbaik adalah untuk menetapkan NULL ke semua pointer setelah Anda bebas mereka memori.
Kesalahan GP juga dapat terjadi saat salah jenis variabel berlalu untuk Fungsi DLL.

2.3 Contoh Visual Basic panggilan Program

Ada dua bagian untuk memanggil DLL dalam Visual Basic program. Pertama Anda menyatakan fungsi, dan kemudian Anda menggunakannya di acara kode.

Berikut adalah contoh dari pernyataan menetapkan. Menetapkan pernyataan harus menempatkan dalam modul atau dalam bentuk umum Deklarasi bagian.
   ' Enter the following Declare as one, single line:
   Declare Sub getdiskinfo Lib "c:\dllartic\diskinfo.dll"

      (ByVal mydrive As String, ByVal myvolume As String, free As Long)
				
Menentukan ByVal pernyataan persis seperti yang ditunjukkan, atau lain GP kesalahan mungkin terjadi.

Setelah fungsi menyatakan, Anda dapat menggunakannya di acara kode. Berikut contoh menggunakan fungsi dari DLL dalam acara Command1 klik kode:
   Sub Command1_Click ()
      Dim drive As String * 1
      Dim volume As String * 20
      Dim free As Long
      Call getdiskinfo(drive, volume, free)
      Text1.Text = drive
      Text2.Text = volume
      Text3.Text = Str$(free)
   End Sub
				

Berlaku bagi:
  • Microsoft Visual Basic 3.0 Professional Edition
Kata kunci: 
kbhowto kbprogramming kbmt KB106553 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:106553  (http://support.microsoft.com/kb/106553/en-us/ )
Retired KB ArticleSanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.