Aracılığıyla paylaş


İzlenecek yol: Bir Dinamik Kitaplık (C++) Oluşturmak ve Kullanmak

Bu adım adım gidiş yolu bir C++ uygulama ile kullanmak için bir dinamik bağlantı kitaplığı (DLL) oluşturmayı gösterir.Bir kütüphane oluşturmak kodu yeniden kullanmak için harika bir yoldur.Oluşturduğunuz her programda aynı program parçalarını yeniden yazmak yerine, bunları bir kez yazın ve sonra bu fonksiyonelliği gerektiren uygulamalara referans verin.DLL dosyasının içine kod koyarak referans gösterilen her uygulamada yer kazanırsınız ve tüm uygulamayı derlemeden DLL'i güncelleştirebilirsiniz.DLLs hakkında daha fazla bilgi için, bkz. Visual C++ dll.

Bu gidiş yolu bu görevleri kapsar:

  • Bir DLL Projesi Oluşturma.

  • DLL içine bir sınıf ekleme.

  • DLL referansı için yükleme zamanı dinamik bağlama kullanan bir konsol uygulaması oluşturma.

  • Uygulama içindeki sınıftan fonksiyonellik kullanma.

  • Uygulamayı çalıştırma.

Bu yönerge/gidiş yolu yalnızca C++ çağırma kurallarını kullanan uygulamalardan çağrılabilen bir DLL öğesini oluşturur.Diğer diller için DLLler oluşturma hakkında daha fazla bilgi için bkz: Visual Basic Uygulamasından DLL İşlevi Çağırma.

Önkoşullar

Bu konu, C++ dili temellerini anladığınızı varsayar.

Bir dinamik bağlantı kitaplığı (DLL) projesi oluşturmak için

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

  2. Yeni Proje iletişim kutusunun sol tarafındaki bölmede, Yüklenenler öğesini genişletin, Şablonlar, Visual C++ ve ardından Win32 öğesini seçin.

  3. Orta bölmede Win32 Konsol Uygulaması'nı seçin.

  4. Proje için bir ad belirtin— örneğin, MathFuncsDll— Ad kutusu içinde.Çözüm için bir ad belirtin—örneğin, DynamicLibrary— Çözüm adı kutusu içinde.Tamam düğmesini seçin.

  5. Genel Bakış sayfası üzerinde Win32 Uygulama Sihirbazı iletişim kutusunda, İleri düğmesini seçin.

  6. Uygulama Ayarları sayfası üzerinde, Uygulama türü altında, DLL'i seçin.

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

Dinamik bağlantı kitaplığına bir sınıf eklemek için

  1. Menü çubuğunda yeni bir sınıf için bir üstbilgi/başlık dosyası oluşturmak için Proje, Yeni Öğe Ekle'yi seçin.Yeni Öğe Ekle iletişim kutusunda, sol bölmede, Visual C++ altında, Kod'u seçin.Orta bölmede Başlık dosyası (.h)'nı seçin.Üstbilgi/başlık dosyası için bir ad belirtin—örneğin, MathFuncsDll.h— ve sonra Ekle düğmesini seçin.Boş bir üstbilgi dosyası görüntülenir.

  2. Üstbilgi dosyasının başına aşağıdaki kodu ekleyin:

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
  3. Toplama, çıkarma, çarpma ve bölme gibi ortak matematik işlemleri gerçekleştirmek için MyMathFuncs adında bir temel sınıf ekleyin.Kod buna benzemelidir:

    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
    
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
    
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
    
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    

    MATHFUNCSDLL_EXPORTS simgesi tanımlandığı zaman, MATHFUNCSDLL_API sembolü bu kodda üye fonksiyonu tanımlanması __declspec(dllexport) değiştiricisini ayarlayacaktır.Bu değiştirici DLL tarafından dışa aktarılan fonksiyonu etkinleştirir böylece diğer uygulamalar tarafından kullanılabilir.MATHFUNCSDLL_EXPORTS tanımlanmamış olduğunda MATHFUNCSDLL_API üye fonksiyon bildirimleri içinde __declspec(dllimport) değiştiricisini tanımlar.Bu değiştirici DLL'in diğer uygulamalarda kullanmak için fonksiyon almasını en iyi duruma getirmek için derleyiciyi etkinleştirir.Varsayılan olarak, MathFuncsDll projeniz yapılandırıldığında MATHFUNCSDLL_EXPORTS öğesi tanımlanır.Daha fazla bilgi için bkz. dllexport, DllImport.

    [!NOT]

    Komut satırında DLL projesi oluşturuyorsanız, MATHFUNCSDLL_EXPORTS sembolü tanımlamak için /D derleyici seçeneğini kullanın.

  4. MathFuncsDll projesi içinde Çözüm Gezgini, Kaynak Dosyaları klasöründe, MathFuncsDll.cpp öğesini açın.

  5. Kaynak dosyadaki MyMathFuncs için fonksiyonelliği uygulayın.Kod buna benzemelidir:

    // MathFuncsDll.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #include "MathFuncsDll.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace MathFuncs
    {
        double MyMathFuncs::Add(double a, double b)
        {
            return a + b;
        }
    
        double MyMathFuncs::Subtract(double a, double b)
        {
            return a - b;
        }
    
        double MyMathFuncs::Multiply(double a, double b)
        {
            return a * b;
        }
    
        double MyMathFuncs::Divide(double a, double b)
        {
            if (b == 0)
            {
                throw invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
  6. Dinamik bağlantı kitaplığını, menü çubuğunda Derleme, Çözümü Derle seçerek derleyebilirsiniz.

    [!NOT]

    Eğer bir Express sürüm kullanıyorsanız, menü çubuğunda bir Derleme menüsü göstermeyecektir, bunu etkinleştirmek için Araçlar, Ayarlar, Uzman Ayarları öğesini seçin ve ardından Derleme, Çözümü Derle öğesini seçin.

    [!NOT]

    Komut satırında bir proje oluşturuyorsanız, çıktı dosyasının bir DLL dosyası olduğunu belirtmek için /LD derleyici seçeneğini kullanın.Daha fazla bilgi için bkz. / md, /mt, /ld (çalışma zamanı kitaplığı kullanın).C++ özel durum yakalamayı etkinleştirmek /EHsc derleyici seçeneğini kullanın.Daha fazla bilgi için bkz. /eh (özel durum işleme modeli).

DLL referansı yapan bir uygulama oluşturmak için

  1. Oluşturduğunuz DLL'i kullanacak ve referans gösterecek bir C++ uygulaması oluşturmak için Dosya, Yeni, Proje öğesini seçin.

  2. Sol bölmede, Visual C++ altında, Win32 öğesini seçin.

  3. Orta bölmede Win32 Konsol Uygulaması'nı seçin.

  4. Proje için bir ad belirtin— örneğin, MyExecRefsDll— Ad kutusu içinde.Çözüm öğesinin yanında, aşağı doğru açılan listeden Çözüme Ekle öğesini seçin.Bu, aynı çözüme DLL dosyasını içeren yeni proje ekler.Tamam düğmesini seçin.

  5. Genel Bakış sayfası üzerinde Win32 Uygulama Sihirbazı iletişim kutusunda, İleri düğmesini seçin.

  6. Uygulama Ayarları sayfası üzerinde, Uygulama türü altında, Konsol uygulaması öğesini seçin.

  7. Uygulama Ayarları sayfası üzerinde, Ek Seçenekler altında, Önceden Derlenmiş Üstbilgi onay kutusunu temizleyin.

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

Uygulama içindeki sınıf kitaplığında fonksiyonelliği kullanmak için

  1. Bir konsol uygulaması oluşturduktan sonra boş bir program sizin için oluşturulur.Kaynak dosya adı daha önce seçtiğiniz ad ile aynıdır.Bu örnekte, MyExecRefsDll.cpp olarak adlandırılır.

  2. Uygulamada DLL içinde oluşturulan matematik yordamlarını kullanmak için referans gerekir.Bunu yapmak için Çözüm Gezgini içinde MyExecRefsDll projesini seçin, ardından menü çubuğunda Proje, Referanslar öğesini seçin.Özellik Sayfaları iletişim kutusunda, Ortak özellikleri düğümünü genişletin, Framework ve Referanslar'ı seçin ve sonra Yeni Referans Ekle düğmesini seçin.Referanslar iletişim kutusu hakkında daha fazla bilgi için bkz: Çerçeve ve başvuruları, ortak özellikleri <Projectname> Özellik sayfaları iletişim kutusu.

  3. Referans Ekle iletişim kutusu referans gösterebileceğiniz kitaplıkları listeler.Proje sekmesi geçerli çözüm içindeki projeleri ve içerdikleri tüm kitaplıkları listeler.Projeler sekmesinde, MathFuncsDll yanındaki onay kutusunu seçin ve sonra Tamam düğmesini seçin.

  4. DLL öğesinin başlık dosyalarını referans göstermek için eklenen dizinlerin yolunu değiştirmeniz gerekir.Bunu yapmak için Özellik Sayfaları iletişim kutusunda, Yapılandırma Özellikleri düğümünü genişletin, C/C++ düğümünü genişletin ve ardından Genel'i seçin.Ek İçerik Dizinleri'nin yanında MathFuncsDll.h üstbilgi dosyası konumunun yolunu belirtin.Göreli bir yol kullanabilirsiniz—örneğin, ..\MathFuncsDll\—ardından Tamam düğmesini seçin.

  5. MyMathFuncs sınıfını şimdi bu uygulamada kullanabilirsiniz.MyExecRefsDll.cpp içeriğini aşağıdaki kodla değiştirin:

    // MyExecRefsDll.cpp
    // compile with: /EHsc /link MathFuncsDll.lib
    
    #include <iostream>
    
    #include "MathFuncsDll.h"
    
    using namespace std;
    
    int main()
    {
        double a = 7.4;
        int b = 99;
    
        cout << "a + b = " <<
            MathFuncs::MyMathFuncs::Add(a, b) << endl;
        cout << "a - b = " <<
            MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
        cout << "a * b = " <<
            MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
        cout << "a / b = " <<
            MathFuncs::MyMathFuncs::Divide(a, b) << endl;
    
        try
        {
            cout << "a / 0 = " <<
                MathFuncs::MyMathFuncs::Divide(a, 0) << endl; 
        }
        catch (const invalid_argument &e) 
        {
            cout << "Caught exception: " << e.what() << endl; 
        }
    
        return 0;
    }
    
  6. Yürütülebiliri, menü çubuğundan Derleme, Çözümü Derle öğesini seçerek derleyin.

Uygulamayı çalıştırmak için

  1. MyExecRefsDll öğesinin varsayılan proje olarak seçildiğinden emin olun.Çözüm Gezgini içinde, MyExecRefsDll öğesini seçin ve ardından menü çubuğunda Proje, Başlangıç Projesi Olarak Ayarla öğesini seçin.

  2. Projeyi çalıştırmak için menü çubuğunda Hata Ayıklama, Hata Ayıklamadan Başla öğesini seçin.Çıktı buna benzemelidir:

a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475 Yakalanan özel durum: b sıfır olamaz!

Sonraki Adımlar

Önceki:Visual C++ dll | Sonraki:Nasıl yapılır: sınıf kitaplıkları oluşturma

Ayrıca bkz.

Görevler

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

Kavramlar

Visual C++ dll

Visual Basic Uygulamasından DLL İşlevi Çağırma

Diğer Kaynaklar

Masaüstü uygulamaları dağıtma (Visual C++)