Bagikan melalui


Panduan: Memanggil API Windows (Visual Basic)

WINDOWS API adalah pustaka tautan dinamis (DLL) yang merupakan bagian dari sistem operasi Windows. Anda menggunakannya untuk melakukan tugas ketika sulit untuk menulis prosedur yang setara dengan prosedur Anda sendiri. Misalnya, Windows menyediakan fungsi bernama FlashWindowEx yang memungkinkan Anda membuat bilah judul untuk aplikasi bergantian antara nuansa terang dan gelap.

Keuntungan menggunakan API Windows dalam kode Anda adalah mereka dapat menghemat waktu pengembangan karena berisi puluhan fungsi berguna yang sudah ditulis dan menunggu untuk digunakan. Kerugiannya adalah bahwa API Windows bisa sulit untuk bekerja dengan dan tidak memaafkan ketika segala sesuatunya salah.

API Windows mewakili kategori interoperabilitas khusus. API Windows tidak menggunakan kode terkelola, tidak memiliki pustaka jenis bawaan, dan menggunakan jenis data yang berbeda dari yang digunakan dengan Visual Studio. Karena perbedaan ini, dan karena API Windows bukan objek COM, interoperabilitas dengan API Windows dan .NET Framework dilakukan menggunakan pemanggilan platform, atau PInvoke. Platform Invoke adalah layanan yang memungkinkan kode terkelola untuk memanggil fungsi tidak terkelola yang diimplementasikan dalam DLL. Untuk informasi selengkapnya, lihat Mengonsumsi Fungsi DLL Tidak Terkelola. Anda dapat menggunakan PInvoke di Visual Basic dengan menggunakan Declare pernyataan atau menerapkan DllImport atribut ke prosedur kosong.

Panggilan WINDOWS API adalah bagian penting dari pemrograman Visual Basic di masa lalu, tetapi jarang diperlukan dengan Visual Basic .NET. Jika memungkinkan, Anda harus menggunakan kode terkelola dari .NET Framework untuk melakukan tugas, bukan panggilan Windows API. Panduan ini menyediakan informasi untuk situasi di mana menggunakan WINDOWS API diperlukan.

Nota

Komputer Anda mungkin menampilkan nama atau lokasi yang berbeda untuk beberapa elemen antarmuka pengguna Visual Studio dalam instruksi berikut. Edisi Visual Studio yang Anda miliki dan pengaturan yang Anda gunakan menentukan elemen-elemen ini. Untuk informasi lebih lanjut, lihat Mempersonalisasi IDE.

Panggilan API Menggunakan Deklarasi

Cara paling umum untuk memanggil API Windows adalah dengan menggunakan Declare pernyataan .

Untuk mendeklarasikan prosedur DLL

  1. Tentukan nama fungsi yang ingin Anda panggil, ditambah argumennya, jenis argumen, dan nilai yang dikembalikan, serta nama dan lokasi DLL yang berisinya.

    Nota

    Untuk informasi lengkap tentang WINDOWS API, lihat dokumentasi Win32 SDK di Platform SDK Windows API. Untuk informasi selengkapnya tentang konstanta yang digunakan WINDOWS API, periksa file header seperti Windows.h yang disertakan dengan Platform SDK.

  2. Buka proyek Aplikasi Windows baru dengan mengklik Baru pada menu File , lalu klik Proyek. Kotak dialog Proyek Baru muncul.

  3. Pilih Aplikasi Windows dari daftar templat proyek Visual Basic. Proyek baru telah ditampilkan.

  4. Tambahkan fungsi berikut Declare ke kelas atau modul tempat Anda ingin menggunakan DLL:

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (
        ByVal hWnd As Integer,
        ByVal txt As String,
        ByVal caption As String,
        ByVal Typ As Integer) As Integer
    

Bagian dari Pernyataan Deklarasi

Pernyataan ini Declare mencakup elemen-elemen berikut.

Pengubah otomatis

Pengubah Auto menginstruksikan runtime untuk mengonversi string berdasarkan nama metode sesuai dengan aturan runtime bahasa umum (atau nama alias jika ditentukan).

Kata kunci Lib dan Alias

Nama yang Function mengikuti kata kunci adalah nama yang digunakan program Anda untuk mengakses fungsi yang diimpor. Ini bisa sama dengan nama asli fungsi yang Anda panggil, atau Anda dapat menggunakan nama prosedur yang valid dan kemudian menggunakan Alias kata kunci untuk menentukan nama asli fungsi yang Anda panggil.

Lib Tentukan kata kunci, diikuti dengan nama dan lokasi DLL yang berisi fungsi yang Anda panggil. Anda tidak perlu menentukan jalur untuk file yang terletak di direktori sistem Windows.

Alias Gunakan kata kunci jika nama fungsi yang Anda panggil bukan nama prosedur Visual Basic yang valid, atau bertentangan dengan nama item lain dalam aplikasi Anda. Alias menunjukkan nama sebenarnya dari fungsi yang dipanggil.

Deklarasi Tipe Argumen dan Data

Deklarasikan argumen dan jenis datanya. Bagian ini bisa menantang karena jenis data yang digunakan Windows tidak sesuai dengan jenis data Visual Studio. Visual Basic melakukan banyak pekerjaan untuk Anda dengan mengonversi argumen ke jenis data yang kompatibel, proses yang disebut marshaling. Anda dapat secara eksplisit mengontrol bagaimana argumen dimarshall dengan menggunakan atribut MarshalAsAttribute yang ditentukan dalam namespace System.Runtime.InteropServices.

Nota

Versi Visual Basic sebelumnya memungkinkan Anda untuk mendeklarasikan parameter As Any, yang berarti bahwa data dari jenis data apa pun dapat digunakan. Visual Basic mengharuskan Anda menggunakan jenis data tertentu untuk semua Declare pernyataan.

Konstanta Windows API

Beberapa argumen adalah kombinasi konstanta. Misalnya, API yang MessageBox ditampilkan dalam panduan ini menerima argumen bilangan bulat yang disebut Typ yang mengontrol bagaimana kotak pesan ditampilkan. Anda dapat menentukan nilai numerik konstanta ini dengan memeriksa #define pernyataan dalam file WinUser.h. Nilai numerik umumnya ditampilkan dalam heksadesimal, jadi Anda mungkin ingin menggunakan kalkulator untuk menambahkannya dan mengonversinya ke desimal. Misalnya, jika Anda ingin menggabungkan konstanta untuk gaya MB_ICONEXCLAMATION seru 0x00000030 dan gaya MB_YESNO Ya/Tidak 0x00000004, Anda bisa menambahkan angka dan mendapatkan hasil 0x00000034, atau 52 desimal. Meskipun Anda dapat menggunakan hasil desimal secara langsung, lebih baik untuk mendeklarasikan nilai-nilai ini sebagai konstanta dalam aplikasi Anda dan menggabungkannya menggunakan Or operator.

Untuk mendeklarasikan konstanta untuk panggilan WINDOWS API
  1. Lihat dokumentasi untuk fungsi Windows yang Anda panggil. Tentukan nama konstanta yang digunakannya dan nama file .h yang berisi nilai numerik untuk konstanta ini.

  2. Gunakan editor teks, seperti Notepad, untuk melihat konten file header (.h), dan menemukan nilai yang terkait dengan konstanta yang Anda gunakan. Misalnya, MessageBox API menggunakan konstanta MB_ICONQUESTION untuk menampilkan tanda tanya di kotak pesan. Definisi untuk MB_ICONQUESTION berada di WinUser.h dan muncul sebagai berikut:

    #define MB_ICONQUESTION 0x00000020L

  3. Tambahkan pernyataan yang setara Const ke kelas atau modul Anda untuk membuat konstanta ini tersedia untuk aplikasi Anda. Contohnya:

    Const MB_ICONQUESTION As Integer = &H20
    Const MB_YESNO As Integer = &H4
    Const IDYES As Integer = 6
    Const IDNO As Integer = 7
    
Untuk memanggil prosedur DLL
  1. Tambahkan tombol bernama Button1 ke formulir startup untuk proyek Anda, lalu klik dua kali untuk menampilkan kodenya. Penanganan aktivitas untuk tombol ditampilkan.

  2. Tambahkan kode ke penanganan Click aktivitas untuk tombol yang Anda tambahkan, untuk memanggil prosedur dan memberikan argumen yang sesuai:

    Private Sub Button1_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button1.Click
    
        ' Stores the return value.
        Dim RetVal As Integer
        RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",
            MB_ICONQUESTION Or MB_YESNO)
    
        ' Check the return value.
        If RetVal = IDYES Then
            MsgBox("You chose Yes")
        Else
            MsgBox("You chose No")
        End If
    End Sub
    
  3. Jalankan proyek dengan menekan F5. Kotak pesan ditampilkan dengan tombol Ya dan Tidak ada respons. Klik salah satu.

Data Marshalling

Visual Basic secara otomatis mengonversi jenis data parameter dan mengembalikan nilai untuk panggilan Windows API, tetapi Anda dapat menggunakan MarshalAs atribut untuk secara eksplisit menentukan jenis data yang tidak dikelola yang diharapkan API. Untuk informasi selengkapnya tentang interop marshalling, lihat Interop Marshaling.

Untuk menggunakan Declare dan MarshalAs dalam panggilan API
  1. Tentukan nama fungsi yang ingin Anda panggil, ditambah argumennya, jenis data, dan nilai yang dikembalikan.

  2. Untuk menyederhanakan akses ke MarshalAs atribut, tambahkan Imports pernyataan ke bagian atas kode untuk kelas atau modul, seperti dalam contoh berikut:

    Imports System.Runtime.InteropServices
    
  3. Tambahkan prototipe fungsi untuk fungsi yang diimpor ke kelas atau modul yang Anda gunakan, dan terapkan MarshalAs atribut ke parameter atau nilai pengembalian. Dalam contoh berikut, panggilan API yang mengharapkan tipe void* dikonversi menjadi AsAny:

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (
        ByVal x As Short,
        <MarshalAsAttribute(UnmanagedType.AsAny)>
            ByVal o As Object)
    

Panggilan API Menggunakan DllImport

Atribut ini DllImport menyediakan cara kedua untuk memanggil fungsi di DLL tanpa pustaka jenis. DllImport kira-kira setara dengan menggunakan Declare pernyataan tetapi memberikan kontrol lebih besar atas bagaimana fungsi dipanggil.

Anda dapat menggunakan DllImport dengan sebagian besar panggilan Windows API selama panggilan mengacu pada metode bersama (kadang-kadang disebut statis). Anda tidak dapat menggunakan metode yang memerlukan instans kelas. Tidak seperti Declare pernyataan, DllImport panggilan tidak dapat menggunakan MarshalAs atribut .

Untuk memanggil API Windows menggunakan atribut DllImport

  1. Buka proyek Aplikasi Windows baru dengan mengklik Baru pada menu File , lalu klik Proyek. Kotak dialog Proyek Baru muncul.

  2. Pilih Aplikasi Windows dari daftar templat proyek Visual Basic. Proyek baru telah ditampilkan.

  3. Tambahkan tombol bernama Button2 ke formulir startup.

  4. Button2 Klik dua kali untuk membuka tampilan kode untuk formulir.

  5. Untuk menyederhanakan akses ke DllImport, tambahkan Imports pernyataan ke bagian atas kode untuk kelas formulir startup:

    Imports System.Runtime.InteropServices
    
  6. Deklarasikan fungsi kosong sebelum End Class pernyataan untuk formulir, dan beri nama fungsi MoveFile.

  7. Terapkan pengubah Public dan Shared ke deklarasi fungsi dan atur parameter untuk MoveFile berdasarkan argumen yang digunakan fungsi Windows API.

    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    

    Fungsi Anda dapat memiliki nama prosedur yang valid; DllImport atribut menentukan nama dalam DLL. Ini juga menangani marshalling interoperabilitas untuk parameter dan nilai balikan, sehingga Anda dapat memilih tipe data Visual Studio yang mirip dengan tipe data yang digunakan API.

  8. Terapkan DllImport atribut ke fungsi kosong. Parameter pertama adalah nama dan lokasi DLL yang berisi fungsi yang Anda panggil. Anda tidak perlu menentukan jalur untuk file yang terletak di direktori sistem Windows. Parameter kedua adalah argumen bernama yang menentukan nama fungsi di Windows API. Dalam contoh ini, DllImport atribut memaksa panggilan untuk MoveFile diteruskan ke MoveFileW dalam KERNEL32.DLL. Metode MoveFileW menyalin file dari jalur src ke jalur dst.

    <DllImport("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
        ' Leave the body of the function empty.
    End Function
    
  9. Tambahkan kode ke penanganan Button2_Click aktivitas untuk memanggil fungsi:

    Private Sub Button2_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button2.Click
    
        Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")
        If RetVal = True Then
            MsgBox("The file was moved successfully.")
        Else
            MsgBox("The file could not be moved.")
        End If
    End Sub
    
  10. Buat file bernama Test.txt dan letakkan di direktori C:\Tmp di hard drive Anda. Buat direktori Tmp jika perlu.

  11. Tekan F5 untuk memulai aplikasi. Formulir utama muncul.

  12. Klik Tombol2. Pesan "File berhasil dipindahkan" ditampilkan jika file dapat dipindahkan.

Lihat juga