Bagikan melalui


Panduan: Membuat dan menggunakan pustaka tautan dinamis Anda sendiri (C++)

Panduan langkah demi langkah ini menjelaskan cara menggunakan Visual Studio IDE untuk membuat pustaka tautan dinamis (DLL) Anda sendiri yang ditulis di Microsoft C++ (MSVC), dan 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 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 membuat DLL yang mengimplementasikan beberapa fungsi matematika. Kemudian Anda membuat aplikasi konsol yang menggunakan fungsi dari DLL. Anda juga mendapatkan pengantar beberapa teknik dan konvensi pemrograman yang digunakan di DLL Windows.

Panduan ini mencakup langkah-langkah berikut:

  • 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 seiring dengan berjalannya proses.

Panduan ini membuat 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, asalkan platform, konvensi pemanggilan, dan konvensi penautan sesuai. Aplikasi klien menggunakan penautan implisit, di mana Windows menautkan aplikasi ke DLL pada waktu pemuatan. 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 waktu proses daripada pada waktu pemuatan. Yakinlah, Anda dapat menggunakan MSVC dan Visual Studio untuk melakukan semua hal ini.

Meskipun kode DLL ditulis dalam C++, kami 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. Mudah sekali membuat kesalahan yang sulit didiagnosis saat mengekspor kelas, karena segala sesuatu yang disebutkan dalam deklarasi kelas harus memiliki instansiasi yang juga diekspor. Pembatasan ini berlaku untuk DLL, tetapi bukan pustaka statis. Jika kelas Anda bergaya data sederhana, Anda seharusnya tidak 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

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

    Cuplikan layar Alat Penginstal Visual Studio, Pengembangan desktop dengan beban kerja C++.

  • Studio Visual. 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 Lingkungan Pengembangan Terpadu (IDE) Visual Studio. Jika Anda pernah menggunakan aplikasi desktop Windows sebelumnya, Anda mungkin dapat mengikutinya. Untuk pengenalan, lihat panduan fitur Visual Studio IDE.

  • Beberapa keakraban dengan bahasa C++. Jangan khawatir, kami tidak melakukan sesuatu yang terlalu rumit.

Nota

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 berikut, Anda membuat proyek untuk DLL Anda, menambahkan kode, dan membangunnya. Untuk memulai, jalankan Visual Studio IDE, dan masuk jika perlu. Instruksinya sedikit bervariasi tergantung pada versi Visual Studio mana yang Anda gunakan. Untuk melihat langkah-langkah untuk versi Visual Studio pilihan Anda, gunakan pemilih Versi yang terletak di bagian atas daftar isi di halaman ini.

Untuk membuat proyek DLL di Visual Studio

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

    Cuplikan layar kotak dialog Buat proyek baru dengan templat pustaka tautan dinamis disorot.

  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.

Cuplikan layar jendela Penjelajah Solusi dengan proyek MathLibrary disorot.

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, pilihVisual C++>Windows Desktop terinstal>. Di panel tengah, pilih Dynamic-Link Library (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 belum dicentang.

    Cuplikan layar kotak dialog Proyek Baru di Visual Studio 2017 memperlihatkan Pustaka Matematika di kotak teks Nama.

  3. Pilih tombol OK untuk membuat proyek.

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

Cuplikan layar jendela Penjelajah Solusi di Visual Studio 2017 dengan Pustaka Matematika disorot.

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.

    Cuplikan layar kotak dialog Proyek Baru di Visual Studio 2015 memperlihatkan MathLibrary di kotak teks Nama.

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

    Cuplikan layar halaman Gambaran Umum Panduan Aplikasi Win32.

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

    Cuplikan layar Halaman Pengaturan Aplikasi Panduan Aplikasi Win32.

  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.

Cuplikan layar jendela Penjelajah Solusi di Visual Studio 2015 dengan MathLibrary disorot.

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.

    Cuplikan layar dialog Tambahkan Item Baru dengan templat File C plus Header dipilih, dan MathLibrary.h dimasukkan di kotak teks Nama.

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

    Cuplikan layar file MathLibrary.h kosong di 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 menambahkan <PROJECTNAME>_EXPORTS ke dalam makro praprosesor yang ditentukan. Dalam contoh ini, Visual Studio menentukan MATHLIBRARY_EXPORTS kapan proyek MAthLibrary DLL Anda dibangun.

Saat makro MATHLIBRARY_EXPORTS ditentukan, makro MATHLIBRARY_API 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 baru .cpp bernama MathLibrary.cpp, dengan cara yang sama seperti Anda menambahkan file header baru di langkah sebelumnya.

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

  3. Di editor, ganti konten MathLibrary.cpp file 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 MathLibrary.cpp file 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 DLL. Untuk mengkompilasi, pilih Build>Build Solution pada bilah menu. DLL dan output pengkompilasi terkait ditempatkan dalam folder yang disebut Debug tepat di bawah folder solusi. Jika Anda membuat build Rilis, output ditempatkan di folder bernama Release. Output 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 mungkin menggunakannya. Untuk memanggil fungsi atau mengakses data yang diekspor oleh DLL, kode sumber klien harus memiliki deklarasi yang tersedia pada waktu kompilasi. Pada saat pengaitan, linker memerlukan informasi untuk memecahkan 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 merupakan 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 kedaluarsa.

Untuk menghindari kode yang tidak sinkron, kami sarankan Anda mengatur jalur pencarian dalam proyek klien Anda untuk menyertakan file header DLL secara 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> 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.

    Cuplikan layar kotak dialog Buat proyek baru dengan opsi Aplikasi Konsol disorot.

  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, itu 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>.

  2. Di panel kiri dialog Proyek Baru, pilih Windows Desktop di bawahVisual C++>. 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 kotak tersebut belum dicentang.

    Tangkapan layar kotak dialog Proyek Baru dengan Aplikasi Konsol Windows disorot, dan Math Client diketik dalam kotak teks Nama.

  3. Pilih OK untuk membuat proyek aplikasi klien.

Proyek aplikasi konsol minimal telah dibuat untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, itu 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>.

  2. Di panel kiri dialog Proyek Baru, pilih Win32 di bawahTemplat>>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 kotaknya belum dicentang.

    Cuplikan layar pada kotak dialog Proyek Baru dengan Aplikasi Konsol Win32 Visual C++ yang disoroti, dan Klien Matematika diketik dalam kotak teks Nama.

  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, akan dibuatkan proyek aplikasi konsol minimal untuk Anda. Nama untuk file sumber utama sama dengan nama proyek yang Anda masukkan sebelumnya. Dalam contoh ini, itu bernama MathClient.cpp. Anda dapat membuatnya, tetapi belum menggunakan DLL Anda.

Selanjutnya, untuk memanggil fungsi MathLibrary dalam kode sumber Anda, proyek Anda harus menyertakan MathLibrary.h file . 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 dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.

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

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

    Cuplikan layar dialog Halaman Properti memperlihatkan perintah Edit di menu dropdown properti Sertakan Direktori Tambahan.

  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 MathLibrary.h file header. 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.

    Cuplikan layar dialog Sertakan Direktori Tambahan memperlihatkan jalur relatif ke direktori MathLibrary.

  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 MathLibrary.h file 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 kurang beberapa informasi: Anda belum menentukan bahwa proyek Anda memiliki ketergantungan pada perpustakaan 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 dalam pengembangan, hal ini 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 import DLL ke dalam proyek Anda

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

  2. Dalam kotak dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih. Ini memastikan bahwa setiap perubahan properti berlaku untuk build Debug dan Release.

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

    Cuplikan layar kotak dialog Halaman Properti di bawah Input yang memperlihatkan perintah Edit di menu dropdown properti Dependensi Tambahan.

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

    Cuplikan layar kotak dialog Dependensi Tambahan memperlihatkan file MathLibrary.lib.

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

  6. Di panel kiri, pilih Properti> KonfigurasiLinker>Umum. Di panel properti, pilih kontrol dropdown di samping kotak edit Direktori Pustaka Tambahan , lalu pilih Edit.

    Cuplikan layar kotak dialog Halaman Properti di bawah Umum yang memperlihatkan perintah Edit di menu dropdown properti Direktori Pustaka Tambahan.

  7. Klik ganda di panel atas kotak dialog Direktori Pustaka Tambahan untuk mengaktifkan kontrol edit. Di kontrol edit, tentukan jalur ke lokasi MathLibrary.lib file. 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.

    Cuplikan layar dialog Direktori Pustaka Tambahan.

  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:

Cuplikan layar dialog kesalahan, DLL MathLibrary tidak ditemukan.

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 pasca-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 tahap setelah membangun

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

  2. Dalam kotak dropdown Konfigurasi , pilih Semua Konfigurasi jika belum dipilih.

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

  4. Di panel properti, pilih kontrol pengeditan pada 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.

    Cuplikan layar dialog Halaman Properti yang memperlihatkan properti baris perintah peristiwa pasca build.

  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 Debugging. Visual Studio membuka jendela perintah untuk menjalankan program. Bagian terakhir dari output akan terlihat seperti:

Tangkapan layar output jendela perintah saat Anda memulai aplikasi klien tanpa 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 Microsoft C++.

Lihat juga