Cái này trước kia trên clbvb cũng có bàn tới, nhưng cũng không thấy đưa ra vấn đề dùng cho Sub.
Với cách này, thường chỉ thấy mọi người dùng cho hàm (function).
Xin trích dẫn:
Nguồn:
https://caulacbovb.com/forum/viewtopic.php?t=14308
========================
1. Một số khái niệm:
- +DllMain: Là hàm khởi tạo (và cũng là hàm huỷ) trong DLL. Windows sẽ gọi hàm DllMain trong DLL mỗi khi DLL được sử dụng đến hoặc ngưng sử dụng. Vì vậy hàm DLLMain sẽ được sử dụng để khởi tạo và huỷ các biến cần thiết. DllMain có thể có hoặc không cũng được (tuỳ vào DLL mà bạn viết có cần khởi tạo và dọn dẹp hay không)
+Module Definition File: Là tệp tin mô tả các module ở trong file DLL. File DLL kiểu Standard khi viết ra có thể có nhiều hàm ở trong. Tệp mô tả sẽ chỉ ra thứ tự các hàm, nó tham gia vào quá trình biên dịch mã nguồn thành tệp DLL. Tệp mô tả có phần mở rộng là DEF
[Phần này đáng tham khảo thêm]
2. Mod lại file Link.exe:
- A. File Link.exe đóng vai trò gì?
+ Trong IDE của Vb6, khi ta chọn Make chương trình của ta thành file DLL (kể cả khi ta make chương trình thành file EXE) thì IDE sẽ trước tiên gọi file C2.exe để dịch code của chúng ta thành các file *.OBJ. Sau đó nó gọi tiếp file Link.exe để liên kết các file *.OBJ lại tạo ra file DLL hoặc file EXE. Vậy file Link.exe đóng vai trò liên kết các file OBJ để tạo ra tệp dạng binary (Exe hoặc DLL) cuối cùng. Cả file C2.Exe và file Link.exe đều nằm trong C:\Program Files\Microsoft Visual Studio\VB98
B. Vì sao phải Mod lại file Link.exe?
+ Trong VB6, khi IDE gọi file Link.exe để liên kết các file *.OBJ lại, nó truyền cho file Link.exe một loạt các tham số như: đường dẫn của các file *.OBJ, kiểu file đích sẽ tạo ra (DLL hay EXE), đường dẫn của đích sẽ được tạo ra, và 1 số các tham số khác nữa. Tuy nhiên, trong rất nhiều tham số này, lại thiếu mất một tham số là "/DEF". Tham số /DEF chính là tham số chỉ ra đường dẫn của các tệp Module Definition (các tệp *.DEF) ở phần 1. Thiếu các tệp này, DLL tạo ra sẽ không thể sử dụng được các hàm Public bằng phương pháp Declare. Chính vì vậy, ta phải Mod lại file Link.exe để thêm tham số này vào lúc biên dịch
C. Mod lại file Link.exe như thế nào?
+ Phương pháp ở đây là tạo ra 1 file Link.exe giả đặt trong thư mục VB98, còn file Link.exe thật thì đổi tên thành 1 file khác (ví dụ là LinkThat.exe). Khi IDE gọi file Link.exe giả (do ta mod lại) thì file giả của chúng ta sẽ làm nhiệm vụ đọc các tham số được IDE truyền sang, thêm tham số /DEF vào và gọi file LinkThat.exe với tham số mới (đã có /DEF). Tất nhiên là phải kiểm tra, nếu có tồn tại các file *.DEF và project cần tạo là project kiểu DLL thì mới thêm tham số
+ Tiến hành Mod lại file Link.exe
- Mở Vb6, tạo 1 Project mới dạng EXE application
- Xoá Form1 mà Vb đã tự tạo ra cho ta, thêm vào 1 Module mới, đặt tên bất kỳ
- Add Reference vào tệp SCRRUN.DLL trong System32 để sử dụng được đối tượng FileSystemObject
- Copy đoạn code sau, Paste vào Module vừa thêm:
[Đoạn này giống với bài viết #1 nên tôi lược bỏ]
- Dịch chương trình trên thành file Link.exe
- Đổi tên file Link.exe vốn đã có của Vb6 (trong C:\Program Files\Microsoft Visual Studio\VB98) thành
linklnk.exe LinkThat.exe
[Phần này giống với #1 đã nêu. Phụ thuộc vào code mà chúng ta viết ở trên.]
Dòng code 91 ở #1 :
Shell "linklnk.exe " & strCmd
nên chúng ta thống nhất dùng linklnk.exe
- Copy file Link.exe mà ta vừa tạo được ở trên vào thư mục Vb98
3. Cùng tạo DLL nào
- - Tạo 1 Project mới trong Vb6, kiểu Project là ActiveX DLL
- Để nguyên Class1 mà Vb6 đã tạo sẵn cho bạn. Không cần Code gì vào đó cả, nhưng vẫn phải giữ nó lại vì Vb6 cần phải có 1 Class trong Project kiểu ActiveX DLL thì nó mới chạy
- THêm 1 Module mới với tên tuỳ ý. Bạn có thể bắt đầu viết các hàm cho riêng mình vào Module này. Tôi đưa ra 1 ví dụ đơn giản với các hàm tính toán. Module của tôi có dạng như sau:
Trừ hàm DllMain, các hàm khác các bạn có thể thêm bớt tuỳ ý
[Phần này cũng giống #1 đã nêu, tôi trích dẫn lại mang tính bổ sung thông tin]
4. Tạo tệp Module Definition File (.DEF)
- Dùng Notepad, soạn với nội dung sau:
NAME TenTuyY
LIBRARY TenTuyY
DESCRIPTION "Mo ta cua tep DLL- gi cung duoc"
EXPORTS DllMain @1
Add @2
Subtract @3
Square @4
- - Phần nội dung sau NAME, LIBRARY, DESCRIPTION bạn có thể đặt tuỳ ý
- Theo sau EXPORTS là tên các hàm. Nhớ là tên hàm phân biệt hoa-thường nha
- Con số sau ký tự @ là thứ tự của hàm mà bạn đã viết trong Module ở trên
- Lưu tệp soạn thảo này vào thư mục chứa file Project DLL mà ta đã tạo ở bước 3 với tên trùng với tên DLL mà ta muốn tạo, phần mở rộng là .DEF. Ví dụ: nếu ta muốn tạo ra 1 dll có tên là MyLibrary.DLL thì file DEF này sẽ phải lưu với tên là MyLibrary.DEF
[Phần này giống với #1 đã nêu, tôi trích dẫn để bổ sung thông tin]
5. Dịch thành file DLL và sử dụng
- Bây giờ bạn có thể Make cái Project bạn đã tạo ở bước 3 được rồi. từ menu File, chọn Make như với các Project bình thường khác
- Sau khi được file DLL rồi thì chắc là các bạn đã biết cách sử dụng nó như thế nào:
+ Copy file DLL vào cùng thư mục với Project muốn sử dụng nó
+ Khai báo như sau để Import hàm của DLL vào Project
Private Declare Function Add Lib "MyLibrary.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
[Phần này đáng tham khảo thêm]