Bagikan melalui


Deklarasikan Pernyataan

Menyatakan referensi ke prosedur yang diterapkan dalam file eksternal.

Sintaksis

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

Bagian

Istilah Definisi
attributelist Fakultatif. Lihat Daftar Atribut.
accessmodifier Fakultatif. Dapat berupa salah satu hal berikut:

- Umum
- Dilindungi
- Teman
- Swasta
- Teman yang Dilindungi
- Dilindungi Privat

Lihat Tingkat akses di Visual Basic.
Shadows Fakultatif. Lihat Bayangan.
charsetmodifier Fakultatif. Menentukan kumpulan karakter dan informasi pencarian file. Dapat berupa salah satu hal berikut:

- Ansi (default)
- Unicode
- Auto
Sub Opsional, tetapi salah satu Sub atau Function harus muncul. Menunjukkan bahwa prosedur eksternal tidak mengembalikan nilai.
Function Opsional, tetapi salah satu Sub atau Function harus muncul. Menunjukkan bahwa prosedur eksternal mengembalikan nilai.
name Dibutuhkan. Nama referensi eksternal ini. Untuk informasi selengkapnya, lihat Nama Elemen yang Dinyatakan.
Lib Dibutuhkan. Memperkenalkan klausa Lib , yang mengidentifikasi file eksternal (DLL atau sumber daya kode) yang berisi prosedur eksternal.
libname Dibutuhkan. Nama file yang berisi prosedur yang dideklarasikan.
Alias Fakultatif. Menunjukkan bahwa prosedur yang dinyatakan tidak dapat diidentifikasi dalam filenya dengan nama yang ditentukan dalam name. Anda menentukan identifikasinya di aliasname.
aliasname Diperlukan jika Anda menggunakan Alias kata kunci. String yang mengidentifikasi prosedur dengan salah satu dari dua cara:

Nama titik entri prosedur dalam filenya, dalam tanda kutip ("")

-atau-

Tanda angka (#) diikuti dengan bilangan bulat yang menentukan nomor ordinal titik masuk prosedur dalam filenya
parameterlist Diperlukan jika prosedur mengambil parameter. Lihat Daftar Parameter.
returntype Diperlukan jika Function ditentukan dan Option Strict adalah On. Jenis data nilai yang dikembalikan oleh prosedur.

Komentar

Terkadang Anda perlu memanggil prosedur yang ditentukan dalam file (seperti DLL atau sumber daya kode) di luar proyek Anda. Ketika Anda melakukan ini, pengkompilasi Visual Basic tidak memiliki akses ke informasi yang diperlukan untuk memanggil prosedur dengan benar, seperti di mana prosedur berada, bagaimana ia diidentifikasi, urutan panggilan dan jenis pengembaliannya, dan karakter string yang digunakannya. Pernyataan ini Declare membuat referensi ke prosedur eksternal dan menyediakan informasi yang diperlukan ini.

Anda hanya dapat menggunakan Declare pada tingkat modul. Ini berarti konteks deklarasi untuk referensi eksternal harus merupakan kelas, struktur, atau modul, dan tidak dapat menjadi file sumber, namespace, antarmuka, prosedur, atau blok. Untuk informasi selengkapnya, lihat Konteks Deklarasi dan Tingkat Akses Bawaan.

Referensi eksternal default ke Akses publik . Anda dapat menyesuaikan tingkat aksesnya dengan pengubah akses.

Aturan

  • Atribut. Anda dapat menerapkan atribut ke referensi eksternal. Atribut apa pun yang Anda terapkan hanya berlaku di proyek Anda, bukan di file eksternal.

  • Pengubah. Prosedur eksternal dibagikan secara implisit. Anda tidak dapat menggunakan Shared kata kunci saat mendeklarasikan referensi eksternal, dan Anda tidak dapat mengubah status berbaginya.

    Prosedur eksternal tidak dapat berpartisipasi dalam mengambil alih, menerapkan anggota antarmuka, atau menangani peristiwa. Oleh karena ituOverrides, Anda tidak dapat menggunakan kata kunci , , OverridableNotOverridable, MustOverrideImplements, atau Handles dalam Declare pernyataan.

  • Nama Prosedur Eksternal. Anda tidak perlu memberikan referensi eksternal ini nama yang sama (dalam name) sebagai nama titik masuk prosedur dalam file eksternalnya (aliasname). Anda dapat menggunakan Alias klausul untuk menentukan nama titik masuk. Ini dapat berguna jika prosedur eksternal memiliki nama yang sama dengan pengubah cadangan Visual Basic atau variabel, prosedur, atau elemen pemrograman lainnya dalam cakupan yang sama.

    Nota

    Nama titik entri di sebagian besar DLL peka huruf besar/kecil.

  • Nomor Prosedur Eksternal. Atau, Anda dapat menggunakan klausul Alias untuk menentukan jumlah ordinal titik masuk dalam tabel ekspor file eksternal. Untuk melakukan ini, Anda mulai aliasname dengan tanda angka (#). Ini dapat berguna jika ada karakter dalam nama prosedur eksternal yang tidak diizinkan di Visual Basic, atau jika file eksternal mengekspor prosedur tanpa nama.

Aturan Tipe Data

  • Jenis Data Parameter. Jika Option Strict adalah On, Anda harus menentukan jenis data setiap parameter di parameterlist. Ini bisa berupa jenis data apa pun atau nama enumerasi, struktur, kelas, atau antarmuka. Dalam parameterlist, Anda menggunakan As klausul untuk menentukan jenis data argumen yang akan diteruskan ke setiap parameter.

    Nota

    Jika prosedur eksternal tidak ditulis untuk .NET Framework, Anda harus berhati-hati bahwa jenis data sesuai. Misalnya, jika Anda mendeklarasikan referensi eksternal ke prosedur Visual Basic 6.0 dengan Integer parameter (16 bit di Visual Basic 6.0), Anda harus mengidentifikasi argumen yang sesuai seperti Short dalam Declare pernyataan, karena itu adalah jenis bilangan bulat 16-bit di Visual Basic. Demikian pula, Long memiliki lebar data yang berbeda di Visual Basic 6.0, dan Date diimplementasikan secara berbeda.

  • Kembalikan Tipe Data. Jika prosedur eksternal adalah Function dan Option Strict adalah On, Anda harus menentukan jenis data nilai yang dikembalikan ke kode panggilan. Ini bisa berupa jenis data apa pun atau nama enumerasi, struktur, kelas, atau antarmuka.

    Nota

    Pengkompilasi Visual Basic tidak memverifikasi bahwa jenis data Anda kompatibel dengan jenis dari prosedur eksternal. Jika ada ketidakcocokan, runtime bahasa umum menghasilkan MarshalDirectiveException pengecualian pada waktu proses.

  • Jenis Data Default. Jika Option Strict adalah Off dan Anda tidak menentukan jenis data parameter di parameterlist, pengkompilasi Visual Basic mengonversi argumen yang sesuai ke Tipe Data Objek. Demikian pula, jika Anda tidak menentukan returntype, pengkompilasi mengambil jenis data kembali menjadi Object.

    Nota

    Karena Anda berurusan dengan prosedur eksternal yang mungkin telah ditulis pada platform yang berbeda, berbahaya untuk membuat asumsi tentang jenis data atau untuk memungkinkannya default. Jauh lebih aman untuk menentukan jenis data setiap parameter dan nilai pengembalian, jika ada. Ini juga meningkatkan keterbacaan kode Anda.

Perilaku

  • Ruang lingkup. Referensi eksternal berada dalam cakupan di seluruh kelas, struktur, atau modulnya.

  • Seumur hidup. Referensi eksternal memiliki masa pakai yang sama dengan kelas, struktur, atau modul tempat referensi dideklarasikan.

  • Memanggil Prosedur Eksternal. Anda memanggil prosedur eksternal dengan cara yang sama seperti Anda memanggil Function prosedur atau Sub —dengan menggunakannya dalam ekspresi jika mengembalikan nilai, atau dengan menentukannya dalam Pernyataan Panggilan jika tidak mengembalikan nilai.

    Anda meneruskan argumen ke prosedur eksternal persis seperti yang ditentukan oleh parameterlist dalam Declare pernyataan. Jangan memperhitungkan bagaimana parameter awalnya dideklarasikan dalam file eksternal. Demikian pula, jika ada nilai pengembalian, gunakan persis seperti yang ditentukan oleh returntype dalam Declare pernyataan.

  • Set Karakter. Anda dapat menentukan bagaimana charsetmodifier Visual Basic harus melakukan marshal string saat memanggil prosedur eksternal. Pengubah Ansi mengarahkan Visual Basic untuk marshal semua string ke nilai ANSI, dan Unicode pengubah mengarahkannya ke marshal semua string ke nilai Unicode. Pengubah Auto mengarahkan Visual Basic ke string marshal sesuai dengan aturan .NET Framework berdasarkan referensi nameeksternal , atau aliasname jika ditentukan. Nilai defaultnya adalah Ansi.

    charsetmodifier juga menentukan bagaimana Visual Basic harus mencari prosedur eksternal dalam file eksternalnya. Ansi dan Unicode keduanya mengarahkan Visual Basic untuk mencarinya tanpa memodifikasi namanya selama pencarian. Auto mengarahkan Visual Basic untuk menentukan kumpulan karakter dasar platform run-time dan mungkin mengubah nama prosedur eksternal, sebagai berikut:

    • Pada platform Unicode, seperti Windows, pertama-tama cari prosedur eksternal tanpa modifikasi nama. Jika gagal, tambahkan "W" ke akhir nama prosedur eksternal dan cari lagi.

    • Pada platform ANSI, pertama-tama cari prosedur eksternal tanpa modifikasi nama. Jika gagal, tambahkan "A" ke akhir nama prosedur eksternal dan cari lagi.

  • Mekanisme. Visual Basic menggunakan mekanisme pemanggilan platform .NET Framework (PInvoke) untuk menyelesaikan dan mengakses prosedur eksternal. Pernyataan Declare dan DllImportAttribute kelas keduanya menggunakan mekanisme ini secara otomatis, dan Anda tidak memerlukan pengetahuan tentang PInvoke. Untuk informasi selengkapnya, lihat Panduan: Memanggil API Windows.

Penting

Jika prosedur eksternal berjalan di luar runtime bahasa umum (CLR), itu adalah kode yang tidak dikelola. Saat Anda memanggil prosedur seperti itu, misalnya fungsi Windows API atau metode COM, Anda mungkin mengekspos aplikasi Anda terhadap risiko keamanan. Untuk informasi selengkapnya, lihat Panduan Pengodean Aman untuk Kode Tidak Terkelola.

Contoh 1

Contoh berikut mendeklarasikan referensi eksternal ke Function prosedur yang mengembalikan nama pengguna saat ini. Kemudian memanggil prosedur GetUserNameA eksternal sebagai bagian getUser dari prosedur.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
    ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
    Dim buffer As String = New String(CChar(" "), 25)
    Dim retVal As Integer = GetUserName(buffer, 25)
    Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
    MsgBox(userName)
End Sub

Contoh 2

DllImportAttribute menyediakan cara alternatif untuk menggunakan fungsi dalam kode yang tidak dikelola. Contoh berikut mendeklarasikan fungsi yang diimpor tanpa menggunakan Declare pernyataan.

' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",
    SetLastError:=True, CharSet:=CharSet.Unicode,
    ExactSpelling:=True,
    CallingConvention:=CallingConvention.StdCall)>
Public Shared Function MoveFile(ByVal src As String,
  ByVal dst As String) As Boolean
    ' This function copies a file from the path src to the path dst.
    ' Leave this function empty. The DLLImport attribute forces calls
    ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

Lihat juga