[DLL] Sử dụng DLL trong visual C++ (P2)

Trong bài trước chúng ta đã tìm hiểu về cách sử dụng liên kết DLL ở thởi điểm nạp ( Load-time Dynamic Linking). Khi sử dụng liên kết DLL ở thời điểm nạp có thể có 1 số bất tiện sau:

  • Nếu liên kết ở thời điểm nạp tới quá nhiều DLL ứng dụng có thể khởi động chậm vì Windows phải nạp tất cả các DLL đó khi ứng dụng nạp để chạy.
  • Phải sử dụng thư viên liên kết (.lib) để liên kết đến DLL.

Liên kết DLL ở thời điềm chạy (Run-time Dynamic Linking) có thể khắc phục được các vấn đề trên.

  • Liên kết ở thời điểm chạy cần sử dung file DLL nào mới load file DLL đó.
  • Không cần sử dụng thư viện liên kết (.lib).

Vì vậy trong bài viết này mình sẽ giới thiệu các bạn cách sủ dụng liên kết DLL ở thời điểm chạy. Tùy từng project các bạn có sự lựa chọn hợp lý cho mình.

Chú ý:

DLL sử dụng khi Run-time phải được build theo C interface.

Các bạn có thể xem lại cách build DLL theo C interface bằng cách sử dụng extern “C” tại : Sử dụng extern “C” khi tạo DLL

Cách sử dụng DLL Run-time:

  1. Sử dụng hàm LoadLibrary để load DLL
  2. Sau khi DLL được nạp sử dụng hàm GetProcAddress để lấy về địa chỉ trỏ tới hàm xuất ra trong DLL và gán vào con trỏ hàm nào đó.
  3. Sử dụng hàm của DLL thông qua con trỏ hàm vừa gán.

Ví dụ:


#include "stdafx.h"

#include <iostream>

#include <windows.h>

using namespace std;

//Define function pointer

typedef int (*MYPROC) (int, int);

typedef float (*DIV) (int, int);

int main()

{

   int number1, number2;

   cout << "Enter number 1 : "; cin >> number1;

   cout << "Enter number 2 : "; cin >> number2;

   MYPROC Add, Sub, Mul;

   DIV Div;

   HINSTANCE instanceDLL = LoadLibrary(TEXT("DLL.dll"));

   if (instanceDLL != NULL)

   {

      //Load Add function from DLL

      Add = (MYPROC) GetProcAddress(instanceDLL, "Add");

      if (Add != NULL)

      {

         cout << "Tong = " << Add(number1, number2) << endl;

      }

      else

      {

         cout << " Can't load Add function!" << endl;

      }

      //Load Sub function from DLL

      Sub = (MYPROC)GetProcAddress(instanceDLL, "Sub");

      if (Sub != NULL)

      {

         cout << "Hieu = " << Sub(number1, number2) << endl;

      }

      else

      {

         cout << " Can't load Sub function!" << endl;

      }

      //Load Mul function from DLL

      Mul = (MYPROC) GetProcAddress(instanceDLL, "Mul");

      if (Mul != NULL)

      {

         cout << "Tich = " << Mul(number1, number2) << endl;

      }

      else

      {

         cout << " Can't load Mul function!" << endl;

      }

      //Load Div function from DLL

      Div = (DIV)GetProcAddress(instanceDLL, "Div");

      if (Div != NULL)

      {

         try

         {

            cout << "Thuong = " << Div(number1, number2) << endl;

         }

         catch (const std::logic_error& error)

         {

            cout << error.what() << endl;

         }

      }

      else

      {

         cout << " Can't load Div function!" << endl;

      }

      FreeLibrary(instanceDLL);

   }

   else

   {

      cout << "Can't load dll" << endl;

   }

   system("PAUSE");

   return 0;

}

Leave A Comment?