다음을 통해 공유


연습: 동적 연결 라이브러리 만들기 및 사용(C++)

이 단계별 연습 사용에 대 한 동적 연결 라이브러리 (DLL)는 c + + 응용 프로그램을 만드는 방법을 보여 줍니다.라이브러리를 사용 하 여 코드를 다시 사용할 수 있는 좋은 방법입니다.대신 사용자가 만든 모든 프로그램에서 동일한 루틴을 다시 구현, 한 번만 작성 하 고 기능을 필요로 하는 응용 프로그램에서이 참조 합니다.코드 DLL에 배치를 하 여을 참조 하는 모든 응용 프로그램에서 공간을 절약 하 고 모든 응용 프로그램을 다시 컴파일하지 않고 DLL을 업데이트할 수 있습니다.DLL에 대한 자세한 내용은 Visual C++ Dll을 참조하십시오.

이 연습에서는 이러한 작업을 다룹니다.

  • DLL 프로젝트를 만듭니다.

  • DLL에 클래스를 추가 합니다.

  • 콘솔 응용 프로그램을 만들 로드 타임 동적 링크는 DLL 참조 사용 합니다.

  • 응용 프로그램에서 클래스에서 기능 사용

  • 응용 프로그램을 실행 합니다.

이 연습만 c + + 호출 규칙을 사용 하는 응용 프로그램에서 호출할 수 있는 DLL을 만듭니다.다른 언어와 함께 사용할 Dll을 만드는 방법에 대 한 내용은 Visual Basic 응용 프로그램에서 DLL 함수 호출.

사전 요구 사항

이 항목에서는 사용자가 C++ 언어의 기본적인 사항을 알고 있는 것으로 가정합니다.

동적 연결 라이브러리 (DLL) 프로젝트를 만들려면

  1. 메뉴 모음에서 파일, 새로 만들기, 프로젝트를 선택합니다.

  2. 왼쪽된 창에는 새 프로젝트 대화 상자에서 확장 설치 된, 템플릿, Visual C++, 선택한 다음 Win32.

  3. 가운데 창에서 선택 Win32 콘솔 응용 프로그램.

  4. 프로젝트의 이름을 지정 합니다.-예: MathFuncsDll-에 이름 상자.솔루션의 이름을 지정 합니다.-예를 들어, DynamicLibrary-에서 솔루션 이름 상자.확인 단추를 선택합니다.

  5. 개요 의 페이지는 Win32 응용 프로그램 마법사 대화 상자에서 선택의 다음 단추.

  6. 응용 프로그램 설정 페이지에서 응용 프로그램 종류, DLL.

  7. 선택은 마침 프로젝트를 만들 수 있는 단추입니다.

동적 연결 라이브러리에 클래스를 추가하려면

  1. 메뉴 모음에 새 클래스의 헤더 파일을 만들려면 선택 프로젝트, 새 항목 추가.에 새 항목 추가 대화 상자에서 왼쪽된 창에서 Visual C++, 코드.가운데 창에서 선택 헤더 파일 (.h).헤더 파일의 이름을 지정 합니다.-예를 들어, 다음 Mathfuncsdll.h—and를 선택 된 추가 단추.새 헤더 파일에 표시 됩니다.

  2. 헤더 파일의 시작 부분에 다음 코드를 추가 합니다.

    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
  3. 기본적인 덧셈, 뺄셈, 곱셈과 나눗셈 같은 일반적인 산술 연산을 수행 하는 MyMathFuncs 라는 클래스를 추가 합니다.코드는 다음과 같습니다.

    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 기호가 정의 된 경우 MATHFUNCSDLL_API 기호를 설정 합니다를 __declspec(dllexport) 멤버 함수 선언의이 코드 한정자입니다.이 한정자는 함수를 다른 응용 프로그램에서 사용할 수 있도록 DLL에서 내보낼 수 있습니다.MATHFUNCSDLL_EXPORTS 정의 되지 않은 경우 MATHFUNCSDLL_API에 정의 된 __declspec(dllimport) 멤버 함수 선언에 한정자.이 한정자는 컴파일러를 최적화에 사용할 다른 응용 프로그램에서 DLL에서 함수를 가져오는 수 있습니다.MathFuncsDll 프로젝트를 빌드할 때 기본적으로 MATHFUNCSDLL_EXPORTS에 정의 됩니다.자세한 내용은 >dllexport, dllimport을 참조하십시오.

    [!참고]

    명령줄에서 DLL 프로젝트를 빌드하는 경우 사용 하는 /D MATHFUNCSDLL_EXPORTS 기호를 정의 하려면 컴파일러 옵션.

  4. MathFuncsDll 프로젝트 솔루션 탐색기에서 원본 파일 폴더를 열어 MathFuncsDll.cpp.

  5. 소스 파일에서 MyMathFuncs의 기능을 구현합니다.코드는 다음과 같습니다.

    // 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. 선택 하 여 동적 연결 라이브러리를 컴파일합니다 빌드, 솔루션 빌드 메뉴 모음.

    [!참고]

    표시 되지 않습니다는 Express edition을 사용 하는 경우는 빌드 메뉴 모음에서 메뉴를 선택 도구, 설정, 전문가 설정 으로 설정 하 고 선택 빌드, 솔루션 빌드.

    [!참고]

    명령줄에서 프로젝트를 빌드하는 경우 사용 하는 /LD 컴파일러 옵션을 출력 파일 DLL 임을 지정 합니다.자세한 내용은 /MD, /MT, /LD(런타임 라이브러리 사용)을 참조하십시오.사용 된 /EHsc c + + 예외 처리를 사용 하는 컴파일러 옵션입니다.자세한 내용은 /EH(예외 처리 모델)을 참조하십시오.

DLL을 참조 하는 응용 프로그램을 만들려면

  1. 참조 하 고 메뉴 모음에서 방금 만든 DLL을 사용 하는 c + + 응용 프로그램을 만들려면 파일, New, 프로젝트.

  2. 왼쪽 창에서 아래의 Visual C++, Win32.

  3. 가운데 창에서 선택 Win32 콘솔 응용 프로그램.

  4. 프로젝트의 이름을 지정-예: MyExecRefsDll —에 이름 상자.옆에 솔루션, 솔루션 드롭다운 목록에서.이 DLL이 포함 된 솔루션에 새 프로젝트를 추가 합니다.확인 단추를 선택합니다.

  5. 개요 의 페이지는 Win32 응용 프로그램 마법사 대화 상자에서 선택의 다음 단추.

  6. 응용 프로그램 설정 페이지에서 응용 프로그램 종류, 콘솔 응용 프로그램.

  7. 응용 프로그램 설정 페이지에서 추가 옵션일반의 미리 컴파일된 헤더 확인란을 선택 합니다.

  8. 선택은 마침 프로젝트를 만들 수 있는 단추입니다.

응용 프로그램에서 클래스 라이브러리의 기능을 사용 하려면

  1. 콘솔 응용 프로그램을 만들면 빈 프로그램이 만들어집니다.소스 파일에 대해 이전에 선택한 이름을 동일 합니다.이 예제에서 소스 파일의 이름은 MyExecRefsDll.cpp입니다.

  2. 응용 프로그램에서 DLL에서 만든 수학 루틴을 사용 하려면이 참조 해야 합니다.MyExecRefsDll 프로젝트에서이 작업을 수행 하려면 선택 솔루션 탐색기, 다음 메뉴 표시줄에서 선택 하 고 프로젝트, 참조.에 속성 페이지 대화 상자에서 확장의 공용 속성 노드를 프레임 워크 및 참조, 다음 선택은 새 참조 추가 단추.참조 대화 상자에 대한 자세한 내용은 <Projectname> 속성 페이지 대화 상자, 공용 속성, 프레임워크 및 참조를 참조하십시오.

  3. 참조 추가 대화 상자에는 참조할 수 있는 라이브러리 목록이 표시 됩니다.프로젝트 프로젝트에는 현재 솔루션과 솔루션에 포함 하는 라이브러리 탭에 나열 됩니다.에 프로젝트 탭 MathFuncsDll, 옆에 있는 확인란을 선택 하 고 다음 선택의 확인 단추.

  4. DLL의 헤더 파일을 참조 하려면 포함된 디렉터리 경로 수정 해야 합니다.이렇게 하는 속성 페이지 대화 상자에서 확장의 구성 속성 노드를 확장 된 C/c + + 노드를 선택한 다음 선택 일반.옆에 추가 포함 디렉터리에 MathFuncsDll.h 헤더 파일의 위치 경로 지정 합니다.상대 경로 사용할 수 있습니다-예를 들어.\MathFuncsDll\—then 선택 된 확인 단추.

  5. 이제 이 응용 프로그램에서 MyMathFuncs 클래스를 사용할 수 있습니다.MyExecRefsDll.cpp의 내용을 다음과 같은 코드로 바꿉니다.

    // 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. 실행 파일을 선택 하 여 빌드 빌드, 솔루션 빌드 메뉴 모음.

응용 프로그램을 실행하려면

  1. Myexecrefsdll이 기본 프로젝트로 선택 되어 있는지 확인 합니다.솔루션 탐색기, Myexecrefsdll을 선택한 다음 메뉴 표시줄에서 선택 프로젝트, 시작 프로젝트로 설정.

  2. 메뉴 모음에서 프로젝트를 실행 하려면 디버깅, 디버깅 하지 않고 시작.다음과 같은 결과가 출력됩니다.

+ b = 106.4 a-b =-91.6은 * b = 732.6는 / b = 0.0747475 Caught 예외: b는 0 일 수 없습니다!

다음 단계

이전:Visual C++ Dll | 다음:방법: 클래스 라이브러리 만들기

참고 항목

작업

Visual C++ Guided Tour

Walkthrough: Deploying Your Program (C++)

개념

Visual C++ Dll

Visual Basic 응용 프로그램에서 DLL 함수 호출

기타 리소스

데스크톱 응용 프로그램 (Visual C++)