Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ğı ve başka bir C++ uygulamasından DLL'nin nasıl kullanılacağı açıklanmaktadır. UNIX tabanlı işletim sistemlerinde paylaşılan kitaplıklar olarak da bilinen DLL'ler, windows bileşenlerinin en kullanışlı türlerinden biridir. Bunları kullanarak kod ve kaynakları paylaşabilir ve uygulamalarınızın boyutunu küçültebilirsiniz. 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şturursunuz. Ayrıca Windows DLL'lerinde kullanılan bazı programlama tekniklerine ve kurallarına da giriş bilgileri alırsınız.
Bu izlenecek yol aşağıdaki adımları 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 veya çalışma zamanında DLL'deki dışarı aktarmalarla 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ı ilerledikçe açıklayacağız.
Bu izlenecek yol iki Visual Studio çözümü oluşturur: biri DLL'yi, diğeri de istemci uygulamasını oluşturur. 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 yalnızca kaynak içeren bir DLL'in nasıl oluşturulacağı veya DLL'leri yükleme sırasında değil de ç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 kullanırız. 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 bildirimi içindeki her unsurun da dışarı aktarılan bir örneklemeye sahip olması gerektiği için, sınıfları dışarı aktarırken tanısı 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.
Önkoşullar
- Microsoft Windows 7 veya üzeri. En iyi geliştirme deneyimi için Windows'un en son sürümünü öneririz.
Visual Studio. Visual Studio'yu indirmeyi ve yüklemeyi öğrenmek için bkz. Visual Studio'yu Yükleme. Yükleyiciyi çalıştırdığınızda Masaüstü geliştirme için C++ iş yükü'nün seçili olduğundan 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. 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++ dili hakkında bazı bilgiler. Merak etme, çok karmaşık bir şey yapmayız.
Uyarı
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ı. Sorunları önlemek için Visual Studio Yükleyicisi'ni kullanarak Visual Studio 2017'yi 15.9 veya sonraki bir sürüme güncelleştirin.
DLL projesini oluşturma
Aşağıdaki 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. Tercih ettiğiniz Visual Studio sürümünün adımlarını görmek için bu sayfadaki içindekiler tablosunun en üstünde bulunan Sürüm seçiciyi kullanın.
Visual Studio'da DLL projesi oluşturmak için
Menü çubuğunda Dosya Yeni Proje'yi seçerek >Yeni>Proje Oluştur iletişim kutusunu açın.
İletişim kutusunun üst kısmında Dil ayarını C++, Platform ayarını Windows ve Proje türü ayarını Kitaplık olarak ayarlayın.
Filtrelenen proje türleri listesinde Dinamik Bağlantı Kitaplığı (DLL) öğesini ve ardından İleri'yi seçin.
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. Çözümü ve projeyi aynı dizine yerleştir seçeneği işaretliyse işaretini kaldırın.
Projeyi oluşturmak için Oluştur düğmesini seçin.
Çözüm oluşturulduğunda, oluşturulan projeyi ve kaynak dosyaları Visual Studio'daki Çözüm Gezgini penceresinde görebilirsiniz.
Visual Studio 2017'de DLL projesi oluşturmak için
Menü çubuğunda Dosya Yeni Proje'yi seçerek >Yeni>Proje iletişim kutusunu açın.
Yeni Proje iletişim kutusunun sol bölmesinde Yüklü >> seçin. Orta bölmede Dynamic-Link 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.
Projeyi oluşturmak için Tamam düğmesini seçin.
Çözüm oluşturulduğunda, oluşturulan projeyi ve kaynak dosyaları Visual Studio'daki Çözüm Gezgini penceresinde görebilirsiniz.
Visual Studio 2015 ve daha eski sürümlerde DLL projesi oluşturmak için
Menü çubuğunda Dosya Yeni Proje'yi> seçin.>
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'u işaretleyin.
Tamam düğmesini seçerek Yeni Proje iletişim kutusunu kapatın ve Win32 Uygulama Sihirbazı'nı başlatın.
İleri düğmesini seçin. Uygulama Ayarları sayfasındaki Uygulama türü'nin altında DLL'yi seçin.
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.
Ş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
İşlevleriniz için üst bilgi dosyası oluşturmak için menü çubuğunda Proje>Yeni Öğe Ekle'yi seçin.
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 belirtin
MathLibrary.h.
Yeni bir düzenleyici penceresinde görüntülenen boş bir üst bilgi dosyası oluşturmak için Ekle düğmesini seçin.
Ü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.
fibonacci_init(1, 1) çağrısı tanıdık Fibonacci sayı dizisini oluşturur.
Dosyanın en üstündeki önişlemci deyimlerine dikkat edin. DLL projesi için yeni proje şablonu, tanımlı ön işlemci makrolarına <PROJECTNAME>_EXPORTS ekler. 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, örneğin üst bilgi dosyası bir istemci uygulaması tarafından eklendiğinde, MATHLIBRARY_API bildirimlere __declspec(dllimport) değiştiriciyi uygular. 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
Çözüm Gezgini'ndeKaynak Dosyalar düğümüne sağ tıklayın veYeni Öğe Ekle'yi> seçin. önceki adımda yeni bir üst bilgi dosyası eklediğiniz gibi yeni bir
.cppdosyası,MathLibrary.cppadlı bir dosya oluşturun.Düzenleyici penceresinde, zaten açıksa sekmeyi
MathLibrary.cppseçin. Aksi takdirde, Çözüm Gezgini'ndeMathLibrary.cppprojesinin Kaynak Dosyalar klasörüne çift tıklayarak açın.Düzenleyicide dosyanın içeriğini
MathLibrary.cppaş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_; }
Düzenleyici penceresinde, zaten açıksa MathLibrary.cpp sekmesini seçin. Değilse, Çözüm Gezgini'ndeMathLibrary projesinin Kaynak Dosyalar klasöründeki MathLibrary.cpp çift tıklayarak açın.
Düzenleyicide dosyanın içeriğini
MathLibrary.cppaş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 DLL'yi derleyin. Derlemek için menü çubuğundaDerleme Çözümü> seçin. DLL ve ilgili derleyici çıkışı, çözüm klasörünün hemen altında adlı Debug bir klasöre yerleştirilir. Yayın derlemesi oluşturursanız, çıkışın yerleştirildiği klasörün adı Release olur. Çıktı şöyle görünmelidir:
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, gerçek kod yerine işlevleri ve verileri nasıl bulacağınıza dair bilgi içeren bir dosya olan aktarma kitaplığı içerisinde bu bilgileri 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ışa aktarmalarını bildiren başlıkları, çözücü için içe aktarma kütüphanelerini 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, bir kopyadaki üst bilgi dosyasını yanlışlıkla 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
Menü çubuğundaDosya Yeni Proje'yi>> Yeni proje oluştur iletişim kutusunu açın.
İletişim kutusunun üst kısmında Dil'i C++ olarak, Platform'ı Windows olarak ve Proje türü'nü Konsol olarak ayarlayın.
Filtrelenen proje türleri listesinden Konsol Uygulaması'nı ve ardından İleri'yi seçin.
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. Çözümü ve projeyi aynı dizine yerleştir seçeneği işaretliyse işaretini kaldırın.
İstemci projesini oluşturmak için Oluştur düğmesini seçin.
Sizin için minimal bir konsol uygulama projesi oluşturuldu. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte adı MathClient.cppverilmiştir. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.
Visual Studio 2017'de istemci uygulaması oluşturmak için
Oluşturduğunuz DLL'yi kullanan bir C++ uygulaması oluşturmak için menü çubuğunda Dosya>Yeni Proje'yi> seçin.
Yeni Proje iletişim kutusunun sol bölmesinde Yüklü Visual C++ altında > seçin. Orta bölmede Windows Konsol Uygulaması'nı seçin. MathClient projenin adını Ad kutusuna 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'u işaretleyin.
İstemci uygulama projesini oluşturmak için Tamam'ı seçin.
Sizin için basit bir konsol uygulama projesi oluşturuldu. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte adı MathClient.cppverilmiştir. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.
Visual Studio 2015'te istemci uygulaması oluşturmak için
Oluşturduğunuz DLL'yi kullanan bir C++ uygulaması oluşturmak için menü çubuğunda Dosya>Yeni Proje'yi> seçin.
Yeni Proje iletişim kutusunun sol bölmesinde Yüklü>> altında Win32'yi seçin. Orta bölmede Win32 Konsol Uygulaması'nı seçin. Ad düzenleme kutusuna projenin adı olarak MathClient'i 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'u işaretleyin.
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.
Uygulama Ayarları sayfasındaki Uygulama türü'nin altında Konsol uygulaması henüz seçili değilse'yi seçin.
Projeyi oluşturmak için Son düğmesini seçin.
Sihirbaz tamamlandığında, sizin için basit bir konsol uygulama projesi oluşturulur. Ana kaynak dosyanın adı, daha önce girdiğiniz proje adıyla aynıdır. Bu örnekte adı MathClient.cppverilmiştir. Derleyebilirsiniz, ancak henüz DLL'nizi kullanmaz.
Ardından, kaynak kodunuzda MathLibrary işlevlerini çağırmak için projenizin dosyayı içermesi MathLibrary.h 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.
Include yolunuza DLL üst bilgisini eklemek için
Özellik Sayfaları iletişim kutusunu açmak için Çözüm Gezgini'ndeMathClient düğümüne sağ tıklayın.
Yapılandırma açılan kutusunda, henüz seçili değilse Tüm Yapılandırmalar'ı seçin.
Sol bölmede Yapılandırma Özellikleri>C/C++>Genel'i seçin.
Özellik bölmesinde, Ek Ekleme Dizinleri düzenleme kutusunun yanındaki açılan listeyi seçin ve ardından Düzenle'yi seçin.
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.
Düzenleme kontrolünde, üst bilgi dosyasının konumuna giden
MathLibrary.hyolunu belirtin. Doğru klasöre gitmek için üç nokta (...) düğmesini 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\MathLibraryDLL'niz ve istemci projeleriniz aynı çözümdeyse göreli yol şu şekilde görünebilir:
..\MathLibraryDLL 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.
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 dosyayı ekleyebilir MathLibrary.h ve istemci uygulamanızda bildirmiş olduğu işlevleri kullanabilirsiniz. içeriğini MathClient.cpp ş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ç tane LNK2019 hatası görünecektir. Bunun nedeni projenizde bazı bilgilerin eksik olmasıdır: Projenizin henüz kitaplığa MathLibrary.lib bağımlılığı olduğunu belirtmemişsinizdir. 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 bağımlı MathLibrary.libolduğ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
Çözüm Gezgini'ndeMathClient düğümüne sağ tıklayın ve Özellikler'i seçerek Özellik Sayfaları iletişim kutusunu açın.
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 Debug hem de Release derlemelerine uygulanmasını garanti eder.
Sol bölmede Yapılandırma Özellikleri>> 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.
Ek Bağımlılıklar iletişim kutusunda, üstteki düzenleme denetimindeki listeye ekleyin
MathLibrary.lib.
Özellik Sayfaları iletişim kutusuna dönmek için Tamam'ı seçin.
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.
Düzenleme denetimini etkinleştirmek için Ek Kitaplık Dizinleri iletişim kutusunun üst bölmesine çift tıklayın. Düzenleme denetiminde dosyanın konumunun
MathLibrary.libyolunu 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. Bağlayıcının DLL'nizi bulabilmesi için, oluşturduğunuz derlemenin türü ne olursa olsun,$(IntDir)makrosunu kullanabilirsiniz. İ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.
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:
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 Sürüm konumlarına ve bu konumlardan kopyalamak için makro kullanır.
Derleme sonrası bir olayda DLL'yi kopyalamak için
Çözüm Gezgini'ndeMathClient düğümüne sağ tıklayın ve Özellikler'i seçerek Özellik Sayfaları iletişim kutusunu açın.
Yapılandırma açılan kutusunda, henüz seçili değilse Tüm Yapılandırmalar'ı seçin.
Sol bölmede Yapılandırma Özellikleri>Derleme Olayları>Derleme Sonrası Olay'ı seçin.
Ö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.
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 ihtiyaç duyduğu her şeye sahiptir. 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>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:
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 kütüphane çağrısına adım attığı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. Microsoft C++'da dağıtım.