[Wiki dll c++] tạo và dử dụng file dll trong visual studio 2015

hướng dẫn này từng bước cho thấy làm thế nào để tạo ra một thư viện liên kết động (DLL) để sử dụng với một ứng dụng C++. Sử dụng một thư viện là một cách tuyệt vời để sử dụng lại code - tái sử dụng code. Thay vì viết lại các chương trình xử lý dữ liệu bạn đã từng làm trong mỗi chương trình mà bạn tạo ra, bạn viết cho nó một lần và sau đó tham khảo sử dụng lại chúng cho các ứng dụng đòi hỏi phải có các chức năng tương tự các chức năng bạn đã xây dựng từ trước đó. Bằng cách viết code trong các file DLL, giúp bạn tiết kiệm không gian trong mỗi ứng dụng tham chiếu đến nó, và bạn có thể cập nhật các DLL mà không cần biên dịch lại tất cả các ứng dụng. Để biết thêm thông tin về các file DLL, xem các file DLL trong Visual C ++.

Hướng dẫn này bao gồm các nhiệm vụ:

  • Tạo một dự án DLL.
  • Thêm một lớp trong DLL.
  • Tạo một ứng dụng giao diện điều khiển có sử dụng phương thức load-time để tham khảo các DLL.
  • Sử dụng các chức năng của các lớp trong ứng dụng.
  • Chạy các ứng dụng.

Hướng dẫn này sẽ tạo ra một DLL mà chỉ có thể được gọi từ các ứng dụng có sử dụng C++ gọi công ước. Để biết thông tin về làm thế nào để tạo ra các file DLL để sử dụng với các ngôn ngữ khác, xem gọi hàm DLL từ Visual Basic Applications.

Điều kiện tiên quyết
Chủ đề này giả định rằng bạn hiểu được những nguyên tắc cơ bản của ngôn ngữ C ++.

Để tạo một thư viện liên kết động (DLL) dự án

  • Trên thanh menu, chọn File -> New -> Project.
  • Trong khung bên trái của hộp thoại New Project, expand Installed, Templates, Visual C++, và sau đó chọn Win32.
  • Trong cửa sổ trung tâm, chọn Win32 Console Application.
  • Chỉ định tên cho các dự án ví dụ, đặt tên MathFuncsDll trong hộp thoại Name. Chỉ định tên cho các giải pháp, ví dụ DynamicLibrary - trong hộp thoại Solution. Chọn nút OK.
  • Trên trang Overview về các Win32 Application Wizard , chọn nút Next.
  • Trên trang Application Settings, theo Application type, chọn DLL.
  • Chọn nút Finish để tạo dự án.

Để thêm một lớp học để các thư viện liên kết động

Để tạo ra một file header cho một class mới, trên thanh menu, chọn Project -> Add New Item. Trong hộp thoại mục Add New Item, ở khung bên trái, dưới Visual C ++, chọn Code. Trong cửa sổ trung tâm, chọn header file (.h). Chỉ định tên cho các heder file trong ví dụ, MathFuncsDll.h - và sau đó chọn nút Add. Một emty file header được hiển thị.
Thêm Code sau đây để bắt đầu của tập tin tiêu đề:

C ++

// MathFuncsDll.h

#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif

Thêm một lớp cơ bản MyMathFuncs để thực hiện các phép toán thông thường như cộng, trừ, nhân, chia. Code như sau:
C ++

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

Khi MATHFUNCSDLL_EXPORTS được định nghĩa, MATHFUNCSDLL_API sẽ thiết lập các __declspec (dllexport) modifier vào tờ khai chức năng thành viên trong đoạn code trên. Sửa đổi lần này cho phép các chức năng được export bởi các DLL để nó có thể được sử dụng bởi các ứng dụng khác. Khi MATHFUNCSDLL_EXPORTSundefined - ví dụ, khi các tập tin tiêu đề được đưa vào bằng một ứng dụng MATHFUNCSDLL_API xác định __declspec (dllimport) modifier vào tờ khai chức năng thành viên. Sửa đổi lần này sẽ tối ưu hóa inport của các chức năng trong một ứng dụng. Theo mặc định, các mẫu dự án mới cho một DLL cho biết thêm PROJECTNAME_EXPORTS để được xác định cho các dự án DLL.

Trong ví dụ này, MATHFUNCSDLL_EXPORTS được định nghĩa khi dự án MathFuncsDll của bạn được xây dựng. Để biết thêm thông tin, xem dllexport, dllimport.

Note:
Nếu bạn đang xây dựng các dự án DLL trên dòng lệnh, sử dụng/D compiler option để define MATHFUNCSDLL_EXPORTS.

Trong dự án MathFuncsDll trong Solution Explorer, trong thư mục Source Files, mở MathFuncsDll.cpp.
Thực hiện các chức năng cho MyMathFuncs trong tập tin nguồn. Code như sau:

C ++

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

Biên dịch các thư viện liên kết động bằng cách chọn Build, Build Solution trên thanh menu.

Note
Nếu bạn đang sử dụng một phiên bản Express mà không hiển thị một menu Build, trên thanh menu, chọn Tools, Settings, Expert Settings để kích hoạt nó, và sau đó chọn Build, Build Solution.

.

Note
Nếu bạn đang xây dựng một dự án trên dòng lệnh, sử dụng / LD tùy chọn biên dịch để xác định rằng các tập tin đầu ra là để có một DLL. Để biết thêm thông tin, xem / MD, / MT, / LD (Sử dụng Thư viện Run-Time). Sử dụng các tùy chọn trình biên dịch / EHsc để cho phép C ++ xử lý ngoại lệ. Để biết thêm thông tin, xem / EH (Xử lý ngoại lệ Model).

Để tạo ra một ứng dụng mà tham khảo các DLL

  1. Để tạo một ứng dụng C++ sẽ tham khảo và sử dụng các DLL mà bạn vừa tạo ra, trên thanh menu, chọn File -> New -> Project.
  • Trong khung bên trái, dưới Visual C ++, chọn Win32.
  • Trong cửa sổ trung tâm, chọn Win32 Console Application.
  • Chỉ định tên cho các dự án ví dụ-cho, MyExecRefsDll trong hộp thoại Name. Bên cạnh Solution, chọn Add to Solution từ danh sách thả xuống. Điều này cho biết thêm các dự án mới để cùng một giải pháp có chứa các DLL. Chọn nút OK.
  • Trên trang Overview về các hộp thoại Win32 Application Wizard, chọn nút Next.
  • Trên trang Application Settings, theo Application type, chọn Console application.
  • Trên trang Application Settings, theo Additional options, bỏ chọn hộp kiểm Precompiled header
  • Chọn nút Finish để tạo dự án.

Để sử dụng các chức năng từ các thư viện lớp trong ứng dụng

  1. Sau khi bạn tạo ra một ứng dụng giao diện điều khiển, một chương trình có sản phẩm nào được tạo ra cho bạn. Các tên cho tập tin nguồn giống như tên mà bạn đã chọn trước đó. Trong ví dụ này, nó được đặt tên MyExecRefsDll.cpp.
  1. Để sử dụng trong ứng dụng các thói quen toán mà bạn đã tạo trong DLL, bạn phải tham khảo nó. Để làm điều này, chọn dự án **MyExecRefsDll **trong Solution Explorer, và sau đó trên thanh menu, chọn Project, References. Trong hộp thoại Property Pages, nút mở rộng Common Properties, chọn Framework and References, và sau đó chọn nút Add New Reference. Để biết thêm thông tin về các hộp thoại References, xem Thêm tài liệu tham khảo trong dự án Visual C ++.
  1. Hộp thoại Add Reference liệt kê các thư viện mà bạn có thể tham khảo. Các tab Project liệt kê các dự án trong các giải pháp hiện tại và bất kỳ thư viện mà chúng chứa. Trên tab Projects, chọn hộp kiểm bên cạnh MathFuncsDll, và sau đó chọn nút OK.
  1. Để tham khảo các tập tin tiêu đề của DLL, bạn phải thay đổi đường dẫn thư mục bao gồm. Để làm điều này, trong trang Property Pages -> Configuration Properties -> C/C++, và sau đó chọn General. Tiếp theo Additional Include Directories, chỉ định đường dẫn của các vị trí của các tập tin tiêu đề MathFuncsDll.h. Bạn có thể sử dụng một ví dụ đường dẫn cho nó, *…\MathFuncsDll* - Sau đó chọn nút OK.
  1. Bây giờ bạn có thể sử dụng lớp **MyMathFuncs **trong ứng dụng này. Thay thế nội dung của MyExecRefsDll.cpp với đoạn mã sau:

C ++

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

Xây dựng thực thi bằng việc lựa chọn xây dựng, Xây dựng giải pháp trên thanh menu.
Để chạy ứng dụng
Hãy chắc chắn rằng MyExecRefsDll được chọn làm mặc định dự án. Trong Solution Explorer, chọn MyExecRefsDll, và sau đó trên thanh menu, chọn Project -> Set As StartUp Project..
Để chạy dự án, trên thanh menu, chọn Debug -> Start Without Debugging.. Đầu ra phải giống như thế này:

a + b = 106,4
a - b = -91,6
a * b = 732,6
a / b = 0.0747475

Ngoại lệ bắt: b không thể bằng không!

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?