[C++] Tạo DLL bằng VC++

NhanSu

SMod
Thành viên BQT
Chào các bạn, trong chủ đề này, mình sẽ giới thiệu cách tạo DLL bằng C++, mình sẽ sử dụng Visual Studio (VS) 2019 để minh họa cách làm. Dùng DLL có một số ưu điểm so với VBA như tốc độ cao (mình chủ yếu quan tâm đến vấn đề này), bảo mật hơn, tuy vậy cũng khó viết, khó debug với người chỉ quen vba như mình chẳng hạn. Bài 1 mình tham khảo ở và có lồng ghép thêm cách truyền tham số kiểu byval và byref.
Mình sẽ minh họa DLL chỉ có hàm SumX(Byval a As Integer, ByRef b As Integer) hàm này tăng a thêm 1, tăng b thêm 2 và trả về kết quả a+b (a và b đã thay đổi).
Trước tiên, mở VS lên, chọn Create new project:
Bạn cần đăng nhập để thấy đính kèm

Trong màn hình Create new project, các bạn nhập DLL vào khung tìm kiếm rồi chọn Dynamic-Link Library (DLL) sau đó bấm Next
Bạn cần đăng nhập để thấy đính kèm

Tại màn hình tiếp, nhập tên Project (mình đặt tên là TestDLL) rồi bấm Create, ta được:
Bạn cần đăng nhập để thấy đính kèm


Trong cửa sổ Solution explorer bên phải màn hình, bấm chuột phải, chọn Add - New item..., chọn Header.h, đặt tên cho file (ví dụ TestDLL.h) rồi bấm nút Add. Nhập nội dung vào file TestDLL.h như sau:
Mã:
#pragma once
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
extern "C" TESTDLL_API int SumX(int a, int* b);
Các bạn bấm chuột trái vào dòng cuối file header (dòng extern "C"...), bấm Alt-Enter rồi chọn Create definition of SumX in TestDLL.cpp (trong hình mình đã có SumX rồi nên mình chọn hàm SumX2)
Bạn cần đăng nhập để thấy đính kèm

Nhập đoạn mã sau vào hàm SumX:
Mã:
#include "pch.h"
#include "TestDLL.h"

TESTDLL_API int SumX(int a, int* b)
{
    a++;
    *b = *b + 2;
    return a + *b;
}
Bạn cần đăng nhập để thấy đính kèm


Bước cuối: lựa chọn cấu hình build là release, x64 (do mình dùng Excel 64 bit, nếu các bạn dùng 32 bit thì cần build DLL tương ứng) rồi vào menu Build, chọn Build Solution, ta sẽ có file DLL
Bạn cần đăng nhập để thấy đính kèm

- Tiếp theo, ta sẽ test DLL vừa tạo, copy TestDLL.dll vào D:\abc\, tạo file TestDLL.xlsm với code VBA như sau (mình dùng 64 bit, các bạn dùng 32 bit cần sửa lệnh Declare):
Mã:
Declare PtrSafe Function SumX Lib "D:\abc\TestDLL.dll" (ByVal a As Integer, b As Integer) As Integer
Sub Test()
    Dim a As Integer, b As Integer
    a = 10
    b = 5
    Debug.Print SumX(a, b)
    Debug.Print a
    Debug.Print b
End Sub
Kết quả, đúng như dự đoán, sau khi gọi hàm, biến a không thay đổi còn b đã tăng thêm 2:
Bạn cần đăng nhập để thấy đính kèm
 
Top