Cách tạo file DLL trong Visual C++ 2005
Hôm nay Khánh tôi xin giới thiệu với mọi người về cách tổ chức chương trình bằng cách tạo ra file DLL trong Visual C++ 2005.
I. Dynamic Link Library – DLL (Thư viện liên kết động)
DLL là một thư viện chứa các hàm và dữ liệu mà có thể sử dụng bởi nhiều ứng dụng khác nhau ở cùng một thời điểm. Khi đã được viết và đóng gói trong một DLL, một hàm có thể được sử dụng ở bất cứ ứng dụng nào dưới dạng mã máy của nó mà không phải quan tâm đến mã nguồn nó được viết chi tiết ra sao.
Các DLL là một hay nhiều module được chia ra từ một chương trình, nhằm mục đích reuse code.
1. Ưu điểm
Giảm không gian sử dụng bộ nhớ:
Do hàm và dữ liệu trong các DLL được chia sẻ bởi các ứng dụng dùng nó. Ví dụ: Các ứng dụng Winword, Excel, Internet Explorer sẽ chia sẻ chung một phương thức print() đã được biên dịch thành mã máy để trong một dll nào đó. Điều đó dẫn đến các ứng dụng sẻ chỉ phải các hàm này khi nào cần dùng đến (giảm được dung lượng bộ nhớ của chương trình).
Hơn nữa mã trong dll nằm trong khu vực chỉ cho đọc và được nạp(load) vào các trang được đánh dấu chỉ đọc (read-only). Nó cho phép hệ thống tham chiếu DLL vào không gian địa chỉ nhớ của các tiến trình sử dụng nó. Và như vậy, DLL chỉ cần nạp một lần, và nếu một tiến trình sử dụng nó, hệ thống chỉ việc tham chiếu tới không gian lưu trữ địa chỉ nhớ của DLL (Giảm không gian sử dụng bộ nhớ).
Lập trình module
Khi được xây dựng một DLL với các chức năng hợp lý, ta có thể sử dụng nó trong bất cứ ứng dụng nào mà ta cảm thấy thích hợp. Thay vì sẽ phải viết lại hay copy and paste code của cùng một chức năng ở các chương trình khác nhau ta chỉ cần tạo ra chức năng đó 1 lần sau đó build thành dll để cho các chương trình tham chiếu đến để sử dụng. Ví dụ như chức năng MessageBox trong windows chẳng hạn, thay vì mỗi chương trình trong windows ta phải tạo ra MessageBox thì lúc này ta chỉ cần tham chiếu đến thư viện user32.dll và thực thi hàm MessageBox.
Dễ dàng trong quá trình triển khai ứng dụng
Trong quá trình triển khai ứng dụng việc phải sửa lại chương trình do yêu cầu của khách hàng hay do lỗi hệ thống hoặc lập trình là điều rất dễ xảy ra. Nhất là với những chương trình đã cài đặt được một thời gian và cung cấp cho những khách hàng ở xa. Thì việc đóng gói và phân phối lại toàn bộ sản phẩm cho khách hàng là điều hết sức khó khăn. Tuy nhiên nếu chương trình của chúng ta phát triển theo hướng xây dựng các module và build trong các dll thì chúng ta chỉ cần phát hiện module nào bị lỗi. Sau đó thay đổi và đóng gói dll chứa module đó và gửi tới cho khách hàng cập nhập.
2. Hạn chế của DLL
Mặc dù DLL có khá nhiều ưu điểm như trên tuy nhiên nó cũng tồn tại khá nhiều hạn chế.
DLL Hell
Địa ngục DLL là khó khăn lớn nhất thỉnh thoảng gặp khi dùng dll. Các lỗi có thể xảy ra như một số chương trình đã nạp lên nhưng không thể khởi động được hoặc một số chương trình đang hoạt động bình thường bỗng nhiên bị trục trặc khi ta cài đặt mới một ứng dụng. Nguyên nhân cơ bản của sự cố trên là do chương trình cài đặt không kiểm tra phiên bản của các DLL trước khi sao lưu nó vào trong thư mục hệ thống. Khi một DLL mới thay thế một DLL cũ đã có sẵn, nếu DLL này có nhiều thay đổi hoặc không tương thích với các chương trình sử dụng phiên bản cũ nó sẽ gây ra lỗi ở chương trình đó.
Cài đặt, gỡ bỏ
Do một chương trình có thể được chia thành nhiều component nên thay vì ta chỉ phải đăng ký với hệ thống 1 lần duy nhất nay ta sẽ phải đăng ký thành nhiều lần với hệ thống. Hơn nưa khi gỡ bỏ phần mềm cũng sẽ gặp khó khăn rất nhiều do một dll có thể chia sẻ bởi nhiều ứng dụng.
Có bạn nào mà đang sử dụng WMP 11 ko? Nếu như máy của bạn là đời cổ, mà khi đang sử dụng WMP11 sẽ có thông báo lỗi là: wmsetup.dll bị lỗi. Đó là do không đúng phiên bản hoặc là do nó bị lỗi về Dll đấy. Còn những bạn sử dụng máy đời mới thì đương nhiên mình không nói làm gỉ cả. Nhưng sau khi đọc bài viết này, chắc các bạn sẽ biết rõ hơn về DLL.
Bây giờ tôi sẽ thử viết một chương trình về DLL.
Trên Menu vào File->New->Project. Chọn Win32 Console Application, trong Solution Name điền DynamicLibrary. Tiếp theo trong Overview chọn Next. Đến Application Settings chọn DLL và chọn Empt project. Bấm Finish.
Thêm class vào DLL
Bên trái của workspace kích chuột phải vào Header file chọn Add new Item… xuất hiện hộp thoại chọn Header file(.h) và điền tên: MathFuncsDll.h. Đưa thử đoạn code sau đây:
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a – b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
Tiếp tục như vậy, chọn Add new Item ở phần Source File và chọn C++ file(.cpp) có tên là MathFuncsDll.cpp
thêm đoạn code sau:
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include “MathFuncsDll.h”
#include
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 new invalid_argument(“b cannot be zero!”);
}
return a / b;
}
}
Đây chính là File DLL, để biên dịch chọn Project->MathFuncs DLL Properties. Chọn Configuration Properties->General. Thay đổi Configuration Type là Dynamic Library (.dll) ->OK. Lưu lại, chọn built->built solution.
Tháng Một 29, 2009 lúc 10:47 sáng
thanks
Tháng Ba 1, 2009 lúc 4:17 chiều
Just passing by.Btw, your website have great content!
_________________________________
Making Money $150 An Hour
Tháng Mười 23, 2009 lúc 2:54 sáng
anh khánh ơi sau khi tạo xong mình dùng thế nào hả anh,anh cho ví dụ được ko
Tháng Mười 23, 2009 lúc 2:58 sáng
làm sao để dùng file dll vừa tạo trong một project khác
Tháng Mười Hai 22, 2009 lúc 5:03 chiều
Chào bác Khánh!^^. Bác ơi, bác cứu em code cho em cái yêu cầu này với. “Xây dựng 1 lớp lấy message từ memory buffer sau đó log ra file xml”. E sắp bị 1 tiền bối hắt hủi vì ko làm đc yêu cầu trên. Vì thế mong bác giúp em, reply càng sớm tốt. Em cảm ơn bác nhìu nhìu ạ.
Tháng Một 27, 2010 lúc 9:28 sáng
- Gui ban studentit: De tao file DLL vua tao trong 1 project khac, ban co the dung “import” file DLL do vao project cua ban. De hieu ro hon ban tra cuu MSDN nhe. Than.
- Gui ban hoc_va_yeu: Van de xay dung 1 lop lay Message tu BefferedReader sau do log ra file .XML. Theo toi, viet bang Java nhanh hon va hieu qua hon 1 chut. Neu ban thay can thiet, ban hay lien he voi toi qua email: khanh.luongvan@yahoo.com.vn. Cam on.
Tháng Hai 24, 2010 lúc 8:24 sáng
Gửi bạn Thanh Huy.
Mình xin góp ý với bạn cách sử dụng file DLL của C++ trong C#. Trước hết bạn test lại file DLL đó xem nó có được gọi 1 cách chính xác ko đã. Nếu OK rồi thì trong C#, bạn đã import chuẩn file DLL đó chưa? ví dụ như:
using System.Runtime.InteropServices;
[DllImport("user32.dll")] // user32.dll la ten file dll cua ban.
public static extern int MessageBox(int hWnd, String text,String caption, uint type); // Ham nay la prototype giong nhu dll cua ban.
…
Bạn có thể tham khảo qua MSDN có nói về vấn đề này. Nếu chưa rõ lắm, bạn gãy gửi chương trinh của bạn cho mình mình sẽ góp ý tiếp. Chào bạn.
Tháng Tám 13, 2010 lúc 9:22 sáng
thanks