Panduan: Membuat dan menggunakan Pustaka Dynamic Link Anda sendiri (C++)

Panduan langkah demi langkah ini menunjukkan cara menggunakan Visual Studio IDE untuk membuat pustaka tautan dinamis (DLL) Anda sendiri yang ditulis di Microsoft C++ (MSVC). Kemudian menunjukkan cara menggunakan DLL dari aplikasi C++ lain. DLL (juga dikenal sebagai pustaka bersama dalam sistem operasi berbasis UNIX) adalah salah satu jenis komponen Windows yang paling berguna. Anda dapat menggunakannya sebagai cara untuk berbagi kode dan sumber daya, dan untuk menyusutkan ukuran aplikasi Anda. DLL bahkan dapat mempermudah layanan dan memperluas aplikasi Anda.

Dalam panduan ini, Anda akan membuat DLL yang mengimplementasikan beberapa fungsi matematika. Kemudian Anda akan membuat aplikasi konsol yang menggunakan fungsi dari DLL. Anda juga akan mendapatkan pengenalan beberapa teknik dan konvensi pemrograman yang digunakan di DLL Windows.

Panduan ini mencakup tugas-tugas ini:

  • Buat proyek DLL di Visual Studio.

  • Tambahkan fungsi dan variabel yang diekspor ke DLL.

  • Buat proyek aplikasi konsol di Visual Studio.

  • Gunakan fungsi dan variabel yang diimpor dari DLL di aplikasi konsol.

  • Jalankan aplikasi yang telah selesai.

Seperti pustaka yang ditautkan secara statis, DLL mengekspor variabel, fungsi, dan sumber daya berdasarkan nama. Aplikasi klien mengimpor nama untuk menggunakan variabel, fungsi, dan sumber daya tersebut. Tidak seperti pustaka yang ditautkan secara statis, Windows menyambungkan impor di aplikasi Anda ke ekspor dalam DLL pada waktu pemuatan atau pada waktu proses, alih-alih menyambungkannya pada waktu tautan. Windows memerlukan informasi tambahan yang bukan bagian dari model kompilasi C++ standar untuk membuat koneksi ini. Pengkompilasi MSVC mengimplementasikan beberapa ekstensi khusus Microsoft ke C++ untuk memberikan informasi tambahan ini. Kami menjelaskan ekstensi ini saat kami pergi.

Panduan ini menciptakan dua solusi Visual Studio; yang membangun DLL, dan yang membangun aplikasi klien. DLL menggunakan konvensi panggilan C. Ini dapat dipanggil dari aplikasi yang ditulis dalam bahasa pemrograman lain, selama platform, konvensi panggilan, dan konvensi penautan cocok. Aplikasi klien menggunakan penautan implisit, di mana Windows menautkan aplikasi ke DLL pada waktu muat. Penautan ini memungkinkan aplikasi memanggil fungsi yang disediakan DLL seperti fungsi dalam pustaka yang ditautkan secara statis.

Panduan ini tidak mencakup beberapa situasi umum. Kode tidak menunjukkan penggunaan DLL C++ oleh bahasa pemrograman lainnya. Ini tidak menunjukkan cara membuat DLL khusus sumber daya, atau cara menggunakan penautan eksplisit untuk memuat DLL pada run-time daripada pada waktu pemuatan. Yakinlah, Anda dapat menggunakan MSVC dan Visual Studio untuk melakukan semua hal ini.

Meskipun kode DLL ditulis dalam C++, kami telah menggunakan antarmuka gaya C untuk fungsi yang diekspor. Ada dua alasan utama untuk ini: Pertama, banyak bahasa lain mendukung impor fungsi gaya C. Aplikasi klien tidak harus ditulis dalam C++. Kedua, ini menghindari beberapa perangkap umum yang terkait dengan kelas yang diekspor dan fungsi anggota. Sangat mudah untuk membuat kesalahan yang sulit didiagnosis saat mengekspor kelas, karena semuanya yang dimaksud dalam deklarasi kelas harus memiliki instansiasi yang juga diekspor. Pembatasan ini berlaku untuk DLL, tetapi bukan pustaka statis. Jika kelas Anda bergaya data biasa-lama, Anda tidak boleh mengalami masalah ini.

Untuk tautan ke informasi selengkapnya tentang DLL, lihat Membuat DLL C/C++ di Visual Studio. Untuk informasi selengkapnya tentang penautan implisit dan penautan eksplisit, lihat Menentukan metode penautan mana yang akan digunakan. Untuk informasi tentang membuat DLL C++ untuk digunakan dengan bahasa pemrograman yang menggunakan konvensi tautan bahasa C, lihat Mengekspor fungsi C++ untuk digunakan dalam executable bahasa C. Untuk informasi tentang cara membuat DLL untuk digunakan dengan bahasa .NET, lihat Memanggil Fungsi DLL dari Aplikasi Visual Basic.

Prasyarat

  • Komputer yang menjalankan Microsoft Windows 7 atau versi yang lebih baru. Kami merekomendasikan versi terbaru Windows untuk pengalaman pengembangan terbaik.
  • Salinan Visual Studio. Untuk informasi tentang cara mengunduh dan menginstal Visual Studio, lihat Menginstal Visual Studio. Saat Anda menjalankan alat penginstal, pastikan bahwa pengembangan Desktop dengan beban kerja C++ dicentang. Jangan khawatir jika Anda tidak menginstal beban kerja ini saat menginstal Visual Studio. Anda dapat menjalankan alat penginstal lagi dan menginstalnya sekarang.

    Visual Studio Installer, Desktop development with C++ workload.

  • Salinan Visual Studio. Untuk informasi tentang cara mengunduh dan menginstal Visual Studio 2015, lihat Menginstal Visual Studio 2015. Gunakan penginstalan Kustom untuk menginstal pengkompilasi dan alat C++, karena tidak diinstal secara default.
  • Pemahaman tentang dasar-dasar penggunaan Ide Visual Studio. Jika Anda telah menggunakan aplikasi desktop Windows sebelumnya, Anda mungkin dapat mengikutinya. Untuk pengenalan, lihat tur fitur Visual Studio IDE.

  • Pemahaman tentang cukup tentang dasar-dasar bahasa C++ untuk diikuti. Jangan khawatir, kami tidak melakukan sesuatu yang terlalu rumit.

Catatan

Panduan ini mengasumsikan Anda menggunakan Visual Studio 2017 versi 15.9 atau yang lebih baru. Beberapa versi Visual Studio 2017 yang lebih lama memiliki cacat dalam templat kode, atau menggunakan dialog antarmuka pengguna yang berbeda. Untuk menghindari masalah, gunakan Penginstal Visual Studio untuk memperbarui Visual Studio 2017 ke versi 15.9 atau yang lebih baru.

Membuat proyek DLL

Dalam kumpulan tugas ini, Anda membuat proyek untuk DLL Anda, menambahkan kode, dan membangunnya. Untuk memulai, mulai Ide Visual Studio, dan masuk jika perlu. Instruksinya sedikit bervariasi tergantung pada versi Visual Studio mana yang Anda gunakan. Pastikan Anda memilih versi yang benar di kontrol di kiri atas halaman ini.

Untuk membuat proyek DLL di Visual Studio 2019

  1. Pada bilah menu, pilih File>New>Project untuk membuka kotak dialog Create a New Project.

    Screenshot of the Create a new project dialog with the Dynamic Link Library template highlighted.

  2. Di bagian atas dialog, atur Bahasa ke C++, atur Platform ke Windows, dan atur Jenis proyek ke Pustaka.

  3. Dari daftar jenis proyek yang difilter, pilih Pustaka Tautan dinamis (DLL), lalu pilih Berikutnya.

  4. Di halaman Konfigurasikan proyek baru Anda, masukkan MathLibrary di kotak Nama proyek untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Hapus centang Tempatkan solusi dan proyek di direktori yang sama jika dicentang.

  5. Pilih tombol Buat untuk membuat proyek.

Saat solusi dibuat, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.

Screenshot of the Solution Explorer window with the Math Library project highlighted.

Untuk membuat proyek DLL di Visual Studio 2017

  1. Pada bilah menu, pilih File>New>Project untuk membuka kotak dialog New Project.

  2. Di panel kiri kotak dialog Proyek Baru, pilih Visual C++>Windows Desktop terinstal>. Di panel tengah, pilih Pustaka Dynamic-Link (DLL). Masukkan MathLibrary dalam kotak Nama untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika tidak dicentang.

    Screenshot of the New Project dialog box showing Math Library in the Name text box.

  3. Pilih tombol OK untuk membuat proyek penyiapan.

Saat solusi dibuat, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.

Screenshot of the Solution Explorer window with the Math Library highlighted.

Untuk membuat proyek DLL di Visual Studio 2015 dan versi yang lebih lama

  1. Dari bilah menu, pilih File>New>Project.

  2. Di panel kiri kotak dialog Proyek Baru, perluas Templat terinstal>, dan pilih Visual C++, lalu di panel tengah, pilih Aplikasi Konsol Win32. Masukkan MathLibrary di kotak Edit nama untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika tidak dicentang.

    Screenshot of the New Project dialog box showing Math Library in the Name text box.

  3. Pilih tombol OK untuk menutup dialog Proyek Baru dan memulai Panduan Aplikasi Win32.

    Screenshot of the Win32 Application Wizard Overview page.

  4. Pilih tombol Berikutnya. Pada halaman Pengaturan Aplikasi, di bawah Jenis aplikasi, pilih DLL.

    Screenshot of the Win32 Application Wizard Application Settings Page.

  5. Pilih tombol Selesai untuk membuat proyek.

Saat wizard menyelesaikan solusi, Anda dapat melihat file proyek dan sumber yang dihasilkan di jendela Penjelajah Solusi di Visual Studio.

Screenshot of the Solution Explorer window with the Math Library highlighted.

Saat ini, DLL ini tidak melakukan banyak hal. Selanjutnya, Anda akan membuat file header untuk mendeklarasikan fungsi yang diekspor DLL Anda, lalu menambahkan definisi fungsi ke DLL untuk membuatnya lebih berguna.

Untuk menambahkan file header ke DLL

  1. Untuk membuat file header untuk fungsi Anda, pada bilah menu, pilih Proyek>Tambahkan Item Baru.

  2. Dalam kotak dialog Tambahkan Item Baru, di panel kiri, pilih Visual C++. Di panel tengah, pilih File Header (.h). Tentukan MathLibrary.h sebagai nama untuk file header.

    Screenshot of the Add New Item dialog with the C plus plus Header File template selected, and MathLibrary.h entered in the Name textbox.

  3. Pilih tombol Tambahkan untuk menghasilkan file header kosong, yang ditampilkan di jendela editor baru.

    Screenshot of the empty MathLibrary.h file in the editor.

  4. Ganti isi file header dengan kode ini:

    // MathLibrary.h - Contains declarations of math functions
    #pragma once
    
    #ifdef MATHLIBRARY_EXPORTS
    #define MATHLIBRARY_API __declspec(dllexport)
    #else
    #define MATHLIBRARY_API __declspec(dllimport)
    #endif
    
    // The Fibonacci recurrence relation describes a sequence F
    // where F(n) is { n = 0, a
    //               { n = 1, b
    //               { n > 1, F(n-2) + F(n-1)
    // for some initial integral values a and b.
    // If the sequence is initialized F(0) = 1, F(1) = 1,
    // then this relation produces the well-known Fibonacci
    // sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    extern "C" MATHLIBRARY_API void fibonacci_init(
        const unsigned long long a, const unsigned long long b);
    
    // Produce the next value in the sequence.
    // Returns true on success and updates current value and index;
    // false on overflow, leaves current value and index unchanged.
    extern "C" MATHLIBRARY_API bool fibonacci_next();
    
    // Get the current value in the sequence.
    extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();
    
    // Get the position of the current value in the sequence.
    extern "C" MATHLIBRARY_API unsigned fibonacci_index();
    

File header ini mendeklarasikan beberapa fungsi untuk menghasilkan urutan Fibonacci umum, mengingat dua nilai awal. Panggilan untuk fibonacci_init(1, 1) menghasilkan urutan nomor Fibonacci yang akrab.

Perhatikan pernyataan prapemroscessor di bagian atas file. Templat proyek baru untuk proyek DLL ditambahkan <PROJECTNAME>_EXPORTS ke makro praprosesor yang ditentukan. Dalam contoh ini, Visual Studio menentukan MATHLIBRARY_EXPORTS kapan proyek MAthLibrary DLL Anda dibangun.

MATHLIBRARY_EXPORTS Saat makro ditentukan, MATHLIBRARY_API makro mengatur pengubah __declspec(dllexport) pada deklarasi fungsi. Pengubah ini memberi tahu pengkompilasi dan linker untuk mengekspor fungsi atau variabel dari DLL untuk digunakan oleh aplikasi lain. Ketika MATHLIBRARY_EXPORTS tidak terdefinisi, misalnya, ketika file header disertakan oleh aplikasi klien, MATHLIBRARY_API menerapkan __declspec(dllimport) pengubah ke deklarasi. Pengubah ini mengoptimalkan impor fungsi atau variabel dalam aplikasi. Untuk informasi selengkapnya, lihat dllexport, dllimport.

Untuk menambahkan implementasi ke DLL

  1. Di Penjelajah Solusi, klik kanan pada simpul File Sumber dan pilih Tambahkan>Item Baru. Buat file .cpp baru yang disebut MathLibrary.cpp, dengan cara yang sama seperti Anda menambahkan file header baru di langkah sebelumnya.

  2. Di jendela editor, pilih tab untuk MathLibrary.cpp jika sudah terbuka. Jika tidak, di Penjelajah Solusi, klik dua kali MathLibrary.cpp di folder File Sumber proyek MathLibrary untuk membukanya.

  3. Di editor, ganti konten file MathLibrary.cpp dengan kode berikut:

    // MathLibrary.cpp : Defines the exported functions for the DLL.
    #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
    #include <utility>
    #include <limits.h>
    #include "MathLibrary.h"
    
    // DLL internal state variables:
    static unsigned long long previous_;  // Previous value, if any
    static unsigned long long current_;   // Current sequence value
    static unsigned index_;               // Current seq. position
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    void fibonacci_init(
        const unsigned long long a,
        const unsigned long long b)
    {
        index_ = 0;
        current_ = a;
        previous_ = b; // see special case when initialized
    }
    
    // Produce the next value in the sequence.
    // Returns true on success, false on overflow.
    bool fibonacci_next()
    {
        // check to see if we'd overflow result or position
        if ((ULLONG_MAX - previous_ < current_) ||
            (UINT_MAX == index_))
        {
            return false;
        }
    
        // Special case when index == 0, just return b value
        if (index_ > 0)
        {
            // otherwise, calculate next sequence value
            previous_ += current_;
        }
        std::swap(current_, previous_);
        ++index_;
        return true;
    }
    
    // Get the current value in the sequence.
    unsigned long long fibonacci_current()
    {
        return current_;
    }
    
    // Get the current index position in the sequence.
    unsigned fibonacci_index()
    {
        return index_;
    }
    
  1. Di jendela editor, pilih tab untuk MathLibrary.cpp jika sudah terbuka. Jika tidak, di Penjelajah Solusi, klik dua kali MathLibrary.cpp di folder File Sumber proyek MathLibrary untuk membukanya.

  2. Di editor, ganti konten file MathLibrary.cpp dengan kode berikut:

    // MathLibrary.cpp : Defines the exported functions for the DLL.
    #include "stdafx.h" // use pch.h in Visual Studio 2019 and later
    #include <utility>
    #include <limits.h>
    #include "MathLibrary.h"
    
    // DLL internal state variables:
    static unsigned long long previous_;  // Previous value, if any
    static unsigned long long current_;   // Current sequence value
    static unsigned index_;               // Current seq. position
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    void fibonacci_init(
        const unsigned long long a,
        const unsigned long long b)
    {
        index_ = 0;
        current_ = a;
        previous_ = b; // see special case when initialized
    }
    
    // Produce the next value in the sequence.
    // Returns true on success, false on overflow.
    bool fibonacci_next()
    {
        // check to see if we'd overflow result or position
        if ((ULLONG_MAX - previous_ < current_) ||
            (UINT_MAX == index_))
        {
            return false;
        }
    
        // Special case when index == 0, just return b value
        if (index_ > 0)
        {
            // otherwise, calculate next sequence value
            previous_ += current_;
        }
        std::swap(current_, previous_);
        ++index_;
        return true;
    }
    
    // Get the current value in the sequence.
    unsigned long long fibonacci_current()
    {
        return current_;
    }
    
    // Get the current index position in the sequence.
    unsigned fibonacci_index()
    {
        return index_;
    }
    

Untuk memverifikasi bahwa semuanya berfungsi sejauh ini, kompilasi pustaka tautan dinamis. Untuk mengkompilasi, pilih Build>Build Solution pada bilah menu. DLL dan output kompilator terkait ditempatkan dalam folder yang disebut Debug tepat di bawah folder solusi. Jika Anda membuat build Rilis, output ditempatkan di folder bernama Rilis. Outputnya akan terlihat seperti ini:

1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>pch.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>stdafx.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>MathLibrary.cpp
1>dllmain.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.pdb (Partial PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Selamat, Anda telah membuat DLL menggunakan Visual Studio! Selanjutnya, Anda akan membuat aplikasi klien yang menggunakan fungsi yang diekspor oleh DLL.

Membuat aplikasi klien yang menggunakan DLL

Saat Anda membuat DLL, pikirkan tentang bagaimana aplikasi klien dapat menggunakannya. Untuk memanggil fungsi atau mengakses data yang diekspor oleh DLL, kode sumber klien harus memiliki deklarasi yang tersedia pada waktu kompilasi. Pada waktu tautan, linker memerlukan informasi untuk menyelesaikan panggilan fungsi atau akses data. DLL menyediakan informasi ini di pustaka impor, file yang berisi informasi tentang cara menemukan fungsi dan data, bukan kode aktual. Dan pada waktu proses, DLL harus tersedia untuk klien, di lokasi yang dapat ditemukan sistem operasi.

Baik itu milik Anda sendiri atau dari pihak ketiga, proyek aplikasi klien Anda memerlukan beberapa informasi untuk menggunakan DLL. Ini perlu menemukan header yang mendeklarasikan ekspor DLL, pustaka impor untuk linker, dan DLL itu sendiri. Salah satu solusinya adalah menyalin semua file ini ke dalam proyek klien Anda. Untuk DLL pihak ketiga yang tidak mungkin berubah saat klien Anda sedang dalam pengembangan, metode ini mungkin cara terbaik untuk menggunakannya. Namun, ketika Anda juga membangun DLL, lebih baik menghindari duplikasi. Jika Anda membuat salinan lokal file DLL yang sedang dikembangkan, Anda mungkin secara tidak sengaja mengubah file header dalam satu salinan tetapi tidak yang lain, atau menggunakan pustaka yang sudah kedaluarsa.

Untuk menghindari kode di luar sinkronisasi, kami sarankan Anda mengatur jalur sertakan dalam proyek klien Anda untuk menyertakan file header DLL langsung dari proyek DLL Anda. Selain itu, atur jalur pustaka di proyek klien Anda untuk menyertakan pustaka impor DLL dari proyek DLL. Dan akhirnya, salin DLL bawaan dari proyek DLL ke direktori output build klien Anda. Langkah ini memungkinkan aplikasi klien Anda untuk menggunakan kode DLL yang sama dengan yang Anda buat.

Untuk membuat aplikasi klien di Visual Studio

  1. Pada bilah menu, pilih File>Proyek Baru>untuk membuka kotak dialog Buat proyek baru.

  2. Di bagian atas dialog, atur Bahasa ke C++, atur Platform ke Windows, dan atur jenis Project ke Konsol.

  3. Dari daftar jenis proyek yang difilter, pilih Aplikasi Konsol lalu pilih Berikutnya.

  4. Di halaman Konfigurasikan proyek baru Anda, masukkan MathClient di kotak Nama proyek untuk menentukan nama proyek. Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Hapus centang Tempatkan solusi dan proyek di direktori yang sama jika dicentang.

    Screenshot of the Create a new project dialog box with the Console App option highlighted.

  5. Pilih tombol Buat untuk membuat proyek klien.

Proyek aplikasi konsol minimal dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, ini bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.

Untuk membuat aplikasi klien di Visual Studio 2017

  1. Untuk membuat aplikasi C++ yang menggunakan DLL yang Anda buat, pada bilah menu, pilih File>Proyek Baru.>

  2. Di panel kiri dialog Proyek Baru, pilih Windows Desktop di bawah Visual C++terinstal>. Di panel tengah, pilih Aplikasi Konsol Windows. Tentukan nama untuk proyek, MathClient, dalam kotak Edit nama . Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika tidak dicentang.

    Screenshot of the New Project dialog box with Installed > Visual C plus plus > Windows Desktop selected, Windows Console Application highlighted, and Math Client typed in the Name text box.

  3. Pilih OK untuk membuat proyek aplikasi klien.

Proyek aplikasi konsol minimal dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, ini bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.

Untuk membuat aplikasi klien di Visual Studio 2015

  1. Untuk membuat aplikasi C++ yang menggunakan DLL yang Anda buat, pada bilah menu, pilih File>Proyek Baru.>

  2. Di panel kiri dialog Proyek Baru, pilih Win32 di bawah Templat Terinstal>>Visual C++. Di panel tengah, pilih Aplikasi Konsol Win32. Tentukan nama untuk proyek, MathClient, dalam kotak Edit nama . Biarkan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika tidak dicentang.

    Screenshot of the New Project dialog box with Installed > Templates > Visual C plus plus > Win32 selected, Win32 Console Application Visual C plus plus highlighted, and Math Client typed in the Name text box.

  3. Pilih tombol OK untuk menutup dialog Proyek Baru dan memulai Panduan Aplikasi Win32. Pada halaman Gambaran Umum kotak dialog Panduan Aplikasi Win32, pilih tombol Berikutnya .

  4. Pada halaman Pengaturan Aplikasi, di bawah Jenis aplikasi, pilih Aplikasi konsol jika belum dipilih.

  5. Pilih tombol Selesai untuk membuat proyek.

Setelah wizard selesai, proyek aplikasi konsol minimal dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, ini bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.

Selanjutnya, untuk memanggil fungsi MathLibrary dalam kode sumber Anda, proyek Anda harus menyertakan file MathLibrary.h . Anda dapat menyalin file header ini ke proyek aplikasi klien Anda, lalu menambahkannya ke proyek sebagai item yang sudah ada. Metode ini bisa menjadi pilihan yang baik untuk pustaka pihak ketiga. Namun, jika Anda mengerjakan kode untuk DLL dan klien Anda secara bersamaan, file header bisa tidak sinkron. Untuk menghindari masalah ini, atur jalur Sertakan Direktori Tambahan di proyek Anda untuk menyertakan jalur ke header asli.

Untuk menambahkan header DLL ke jalur sertakan Anda

  1. Klik kanan pada simpul MathClient di Penjelajah Solusi untuk membuka dialog Halaman Properti.

  2. Dalam kotak drop-down Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.

  3. Di panel kiri, pilih Properti>Konfigurasi C/C++>Umum.

  4. Di panel properti, pilih kontrol drop-down di samping kotak edit Sertakan Direktori Tambahan, lalu pilih Edit.

    Screenshot of the Property Pages dialog showing the Edit command in the Additional Include Directories property drop-down.

  5. Klik ganda di panel atas kotak dialog Sertakan Direktori Tambahan untuk mengaktifkan kontrol edit. Atau, pilih ikon folder untuk membuat entri baru.

  6. Dalam kontrol edit, tentukan jalur ke lokasi file header MathLibrary.h . Anda dapat memilih kontrol elipsis (...) untuk menelusuri ke folder yang benar.

    Anda juga dapat memasukkan jalur relatif dari file sumber klien Anda ke folder yang berisi file header DLL. Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari DLL, jalur relatif akan terlihat seperti ini:

    ..\..\MathLibrary\MathLibrary

    Jika DLL dan proyek klien Anda berada dalam solusi yang sama, jalur relatif mungkin terlihat seperti ini:

    ..\MathLibrary

    Ketika DLL dan proyek klien berada di folder lain, sesuaikan jalur relatif agar cocok. Atau, gunakan kontrol elipsis untuk menelusuri folder.

    Screenshot of the Additional Include Directories dialog showing the relative path to the MathLibrary directory.

  7. Setelah Anda memasukkan jalur ke file header dalam kotak dialog Sertakan Direktori Tambahan, pilih tombol OK . Dalam kotak dialog Halaman Properti, pilih tombol OK untuk menyimpan perubahan Anda.

Anda sekarang dapat menyertakan file MathLibrary.h dan menggunakan fungsi yang dinyatakannya dalam aplikasi klien Anda. Ganti konten MathClient.cpp dengan menggunakan kode ini:

// MathClient.cpp : Client app for MathLibrary DLL.
// #include "pch.h" Uncomment for Visual Studio 2017 and earlier
#include <iostream>
#include "MathLibrary.h"

int main()
{
    // Initialize a Fibonacci relation sequence.
    fibonacci_init(1, 1);
    // Write out the sequence values until overflow.
    do {
        std::cout << fibonacci_index() << ": "
            << fibonacci_current() << std::endl;
    } while (fibonacci_next());
    // Report count of values written before overflow.
    std::cout << fibonacci_index() + 1 <<
        " Fibonacci sequence values fit in an " <<
        "unsigned 64-bit integer." << std::endl;
}

Kode ini dapat dikompilasi, tetapi tidak ditautkan. Jika Anda membuat aplikasi klien sekarang, daftar kesalahan menampilkan beberapa kesalahan LNK2019. Itu karena proyek Anda kehilangan beberapa informasi: Anda belum menentukan bahwa proyek Anda memiliki dependensi pada pustaka MathLibrary.lib . Dan, Anda belum memberi tahu linker cara menemukan file MathLibrary.lib .

Untuk memperbaiki masalah ini, Anda dapat menyalin file pustaka langsung ke proyek aplikasi klien Anda. Linker akan menemukan dan menggunakannya secara otomatis. Namun, jika pustaka dan aplikasi klien sedang dikembangkan, yang mungkin menyebabkan perubahan dalam satu salinan yang tidak ditampilkan di salinan lainnya. Untuk menghindari masalah ini, Anda dapat mengatur properti Dependensi Tambahan untuk memberi tahu sistem build bahwa proyek Anda bergantung pada MathLibrary.lib. Dan, Anda dapat mengatur jalur Direktori Pustaka Tambahan dalam proyek Anda untuk menyertakan jalur ke pustaka asli saat Anda menautkan.

Untuk menambahkan pustaka impor DLL ke proyek Anda

  1. Klik kanan pada simpul MathClient di Penjelajah Solusi dan pilih Properti untuk membuka dialog Halaman Properti.

  2. Dalam kotak drop-down Konfigurasi , pilih Semua Konfigurasi jika belum dipilih. Ini memastikan bahwa setiap perubahan properti berlaku untuk build Debug dan Rilis.

  3. Di panel kiri, pilih Input Penghubung>Properti>Konfigurasi. Di panel properti, pilih kontrol drop-down di samping kotak edit Dependensi Tambahan, lalu pilih Edit.

    Screenshot of the Property Pages dialog showing the Edit command in the Linker > Input > Additional Dependencies property drop-down.

  4. Dalam dialog Dependensi Tambahan, tambahkan MathLibrary.lib ke daftar di kontrol edit atas.

    Screenshot of the Additional Dependencies dialog showing the MathLibrary.lib file.

  5. Pilih OK untuk kembali ke kotak dialog Halaman Properti.

  6. Di panel kiri, pilih Properti>Konfigurasi Linker>Umum. Di panel properti, pilih kontrol drop-down di samping kotak edit Direktori Pustaka Tambahan, lalu pilih Edit.

    Screenshot of the Property Pages dialog showing the Edit command in the Linker > General > Additional Library Directories property drop-down.

  7. Klik ganda di panel atas kotak dialog Direktori Pustaka Tambahan untuk mengaktifkan kontrol edit. Dalam kontrol edit, tentukan jalur ke lokasi file MathLibrary.lib . Secara default, folder tersebut berada di folder bernama Debug langsung di bawah folder solusi DLL. Jika Anda membuat build rilis, file ditempatkan di folder bernama Rilis. Anda dapat menggunakan $(IntDir) makro sehingga linker dapat menemukan DLL Anda, apa pun jenis build yang Anda buat. Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari proyek DLL, jalur relatif akan terlihat seperti ini:

    ..\..\MathLibrary\$(IntDir)

    Jika DLL dan proyek klien Anda berada di lokasi lain, sesuaikan jalur relatif agar sesuai.

    Screenshot of the Additional Library Directories dialog.

  8. Setelah Anda memasukkan jalur ke file pustaka dalam kotak dialog Direktori Pustaka Tambahan, pilih tombol OK untuk kembali ke kotak dialog Halaman Properti. Pilih OK untuk menyimpan perubahan properti.

Aplikasi klien Anda sekarang dapat mengkompilasi dan menautkan dengan sukses, tetapi masih tidak memiliki semua yang diperlukan untuk dijalankan. Saat sistem operasi memuat aplikasi Anda, sistem operasi mencari DLL MathLibrary. Jika tidak dapat menemukan DLL di direktori sistem tertentu, jalur lingkungan, atau direktori aplikasi lokal, beban gagal. Bergantung pada sistem operasi, Anda akan melihat pesan kesalahan seperti ini:

Screenshot of the error dialog, MathLibrary DLL not found.

Salah satu cara untuk menghindari masalah ini adalah dengan menyalin DLL ke direktori yang berisi klien Anda yang dapat dieksekusi sebagai bagian dari proses build. Anda dapat menambahkan Peristiwa Post-Build ke proyek Anda, untuk menambahkan perintah yang menyalin DLL ke direktori output build Anda. Perintah yang ditentukan di sini menyalin DLL hanya jika hilang atau telah berubah. Ini menggunakan makro untuk menyalin ke dan dari lokasi Debug atau Rilis, berdasarkan konfigurasi build Anda.

Untuk menyalin DLL dalam peristiwa pasca-build

  1. Klik kanan pada simpul MathClient di Penjelajah Solusi dan pilih Properti untuk membuka dialog Halaman Properti.

  2. Dalam kotak drop-down Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.

  3. Di panel kiri, pilih Properti>Konfigurasi Bangun Peristiwa>Pasca-Build Peristiwa.

  4. Di panel properti, pilih kontrol edit di bidang Baris Perintah. Jika Anda mengikuti petunjuk untuk menempatkan proyek klien Anda dalam solusi terpisah dari proyek DLL, maka masukkan perintah ini:

    xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"

    Jika DLL dan proyek klien Anda berada di direktori lain, ubah jalur relatif ke DLL agar cocok.

    Screenshot of the Property Pages dialog showing the post build event command line property.

  5. Pilih tombol OK untuk menyimpan perubahan Anda ke properti proyek.

Sekarang aplikasi klien Anda memiliki semua yang diperlukan untuk membangun dan menjalankan. Buat aplikasi dengan memilih Build>Build Solution pada bilah menu. Jendela Output di Visual Studio harus memiliki sesuatu seperti contoh berikut tergantung pada versi Visual Studio Anda:

1>------ Build started: Project: MathClient, Configuration: Debug Win32 ------
1>MathClient.cpp
1>MathClient.vcxproj -> C:\Users\username\Source\Repos\MathClient\Debug\MathClient.exe
1>1 File(s) copied
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Selamat, Anda telah membuat aplikasi yang memanggil fungsi di DLL Anda. Sekarang jalankan aplikasi Anda untuk melihat apa yang dilakukannya. Pada bilah menu, pilih Debug>Mulai Tanpa Penelusuran Kesalahan. Visual Studio membuka jendela perintah untuk menjalankan program. Bagian terakhir dari output akan terlihat seperti:

Screenshot of the command window output when you start the client app without debugging.

Tekan tombol apa pun untuk menutup jendela perintah.

Setelah membuat DLL dan aplikasi klien, Anda dapat bereksperimen. Coba atur titik henti dalam kode aplikasi klien, dan jalankan aplikasi di debugger. Lihat apa yang terjadi saat Anda masuk ke panggilan pustaka. Tambahkan fungsi lain ke pustaka, atau tulis aplikasi klien lain yang menggunakan DLL Anda.

Saat menyebarkan aplikasi, Anda juga harus menyebarkan DLL yang digunakannya. Cara paling sederhana untuk membuat DLL yang Anda buat, atau yang Anda sertakan dari pihak ketiga, tersedia adalah dengan menempatkannya di direktori yang sama dengan aplikasi Anda. Ini dikenal sebagai penyebaran lokal aplikasi. Untuk informasi selengkapnya tentang penyebaran, lihat Penyebaran di Visual C++.

Baca juga

Memanggil Fungsi DLL dari Aplikasi Visual Basic