İzlenecek yol: Kendi Dinamik Bağlantı Kitaplığınızı oluşturma ve kullanma (C++)

Bu adım adım kılavuzda, Microsoft C++ (MSVC) ile yazılmış kendi dinamik bağlantı kitaplığınızı (DLL) oluşturmak için Visual Studio IDE'nin nasıl kullanılacağı gösterilmektedir. Ardından, başka bir C++ uygulamasından DLL'nin nasıl kullanılacağını gösterir. DLL'ler (UNIX tabanlı işletim sistemlerinde paylaşılan kitaplıklar olarak da bilinir), en kullanışlı Windows bileşenlerinden biridir. Bunları kod ve kaynakları paylaşmanın ve uygulamalarınızın boyutunu küçültmenin bir yolu olarak kullanabilirsiniz. DLL'ler uygulamalarınıza hizmet vermenizi ve uygulamalarınızı genişletmenizi bile kolaylaştırabilir.

Bu kılavuzda, bazı matematik işlevlerini uygulayan bir DLL oluşturacaksınız. Ardından DLL'den işlevleri kullanan bir konsol uygulaması oluşturacaksınız. Ayrıca Windows DLL'lerinde kullanılan programlama tekniklerinden ve kurallarından bazılarına giriş yapacaksınız.

Bu izlenecek yol şu görevleri kapsar:

  • Visual Studio'da bir DLL projesi oluşturun.

  • DıŞARı aktarılan işlevleri ve değişkenleri DLL'ye ekleyin.

  • Visual Studio'da bir konsol uygulaması projesi oluşturun.

  • Konsol uygulamasında DLL'den içeri aktarılan işlevleri ve değişkenleri kullanın.

  • Tamamlanmış uygulamayı çalıştırın.

Statik olarak bağlı bir kitaplık gibi DLL de değişkenleri, işlevleri ve kaynakları ada göre dışarı aktarır . İstemci uygulaması bu değişkenleri, işlevleri ve kaynakları kullanmak için adları içeri aktarır . Statik olarak bağlı kitaplıklardan farklı olarak, Windows uygulamanızdaki içeri aktarmaları bağlantı zamanında bağlamak yerine yükleme zamanında veya çalışma zamanında dll'deki dışarı aktarmalara bağlar. Windows, bu bağlantıları yapmak için standart C++ derleme modelinin parçası olmayan ek bilgiler gerektirir. MSVC derleyicisi, bu ek bilgileri sağlamak için C++ için Microsoft'a özgü bazı uzantılar uygular. Bu uzantıları kullandıkça açıklayacağız.

Bu izlenecek yol iki Visual Studio çözümü oluşturur; DLL'yi oluşturan ve istemci uygulamasını oluşturan. DLL, C çağırma kuralını kullanır. Platform, çağırma kuralları ve bağlama kuralları eşleşmiş olduğu sürece diğer programlama dillerinde yazılmış uygulamalardan çağrılabilir. İstemci uygulaması, Windows'un uygulamayı yükleme zamanında DLL'ye bağladığı örtük bağlamayı kullanır. Bu bağlama, uygulamanın statik olarak bağlı bir kitaplıktaki işlevler gibi DLL tarafından sağlanan işlevleri çağırmasına olanak tanır.

Bu izlenecek yol bazı yaygın durumları kapsamaz. Kod, diğer programlama dillerine göre C++ DLL'lerinin kullanımını göstermez. Yalnızca kaynak DLL'lerinin nasıl oluşturulacağı veya dll'leri yükleme zamanında değil, çalışma zamanında yüklemek için açık bağlamanın nasıl kullanılacağı gösterilmez. Emin olun, tüm bunları yapmak için MSVC ve Visual Studio'yu kullanabilirsiniz.

DLL kodu C++ dilinde yazılmış olsa da, dışarı aktarılan işlevler için C stili arabirimler kullandık. Bunun iki ana nedeni vardır: İlk olarak, diğer birçok dil C stili işlevlerin içeri aktarılmasını destekler. İstemci uygulamasının C++ dilinde yazılması gerekmez. İkincisi, dışarı aktarılan sınıflar ve üye işlevleriyle ilgili bazı yaygın tuzaklardan kaçınır. Sınıf bildiriminde başvurulan her şeyin de dışarı aktarılan bir örneklemeye sahip olması gerektiğinden, sınıfları dışarı aktarırken tanılaması zor hatalar yapmak kolaydır. Bu kısıtlama DLL'ler için geçerlidir ancak statik kitaplıklar için geçerli değildir. Sınıflarınız düz eski veri stilindeyse, bu sorunla karşılaşmayın.

DLL'ler hakkında daha fazla bilgi için bkz . Visual Studio'da C/C++ DLL'leri oluşturma. Örtük bağlama ve açık bağlama hakkında daha fazla bilgi için bkz . Kullanılacak bağlama yöntemini belirleme. C dili bağlantı kurallarını kullanan programlama dilleriyle kullanmak üzere C++ DLL'leri oluşturma hakkında bilgi için bkz . C dili yürütülebilir dosyalarda kullanmak üzere C++ işlevlerini dışarı aktarma. .NET dilleri ile kullanmak üzere DLL oluşturma hakkında bilgi için bkz . Visual Basic Uygulamalarından DLL İşlevleri Çağırma.

Ön koşullar

  • Microsoft Windows 7 veya sonraki sürümleri çalıştıran bir bilgisayar. En iyi geliştirme deneyimi için Windows'un en son sürümünü öneririz.
  • Visual Studio'nun bir kopyası. Visual Studio'yu indirme ve yükleme hakkında bilgi için bkz . Visual Studio'yu Yükleme. Yükleyiciyi çalıştırdığınızda, C++ iş yüküyle Masaüstü geliştirmenin denetlendiğinden emin olun. Visual Studio'yu yüklerken bu iş yükünü yüklemediyseniz endişelenmeyin. Yükleyiciyi yeniden çalıştırabilir ve şimdi yükleyebilirsiniz.

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

  • Visual Studio'nun bir kopyası. Visual Studio 2015'i indirme ve yükleme hakkında bilgi için bkz . Visual Studio 2015'i yükleme. Varsayılan olarak yüklenmediğinden C++ derleyicisini ve araçlarını yüklemek için Özel yükleme kullanın.
  • Visual Studio IDE'yi kullanmanın temellerini anlama. Windows masaüstü uygulamalarını daha önce kullandıysanız, büyük olasılıkla devam edebilirsiniz. Giriş için bkz . Visual Studio IDE özellik turu.

  • C++ dilinin temelleri hakkında yeterli bilgi. Merak etme, çok karmaşık bir şey yapmayız.

Dekont

Bu kılavuzda Visual Studio 2017 sürüm 15.9 veya üzerini kullandığınız varsayılır. Visual Studio 2017'nin önceki bazı sürümlerinde kod şablonlarında hata vardı veya farklı kullanıcı arabirimi iletişim kutuları kullanıldı. Sorunlardan kaçınmak için Visual Studio Yükleyicisi kullanarak Visual Studio 2017'yi 15.9 veya sonraki bir sürüme güncelleştirin.

DLL projesini oluşturma

Bu görev kümesinde DLL'niz için bir proje oluşturur, kod ekler ve oluşturursunuz. Başlamak için Visual Studio IDE'yi başlatın ve gerekirse oturum açın. Yönergeler, kullandığınız Visual Studio sürümüne bağlı olarak biraz değişiklik gösterir. Bu sayfanın sol üst kısmındaki denetimde doğru sürümü seçtiğinizden emin olun.

Visual Studio 2019'da DLL projesi oluşturmak için

  1. Menü çubuğunda Dosya Yeni Proje'yi seçerek >Yeni>Proje Oluştur iletişim kutusunu açın.

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

  2. İletişim kutusunun üst kısmında Dil'i C++ olarak, Platform'ı Windows olarak ve Proje türünü Kitaplık olarak ayarlayın.

  3. Filtrelenen proje türleri listesinde Dinamik Bağlantı Kitaplığı (DLL) öğesini ve ardından İleri'yi seçin.

  4. Yeni projenizi yapılandırın sayfasında Proje adı kutusuna MathLibrary girerek proje için bir ad belirtin. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlendiyse çözümü ve projeyi aynı dizine yerleştir seçeneğinin işaretini kaldırın.

  5. Projeyi oluşturmak için Oluştur düğmesini seçin.

Çözüm oluşturulduğunda, oluşturulan proje ve kaynak dosyaları Visual Studio'daki Çözüm Gezgini penceresinde görebilirsiniz.

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

Visual Studio 2017'de DLL projesi oluşturmak için

  1. Menü çubuğunda Dosya Yeni Proje'yi seçerek >Yeni>Proje iletişim kutusunu açın.

  2. Yeni Proje iletişim kutusunun sol bölmesinde Yüklü>Visual C++>Windows Masaüstü'nü seçin. Orta bölmede Dinamik Bağlantı Kitaplığı (DLL) öğesini seçin. Proje için bir ad belirtmek için Ad kutusuna MathLibrary yazın. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlenmemişse çözüm için Dizin oluştur'a bakın.

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

  3. Projeyi oluşturmak için Tamam düğmesini seçin.

Çözüm oluşturulduğunda, oluşturulan proje ve kaynak dosyaları Visual Studio'daki Çözüm Gezgini penceresinde görebilirsiniz.

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

Visual Studio 2015 ve daha eski sürümlerde DLL projesi oluşturmak için

  1. Menü çubuğunda Dosya Yeni Proje'yi> seçin.>

  2. Yeni Proje iletişim kutusunun sol bölmesinde Yüklü>Şablonlar'ı genişletin, Visual C++ öğesini seçin ve orta bölmede Win32 Konsol Uygulaması'nı seçin. Proje için bir ad belirtmek için Ad düzenleme kutusuna MathLibrary yazın. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlenmemişse çözüm için Dizin oluştur'a bakın.

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

  3. Tamam düğmesini seçerek Yeni Proje iletişim kutusunu kapatın ve Win32 Uygulama Sihirbazı'nı başlatın.

    Screenshot of the Win32 Application Wizard Overview page.

  4. İleri düğmesini seçin. Uygulama Ayarlar sayfasında, Uygulama türü'nin altında DLL'yi seçin.

    Screenshot of the Win32 Application Wizard Application Settings Page.

  5. Projeyi oluşturmak için Son düğmesini seçin.

Sihirbaz çözümü tamamladığında, oluşturulan projeyi ve kaynak dosyaları Visual Studio'daki Çözüm Gezgini penceresinde görebilirsiniz.

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

Şu anda bu DLL çok işe yaramıyor. Ardından, DLL'nizin dışarı aktaracağı işlevleri bildirmek için bir üst bilgi dosyası oluşturacak ve daha kullanışlı hale getirmek için işlev tanımlarını DLL'ye ekleyeceksiniz.

DLL'ye üst bilgi dosyası eklemek için

  1. İşlevleriniz için üst bilgi dosyası oluşturmak için menü çubuğunda Proje>Yeni Öğe Ekle'yi seçin.

  2. Yeni Öğe Ekle iletişim kutusundaki sol bölmede Visual C++ öğesini seçin. Orta bölmede Üst Bilgi Dosyası (.h) öğesini seçin. Üst bilgi dosyasının adı olarak MathLibrary.h değerini belirtin.

    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. Yeni bir düzenleyici penceresinde görüntülenen boş bir üst bilgi dosyası oluşturmak için Ekle düğmesini seçin.

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

  4. Üst bilgi dosyasının içeriğini şu kodla değiştirin:

    // 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();
    

Bu üst bilgi dosyası, iki ilk değer verilip genelleştirilmiş bir Fibonacci dizisi oluşturmak için bazı işlevleri bildirir. Çağrı, fibonacci_init(1, 1) tanıdık Fibonacci numara dizisini oluşturur.

Dosyanın en üstündeki önişlemci deyimlerine dikkat edin. DLL projesinin yeni proje şablonu, tanımlı ön işlemci makrolarına eklenir <PROJECTNAME>_EXPORTS . Bu örnekte Visual Studio, MathLibrary DLL projenizin ne zaman derlenmiş olduğunu tanımlar MATHLIBRARY_EXPORTS .

MATHLIBRARY_EXPORTS Makro tanımlandığında, MATHLIBRARY_API makro işlev bildirimlerinde değiştiriciyi ayarlar__declspec(dllexport). Bu değiştirici, derleyiciye ve bağlayıcıya dll'den bir işlevi veya değişkeni diğer uygulamalar tarafından kullanılmak üzere dışarı aktarmasını söyler. Tanımsız olduğunda MATHLIBRARY_EXPORTS , örneğin, üst bilgi dosyası bir istemci uygulaması tarafından eklendiğinde, MATHLIBRARY_API değiştiriciyi bildirimlere uygular __declspec(dllimport) . Bu değiştirici, bir uygulamadaki işlevin veya değişkenin içeri aktarılmasını iyileştirir. Daha fazla bilgi için bkz . dllexport, dllimport.

DLL'ye uygulama eklemek için

  1. Çözüm Gezgini Kaynak Dosyalar düğümüne sağ tıklayın ve Yeni Öğe Ekle'yi>seçin. Önceki adımda yeni bir üst bilgi dosyası eklediğiniz gibi MathLibrary.cpp adlı yeni bir .cpp dosyası oluşturun.

  2. Düzenleyici penceresinde, zaten açıksa MathLibrary.cpp sekmesini seçin. Aksi takdirde, Çözüm Gezgini MathLibrary projesinin Kaynak Dosyalar klasöründe MathLibrary.cpp'ye çift tıklayarak açın.

  3. Düzenleyicide MathLibrary.cpp dosyasının içeriğini aşağıdaki kodla değiştirin:

    // 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. Düzenleyici penceresinde, zaten açıksa MathLibrary.cpp sekmesini seçin. Aksi takdirde, Çözüm Gezgini MathLibrary projesinin Kaynak Dosyalar klasöründe MathLibrary.cpp'ye çift tıklayarak açın.

  2. Düzenleyicide MathLibrary.cpp dosyasının içeriğini aşağıdaki kodla değiştirin:

    // 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_;
    }
    

Şimdiye kadar her şeyin çalıştığını doğrulamak için dinamik bağlantı kitaplığını derleyin. Derlemek için menü çubuğunda Derleme Çözümü Oluştur'u>seçin. DLL ve ilgili derleyici çıkışı, çözüm klasörünün hemen altında Hata Ayıkla adlı bir klasöre yerleştirilir. Yayın derlemesi oluşturursanız, çıkış Release adlı bir klasöre yerleştirilir. Çıkış aşağıdakine benzer olmalıdır:

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 ==========

Tebrikler, Visual Studio kullanarak bir DLL oluşturdunuz! Ardından, DLL tarafından dışarı aktarılan işlevleri kullanan bir istemci uygulaması oluşturacaksınız.

DLL kullanan bir istemci uygulaması oluşturma

BIR DLL oluşturduğunuzda, istemci uygulamalarının bunu nasıl kullanabileceğini düşünün. İşlevleri çağırmak veya DLL tarafından dışarı aktarılan verilere erişmek için, istemci kaynak kodu derleme zamanında kullanılabilir bildirimleri içermelidir. Bağlantı zamanında bağlayıcı, işlev çağrılarını veya veri erişimlerini çözümlemek için bilgi gerektirir. DLL bu bilgileri gerçek kod yerine işlevleri ve verileri bulma hakkında bilgi içeren bir içeri aktarma kitaplığında sağlar. Çalışma zamanında DLL, işletim sisteminin bulabileceği bir konumda istemci tarafından kullanılabilir olmalıdır.

İster size ait ister üçüncü taraf olsun, istemci uygulama projenizin DLL kullanmak için birkaç bilgiye ihtiyacı vardır. DLL dışarı aktarmalarını bildiren üst bilgileri, bağlayıcı için içeri aktarma kitaplıklarını ve DLL'nin kendisini bulması gerekir. Çözümlerden biri, bu dosyaların tümünü istemci projenize kopyalamaktır. İstemciniz geliştirme aşamasındayken değişme olasılığı düşük olan üçüncü taraf DLL'ler için bu yöntem bunları kullanmanın en iyi yolu olabilir. Ancak, DLL'yi de oluşturduğunuzda, yinelemeyi önlemek daha iyidir. Geliştirme aşamasında olan DLL dosyalarının yerel bir kopyasını oluşturursanız, üst bilgi dosyasını yanlışlıkla bir kopyada değiştirebilir, diğerinde değiştiremez veya güncel olmayan bir kitaplık kullanabilirsiniz.

Eşitlenmemiş kodu önlemek için, istemci projenizdeki ekleme yolunu DLL üst bilgi dosyalarını doğrudan DLL projenizden içerecek şekilde ayarlamanızı öneririz. Ayrıca, istemci projenizdeki kitaplık yolunu DLL projesindeki DLL içeri aktarma kitaplıklarını içerecek şekilde ayarlayın. Son olarak, DLL projesindeki yerleşik DLL'yi istemci derleme çıkış dizininize kopyalayın. Bu adım, istemci uygulamanızın oluşturduğunuz DLL kodunu kullanmasına olanak tanır.

Visual Studio'da istemci uygulaması oluşturmak için

  1. Menü çubuğunda Dosya Yeni Proje'yi seçerek >Yeni>proje oluştur iletişim kutusunu açın.

  2. İletişim kutusunun üst kısmında Dil'i C++ olarak, Platform'ı Windows olarak ve Proje türü'nü Konsol olarak ayarlayın.

  3. Filtrelenen proje türleri listesinden Konsol Uygulaması'nı ve ardından İleri'yi seçin.

  4. Yeni projenizi yapılandırın sayfasında Proje adı kutusuna MathClient girerek proje için bir ad belirtin. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlendiyse çözümü ve projeyi aynı dizine yerleştir seçeneğinin işaretini kaldırın.

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

  5. İstemci projesini oluşturmak için Oluştur düğmesini seçin.

Sizin için en düşük konsol uygulaması projesi oluşturulur. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte MathClient.cpp olarak adlandırılmıştır. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.

Visual Studio 2017'de istemci uygulaması oluşturmak için

  1. Oluşturduğunuz DLL'yi kullanan bir C++ uygulaması oluşturmak için menü çubuğunda Dosya>Yeni Proje'yi> seçin.

  2. Yeni Proje iletişim kutusunun sol bölmesinde Yüklü>Visual C++ altında Windows Masaüstü'nü seçin. Orta bölmede Windows Konsol Uygulaması'nı seçin. Ad düzenleme kutusunda projenin adını (MathClient) belirtin. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlenmemişse çözüm için Dizin oluştur'a bakın.

    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. İstemci uygulama projesini oluşturmak için Tamam'ı seçin.

Sizin için en düşük konsol uygulaması projesi oluşturulur. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte MathClient.cpp olarak adlandırılmıştır. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.

Visual Studio 2015'te istemci uygulaması oluşturmak için

  1. Oluşturduğunuz DLL'yi kullanan bir C++ uygulaması oluşturmak için menü çubuğunda Dosya>Yeni Proje'yi> seçin.

  2. Yeni Proje iletişim kutusunun sol bölmesinde Yüklü>Şablonlar>Visual C++ altında Win32'yi seçin. Orta bölmede Win32 Konsol Uygulaması'nı seçin. Ad düzenleme kutusunda projenin adını (MathClient) belirtin. Varsayılan Konum ve Çözüm adı değerlerini değiştirmeyin. Çözümü Yeni çözüm oluştur olarak ayarlayın. İşaretlenmemişse çözüm için Dizin oluştur'a bakın.

    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. Tamam düğmesini seçerek Yeni Proje iletişim kutusunu kapatın ve Win32 Uygulama Sihirbazı'nı başlatın. Win32 Uygulama Sihirbazı iletişim kutusunun Genel Bakış sayfasında İleri düğmesini seçin.

  4. Uygulama Ayarlar sayfasında, Uygulama türü'nin altında, henüz seçili değilse Konsol uygulaması'nı seçin.

  5. Projeyi oluşturmak için Son düğmesini seçin.

Sihirbaz tamamlandığında, sizin için en az konsol uygulaması projesi oluşturulur. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte MathClient.cpp olarak adlandırılmıştır. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.

Ardından, kaynak kodunuzda MathLibrary işlevlerini çağırmak için projenizin MathLibrary.h dosyasını içermesi gerekir. Bu üst bilgi dosyasını istemci uygulama projenize kopyalayıp var olan bir öğe olarak projeye ekleyebilirsiniz. Bu yöntem üçüncü taraf kitaplıklar için iyi bir seçim olabilir. Ancak DLL'nizin ve istemcinizin kodu üzerinde aynı anda çalışıyorsanız üst bilgi dosyaları eşitlenmemiş olabilir. Bu sorunu önlemek için projenizdeki Ek Ekleme Dizinleri yolunu özgün üst bilgi yolunu içerecek şekilde ayarlayın.

DLL üst bilgisini ekleme yolunuza eklemek için

  1. Özellik Sayfaları iletişim kutusunu açmak için Çözüm Gezgini'da MathClient düğümüne sağ tıklayın.

  2. Yapılandırma açılan kutusunda, henüz seçili değilse Tüm Yapılandırmalar'ı seçin.

  3. Sol bölmede Yapılandırma Özellikleri>C/C++>Genel'i seçin.

  4. Özellik bölmesinde, Ek Ekleme Dizinleri düzenleme kutusunun yanındaki açılan denetimi seçin ve ardından Düzenle'yi seçin.

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

  5. Düzenleme denetimini etkinleştirmek için Ek Dizinleri Ekle iletişim kutusunun üst bölmesine çift tıklayın. Alternatif olarak, yeni bir giriş oluşturmak için klasör simgesini de seçebilirsiniz.

  6. Düzenleme denetiminde MathLibrary.h üst bilgi dosyasının konumunun yolunu belirtin. Doğru klasöre göz atmak için üç nokta (...) denetimini seçebilirsiniz.

    ayrıca, istemci kaynak dosyalarınızdan DLL üst bilgi dosyalarını içeren klasöre göreli bir yol da girebilirsiniz. İstemci projenizi DLL'den ayrı bir çözüme yerleştirmek için yönergeleri izlediyseniz göreli yol şu şekilde görünmelidir:

    ..\..\MathLibrary\MathLibrary

    DLL'niz ve istemci projeleriniz aynı çözümdeyse göreli yol şu şekilde görünebilir:

    ..\MathLibrary

    DLL ve istemci projeleri diğer klasörlerde olduğunda, göreli yolu eşleşecek şekilde ayarlayın. İsterseniz, klasöre göz atmak için üç nokta denetimini de kullanabilirsiniz.

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

  7. Ek Dizinleri Ekle iletişim kutusunda üst bilgi dosyasının yolunu girdikten sonra Tamam düğmesini seçin. Özellik Sayfaları iletişim kutusunda, değişikliklerinizi kaydetmek için Tamam düğmesini seçin.

Artık MathLibrary.h dosyasını ekleyebilir ve istemci uygulamanızda bildirdiğiniz işlevleri kullanabilirsiniz. MathClient.cpp dosyasının içeriğini şu kodu kullanarak değiştirin:

// 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;
}

Bu kod derlenebilir, ancak bağlanılamaz. İstemci uygulamasını şimdi derlerseniz, hata listesinde birkaç LNK2019 hatası gösterilir. Bunun nedeni projenizde bazı bilgilerin eksik olmasıdır: Projenizin henüz MathLibrary.lib kitaplığına bağımlılığı olduğunu belirtmemiş olmanızdır. Ve bağlayıcıya MathLibrary.lib dosyasını nasıl bulacağını söylemedin.

Bu sorunu çözmek için kitaplık dosyasını doğrudan istemci uygulama projenize kopyalayabilirsiniz. Bağlayıcı otomatik olarak bulur ve kullanır. Ancak, hem kitaplık hem de istemci uygulaması geliştirme aşamasındaysa, bu durum bir kopyada diğerinde gösterilmeyen değişikliklere yol açabilir. Bu sorunu önlemek için Ek Bağımlılıklar özelliğini, derleme sistemine projenizin MathLibrary.lib dosyasına bağlı olduğunu söyleyecek şekilde ayarlayabilirsiniz. Ayrıca, bağlantı kurduğunuzda özgün kitaplığın yolunu eklemek için projenizde bir Ek Kitaplık Dizinleri yolu ayarlayabilirsiniz.

DLL içeri aktarma kitaplığını projenize eklemek için

  1. Çözüm Gezgini'da MathClient düğümüne sağ tıklayın ve Özellikler'i seçerek Özellik Sayfaları iletişim kutusunu açın.

  2. Yapılandırma açılan kutusunda, henüz seçili değilse Tüm Yapılandırmalar'ı seçin. Tüm özellik değişikliklerinin hem Hata Ayıklama hem de Yayın derlemelerine uygulanmasını sağlar.

  3. Sol bölmede Yapılandırma Özellikleri Bağlayıcı>Girişi'ni> seçin. Özellik bölmesinde, Ek Bağımlılıklar düzenleme kutusunun yanındaki açılan listeyi seçin ve ardından Düzenle'yi seçin.

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

  4. Ek Bağımlılıklar iletişim kutusunda, en üstteki düzenleme denetimindeki listeye MathLibrary.lib ekleyin.

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

  5. Özellik Sayfaları iletişim kutusuna dönmek için Tamam'ı seçin.

  6. Sol bölmede Yapılandırma Özellikleri>Bağlayıcısı>Genel'i seçin. Özellik bölmesinde, Ek Kitaplık Dizinleri düzenleme kutusunun yanındaki açılan listeyi seçin ve ardından Düzenle'yi seçin.

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

  7. Düzenleme denetimini etkinleştirmek için Ek Kitaplık Dizinleri iletişim kutusunun üst bölmesine çift tıklayın. Düzenleme denetiminde MathLibrary.lib dosyasının konumunun yolunu belirtin. Varsayılan olarak, doğrudan DLL çözüm klasörünün altında Hata Ayıkla adlı bir klasördedir. Bir yayın derlemesi oluşturursanız, dosya Release adlı bir klasöre yerleştirilir. Makroyu $(IntDir) kullanarak bağlayıcının dll'nizi bulabilmesini sağlayabilirsiniz. Hangi tür derleme oluşturursanız oluşturun. İstemci projenizi DLL projesinden ayrı bir çözüme yerleştirmek için yönergeleri izlediyseniz göreli yol şu şekilde görünmelidir:

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

    DLL'niz ve istemci projeleriniz başka konumlardaysa, göreli yolu eşleşecek şekilde ayarlayın.

    Screenshot of the Additional Library Directories dialog.

  8. Ek Kitaplık Dizinleri iletişim kutusunda kitaplık dosyasının yolunu girdikten sonra, Özellik Sayfaları iletişim kutusuna dönmek için Tamam düğmesini seçin. Özellik değişikliklerini kaydetmek için Tamam'ı seçin.

İstemci uygulamanız artık başarıyla derlenebilir ve bağlanabilir, ancak yine de çalışması için gereken her şeye sahip değildir. İşletim sistemi uygulamanızı yüklediğinde MathLibrary DLL'sini arar. DLL'yi belirli sistem dizinlerinde, ortam yolunda veya yerel uygulama dizininde bulamazsa yük başarısız olur. İşletim sistemine bağlı olarak aşağıdaki gibi bir hata iletisi görürsünüz:

Screenshot of the error dialog, MathLibrary DLL not found.

Bu sorundan kaçınmanın bir yolu, DLL'yi derleme işleminin bir parçası olarak istemci yürütülebilir dosyanızı içeren dizine kopyalamaktır. DLL'yi derleme çıktı dizininize kopyalayan bir komut eklemek için projenize Derleme Sonrası Olayı ekleyebilirsiniz. Burada belirtilen komut DLL'yi yalnızca eksikse veya değişmişse kopyalar. Derleme yapılandırmanıza bağlı olarak Hata Ayıklama veya Yayın konumlarına kopyalamak için makroları kullanır.

Derleme sonrası olayda DLL'yi kopyalamak için

  1. Çözüm Gezgini'da MathClient düğümüne sağ tıklayın ve Özellikler'i seçerek Özellik Sayfaları iletişim kutusunu açın.

  2. Yapılandırma açılan kutusunda, henüz seçili değilse Tüm Yapılandırmalar'ı seçin.

  3. Sol bölmede Yapılandırma Özellikleri>Derleme Olayları>Derleme Sonrası Olay'ı seçin.

  4. Özellik bölmesinde, Komut Satırı alanında düzenleme denetimini seçin. İstemci projenizi DLL projesinden ayrı bir çözüme yerleştirmek için yönergeleri izlediyseniz şu komutu girin:

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

    DLL'niz ve istemci projeleriniz diğer dizinlerdeyse, DLL'nin göreli yolunu eşleşecek şekilde değiştirin.

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

  5. Proje özelliklerinde yaptığınız değişiklikleri kaydetmek için Tamam düğmesini seçin.

Artık istemci uygulamanızın derlenmesi ve çalıştırılması için gereken her şey vardır. Menü çubuğunda Derleme Çözümü'ne> tıklayarak uygulamayı derleyin. Visual Studio'daki Çıkış penceresinde, Visual Studio sürümünüze bağlı olarak aşağıdaki örneğe benzer bir şey olmalıdır:

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 ==========

Tebrikler, DLL'nizdeki işlevleri çağıran bir uygulama oluşturdunuz. Şimdi uygulamanızı çalıştırarak ne yaptığını görün. Menü çubuğunda Hata Ayıklama Hata Ayıklama>Olmadan Başlat'ı seçin. Visual Studio, programın çalışması için bir komut penceresi açar. Çıkışın son bölümü şöyle görünmelidir:

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

Komut penceresini kapatmak için herhangi bir tuşa basın.

Artık bir DLL ve istemci uygulaması oluşturduğunuza göre, denemeler yapabilirsiniz. İstemci uygulamasının kodunda kesme noktaları ayarlamayı deneyin ve uygulamayı hata ayıklayıcıda çalıştırın. Bir kitaplık çağrısına adımladığınızda ne olduğunu görün. Kitaplığa başka işlevler ekleyin veya DLL'nizi kullanan başka bir istemci uygulaması yazın.

Uygulamanızı dağıtırken, kullandığı DLL'leri de dağıtmanız gerekir. Oluşturduğunuz veya üçüncü taraflardan eklediğiniz DLL'leri kullanılabilir hale getirmenin en basit yolu, bunları uygulamanızla aynı dizine yerleştirmektir. Uygulama yerel dağıtımı olarak bilinir. Dağıtım hakkında daha fazla bilgi için bkz . Visual C++'da dağıtım.

Ayrıca bkz.

Visual Basic Uygulamalarından DLL İşlevleri Çağırma