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. Panduan ini menjelaskan ekstensi-ekstensi tersebut seiring Anda mengikutinya.

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++, gunakan antarmuka gaya C untuk fungsi yang diekspor. Ada dua alasan utama untuk pilihan 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

  • Windows 7 atau yang lebih baru. Untuk pengalaman pengembangan terbaik, gunakan versi terbaru Windows.
  • 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. Jika Anda tidak menginstal beban kerja ini saat menginstal Visual Studio, jangan khawatir. 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 bisa mengikutinya. Untuk pengenalan, lihat panduan fitur Visual Studio IDE.

  • Beberapa keakraban dengan bahasa C++. Jangan khawatir, panduan tidak mencakup 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>Baru>Project untuk membuka dialog Buat Project Baru.

    Cuplikan layar 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.

    Jika Anda tidak melihat jenis tersebut, pastikan Anda memiliki pengembangan Desktop dengan C++ yang terinstal, seperti yang dijelaskan dalam prasyarat.

  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>Baru>Project untuk membuka dialog Project Baru.

  2. Di panel kiri dialog Proyek Baru, pilih Terinstal>Visual C++>Desktop Windows. 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 dialog Project 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. Pada bilah menu, pilih File >Baru>Proyek.

  2. Di panel kiri dialog Project Baru, perluasTemplat terinstal>, dan pilih Visual C++. Di panel tengah, pilih Aplikasi Konsol Win32. Masukkan MathLibrary sebagai Nama untuk proyek. Jangan ubah nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Pilih Buat direktori untuk solusi.

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

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

    Cuplikan layar halaman Gambaran Umum Panduan Aplikasi Win32.

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

    Cuplikan layar Halaman Pengaturan Aplikasi Panduan Aplikasi Win32.

  5. Pilih 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 Project>Tambahkan Item Baru.

  2. Dalam 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 simpul File Sumber dan pilih Tambahkan>Item Baru. Buat file baru .cpp bernama MathLibrary.cpp, 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 membuat DLL dengan menggunakan Visual Studio! Selanjutnya, Anda membuat aplikasi klien yang menggunakan fungsi yang diekspor 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, atur jalur penyertaan dalam proyek klien Anda agar langsung mengacu pada file header DLL dari proyek DLL Anda. Selain itu, atur jalur pustaka di proyek klien Anda untuk menyertakan pustaka impor DLL dari proyek DLL. Terakhir, 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>Baru>Project untuk membuka dialog Buat project 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 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>Baru>Project.

  2. Pada panel kiri dialog Proyek Baru, pilih Windows Desktop di bawah Terinstal> Visual C++. Di panel tengah, pilih Aplikasi Konsol Windows. Masukkan MathClient di kotak Nama . Pertahankan nilai Lokasi dan Nama solusi default. Atur Solusi untuk Membuat solusi baru. Centang Buat direktori untuk solusi jika belum dicentang.

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

  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, 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>Baru>Project.

  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 belum dicentang.

    Cuplikan layar dialog Proyek Baru dengan Aplikasi Konsol Win32 Visual C++ disorot, dan Math Client diketik di kotak teks Nama.

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

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

  5. Pilih Selesai untuk membuat proyek.

Setelah wizard selesai, proyek aplikasi konsol sederhana akan 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.

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 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 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 dialog Sertakan Direktori Tambahan , pilih OK. Dalam dialog Halaman Properti , pilih 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 masih kekurangan beberapa informasi: Anda belum menyatakan bahwa proyek Anda bergantung pada pustaka MathLibrary.lib. Dan, Anda tidak memberi tahu linker cara menemukan MathLibrary.lib file.

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, tindakan tersebut mungkin menyebabkan perubahan dalam satu salinan yang tidak ditampilkan di salinan lainnya. Untuk menghindari masalah ini, atur properti Dependensi Tambahan untuk memberi tahu sistem build bahwa proyek Anda bergantung pada MathLibrary.lib. Dan, atur 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 simpul MathClient di Penjelajah Solusi dan pilih Properti untuk membuka dialog Halaman Properti.

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

  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 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 dialog Dependensi Tambahan memperlihatkan file MathLibrary.lib.

  5. Pilih OK untuk kembali ke 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 dialog Halaman Properti di bawah Umum yang memperlihatkan perintah Edit di menu dropdown properti Direktori Pustaka Tambahan.

  7. Klik ganda di panel atas 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 dialog Direktori Pustaka Tambahan , pilih OK untuk kembali ke 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 Anda tentukan di sini menyalin DLL hanya jika hilang atau diubah. 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 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, 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 OK untuk menyimpan perubahan Anda ke properti proyek.

Aplikasi klien Anda sekarang memiliki semua yang diperlukan untuk membangun dan menjalankan. Buat aplikasi dengan memilih Build>Build Solution pada bilah menu. Jendela Output di Visual Studio memperlihatkan 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 ==========

Anda 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 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. Pendekatan ini dikenal sebagai penyebaran lokal aplikasi. Untuk informasi selengkapnya tentang penyebaran, lihat Penyebaran di Microsoft C++.

Lihat juga