Tạo Và Sử Dụng Thư Viện Liên Kết Động *.DLL (Windows API)

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,033
Giới tính
Nam
1/ Mình đang từng bước Nghiên cứu và tập Viết 1 thư viên liên kết động ( Standard DLL) khai báo gọi hàm kiểu Declare ... để khi copy vao bất cứ máy nào cũng có thể sử dụng tốt mà không cần phải đăng ký thư viên với Windows hay hệ điều hành khác vv...

2/ Mình úp lên đây nhờ các Bạn Test dùm trên các máy win32 , Office32, Win64, Office64 và nếu có hệ điều hành khác càng tốt ...và máy đó có cài office ...
Xem nó có chạy hay không ....nếu Lỗi Xin báo lỗi

3/ Code khai báo khi File Test.dll trong Folder D:\TestDLL\Test.dll Như sau:
PHP:
Private Declare Function Chuoi Lib "D:\TestDLL\Test.dll" (ByVal strValue As String) As String
  
Private Declare Function Cong Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
  
Private Declare Function Tru Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Private Declare Function Nhan Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Rem Code trong Module nay Chi su dung duoc Khi File [Test.dll] Copy dung Vao Duong Dan: D:\TestDLL\Test.dll
Rem ==========
Private Sub Test1()
    Dim xx As String
    Cells.ClearContents
    xx = "Kieu .........Manh"
    Range("A1") = Chuoi(xx)
End Sub
Rem ==========
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(2, 7)
End Sub
Rem ==========
Private Sub Test3()
    Cells.ClearContents
    Range("A3") = Tru(10, 7)
End Sub
Rem ==========
Private Sub Test4()
    Cells.ClearContents
    Range("A4") = Nhan(2, 2)
End Sub

4/ Code khai báo khi File Test.dll trong Folder C:\Windws\System32\Test.dll Như sau:
PHP:
Private Declare Function Chuoi Lib "Test.dll" (ByVal strValue As String) As String
  
Private Declare Function Cong Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
  
Private Declare Function Tru Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Private Declare Function Nhan Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Rem Code Trong Module nay chi su dung duoc Khi Copy File Test.dll Vào C:\Windows\System32\Test.dll
Rem ==========
Private Sub Test1()
    Dim xx As String
    Cells.ClearContents
    xx = "Kieu .........Manh"
    Range("A1") = Chuoi(xx)
End Sub
Rem ==========
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(2, 7)
End Sub
Rem ==========
Private Sub Test3()
    Cells.ClearContents
    Range("A3") = Tru(2, 7)
End Sub
Rem ==========
Private Sub Test4()
    Cells.ClearContents
    Range("A4") = Nhan(2, 2)
End Sub

Xin cảm ơn
 

File đính kèm

  • TestDLL.rar
    15.6 KB · Đọc: 23
Lần chỉnh sửa cuối:
1/ Mình đang từng bước Nghiên cứu và tập Viết 1 thư viên liên kết động ( Satndard DLL) khai báo gọi hàm kiểu Declare ... để khi copy vao bất cứ máy nào cũng có thể sử dụng tốt mà không cần phải đăng ký thư viên với Windows hay hệ điều hành khác vv...

2/ Mình úp lên đây nhờ các Bạn Test dùm trên các máy win32 , Office32, Win64, Office64 và nếu có hệ điều hành khác càng tốt ...và máy đó có cài office ...
Xem nó có chạy hay không ....nếu Lỗi Xin báo lỗi

3/ Code khai báo khi File Test.dll trong Folder D:\TestDLL\Test.dll Như sau:
PHP:
Private Declare Function Chuoi Lib "D:\TestDLL\Test.dll" (ByVal strValue As String) As String
 
Private Declare Function Cong Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
 
Private Declare Function Tru Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Private Declare Function Nhan Lib "D:\TestDLL\Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Rem Code trong Module nay Chi su dung duoc Khi File [Test.dll] Copy dung Vao Duong Dan: D:\TestDLL\Test.dll
Rem ==========
Private Sub Test1()
    Dim xx As String
    Cells.ClearContents
    xx = "Kieu .........Manh"
    Range("A1") = Chuoi(xx)
End Sub
Rem ==========
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(2, 7)
End Sub
Rem ==========
Private Sub Test3()
    Cells.ClearContents
    Range("A3") = Tru(10, 7)
End Sub
Rem ==========
Private Sub Test4()
    Cells.ClearContents
    Range("A4") = Nhan(2, 2)
End Sub

4/ Code khai báo khi File Test.dll trong Folder C:\Windws\System32\Test.dll Như sau:
PHP:
Private Declare Function Chuoi Lib "Test.dll" (ByVal strValue As String) As String
 
Private Declare Function Cong Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
 
Private Declare Function Tru Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Private Declare Function Nhan Lib "Test.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Rem Code Trong Module nay chi su dung duoc Khi Copy File Test.dll Vào C:\Windows\System32\Test.dll
Rem ==========
Private Sub Test1()
    Dim xx As String
    Cells.ClearContents
    xx = "Kieu .........Manh"
    Range("A1") = Chuoi(xx)
End Sub
Rem ==========
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(2, 7)
End Sub
Rem ==========
Private Sub Test3()
    Cells.ClearContents
    Range("A3") = Tru(2, 7)
End Sub
Rem ==========
Private Sub Test4()
    Cells.ClearContents
    Range("A4") = Nhan(2, 2)
End Sub

Xin cảm ơn
Thử vầy là biết code ổn hay không liền:
Mã:
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(30000, 40000)
End Sub
Đã đóng gói thành DLL thì nhất định không được để lỗi đáng tiếc nào xảy ra
 
Upvote 0
Thử vầy là biết code ổn hay không liền:
Mã:
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(30000, 40000)
End Sub
Đã đóng gói thành DLL thì nhất định không được để lỗi đáng tiếc nào xảy ra
Cảm ơn Anh ...Em đang Nghiên cứu Và tập Viết Mà ....hehe
 
Upvote 0
Thử vầy là biết code ổn hay không liền:
Mã:
Private Sub Test2()
    Cells.ClearContents
    Range("A2") = Cong(30000, 40000)
End Sub
Đã đóng gói thành DLL thì nhất định không được để lỗi đáng tiếc nào xảy ra

Bị lỗi gì vậy bác?
Nhìn thì biết ngay là lỗi tràn số. Nhưng lỗi ra sao thì khong biết, vì máy làm việc của tôi không lắp các phần mềm ngoại.
Sở dĩ tôi hỏi lỗi gì là vì có hai loại lỗi:
1. lỗi khong tính được - cái này có thể châm chế, vì ngừoi dùng chỉ cần tránh đi
2. lỗi tính ra kết quả sai - cái này khong thể chấp nhận vì nếu đem làm thư viện, toi có một module cỡ ngàn dòng, gọi code này cỡ chục lần thì ông nội toi cũng khong debug nổi (sai chưa chắc đã nhận ra, nói chi debug)

Cảm ơn Anh ...Em đang Nghiên cứu Và tập Viết Mà ....hehe

Quy luật đầu tiên của viết code thư viện là test giới hạn - tiếng trong nghề gọi là boundary test.
Hàm tính toán integer thì tối thiểu phải test các giới hạn:
1. giới hạn 0
2. giới hạn âm
3. giới hạn tràn số (>= 32768)
 
Upvote 0
Tôi định không viết gì ở topic này nhưng sợ mất thời gian test của mọi người nên đành góp ý.

1. DLL của bạn dùng VB6 để tạo. Vậy là không hỗ trợ chuỗi unicode, không hỗ trợ trong môi trường 64-bit. Các bạn đang chạy Excel 64-bit thì khỏi test sẽ mất thời gian nhé.
2. Đừng dùng VB6, .NET để tạo DLL kiểu Standard DLL, nó không phải là chuẩn Standard DLL. Hai môi trường đó đều là môi trường thông dịch. nếu làm từ .NET thì máy của người dùng phải cài Framework.NET x.x. VB6 thì cũng thông dịch qua "MSVBVM60.DLL" và không unicode - Đây là đồ cổ, MS không còn phát triển nó nữa.

Nếu bạn chỉ biết về VB6, kể cả là dân chuyên gia thì cũng đừng nên đầu tư làm Standard DLL sẽ mất thời gian vô ích.
 
Upvote 0
Upvote 0
Lúc đầu em cũng định viết DLL bằng VB6 nhưng rõ ràng như anh Tuân nói, nó sẽ phá sản nếu sử dụng cho win 64bit.
 
Upvote 0
Lúc đầu em cũng định viết DLL bằng VB6 nhưng rõ ràng như anh Tuân nói, nó sẽ phá sản nếu sử dụng cho win 64bit.
sao Mình nhờ Tân chạy trên Win64 ...còn Office chưa hỏi ...Thấy ok mà ...Tối nay nhờ lại xem
Không biết có ai xài office64 nhờ test dùm...còn code lỗi tìm cách điều chỉnh sau vấn đề là có chạy được trên môi trường Win64 + Office64 ko cái đã
Xong Tính tiếp ...Nghiên cứu mà ...
 
Upvote 0
sao Mình nhờ Tân chạy trên Win64 ...còn Office chưa hỏi ...Thấy ok mà ...Tối nay nhờ lại xem
Không biết có ai xài office64 nhờ test dùm...còn code lỗi tìm cách điều chỉnh sau vấn đề là có chạy được trên môi trường Win64 + Office64 ko cái đã
Xong Tính tiếp ...Nghiên cứu mà ...
Anh kieu manh cần test gì gửi em làm cho (win 64 + excel 64). Hướng dẫn em làm từng bước nhá! ;)

64b.jpg
 
Upvote 0
Upvote 0
Tôi định không viết gì ở topic này nhưng sợ mất thời gian test của mọi người nên đành góp ý.

1. DLL của bạn dùng VB6 để tạo. Vậy là không hỗ trợ chuỗi unicode, không hỗ trợ trong môi trường 64-bit. Các bạn đang chạy Excel 64-bit thì khỏi test sẽ mất thời gian nhé.
2. Đừng dùng VB6, .NET để tạo DLL kiểu Standard DLL, nó không phải là chuẩn Standard DLL. Hai môi trường đó đều là môi trường thông dịch. nếu làm từ .NET thì máy của người dùng phải cài Framework.NET x.x. VB6 thì cũng thông dịch qua "MSVBVM60.DLL" và không unicode - Đây là đồ cổ, MS không còn phát triển nó nữa.

Nếu bạn chỉ biết về VB6, kể cả là dân chuyên gia thì cũng đừng nên đầu tư làm Standard DLL sẽ mất thời gian vô ích.

Thực ra chương trình dll anh viết vẫn hoạt động được trong 64bit. Nhưng chạy rất phập phù, có máy ăn ngay, có máy báo lỗi có giời mới hiểu.
 
Upvote 0
Tôi đã nói rõ như ban ngày rồi mà các chuyên gia vẫn đâm đầu test cho biết à? Khổ các bác quá :D
 
Upvote 0
Web KT
Back
Top Bottom