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,035
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:
Tôi khong sử dụng VB6 cho nên khong biết cách build mấy cái này. Bạn Tuân chắc chắn biết nhiều hơn tôi.
 
Upvote 0
Code dll là code đã được dịch ra mã máy rồi. Đương nhiên nhanh hơn VBA vừa chạy vừa dịch.
(trừ phi bạn dùng loại mã chạy trên nền ảo, như CLR chạy trên Dot Net)
Đến bây giờ mình mới hiểu cũng là File *.dll mà có 2 dạng
1 là ActiveX dll và 2 là Standard DLL .... còn hiểu sâu tại sao thì thua .... :D
 
Lần chỉnh sửa cuối:
Upvote 0
File ở Bài 1 viết = VB6 ....còn mấy File cuối này Viết = Delphi 7

Muốn tạo các tính chất của một dll, bạn phải dựa vào builder. Trong lúc build, builder cho phép bạn tuỳ chọn một số điều kiện để có thể ra 32/64 hay cả hai.
VB6 là của MS. Như vậy builder của nó là của MS. Có thể chỉ cần patch thêm mấy cái dll cho phép build office tools.
Delphi là tiêu chuẩn chung. Builder của nó chưa chắc của MS. Bạn phải tìm ngừoi nào đã build thành công rồi mà hỏi.

tb. bạn đã chỉnh xong cái vụ tràn số chưa?
 
Upvote 0
Muốn tạo các tính chất của một dll, bạn phải dựa vào builder. Trong lúc build, builder cho phép bạn tuỳ chọn một số điều kiện để có thể ra 32/64 hay cả hai.
VB6 là của MS. Như vậy builder của nó là của MS. Có thể chỉ cần patch thêm mấy cái dll cho phép build office tools.
Delphi là tiêu chuẩn chung. Builder của nó chưa chắc của MS. Bạn phải tìm ngừoi nào đã build thành công rồi mà hỏi.

tb. bạn đã chỉnh xong cái vụ tràn số chưa?
Cảm ơn bạn chưa chỉnh vụ tràn số ...
đang nghiên cứu cách viết làm sao sử dụng được cái đã ...xong mới nghiên cứu tiếp cái đó
Tự mò học mà ...mò từng cái 1 biết sao đậy .... ai biết cái nào chỉ thêm thì tốt cái đó
 
Upvote 0
1/ Code ở bài 1 lỗi .... Anh Ndu nêu ở Bài 2 & 4 đó là do tạo trên VB6 ... và được trả lời ờ bài 7 là hoàn toàn chính xác ...có lẻ vb6 quá lỗi thời

2/ Còn Vụ Bạn VetMini có nêu tràn số không phải do code mà do Tools để tạo ra nó ...

3/ Mình mới thử Viết lai trên Delphi 7 xử lý được hết các lỗi trên

4/ Chỉ chạy trên Windows_x32 ,Office32, Và Win64 + Office32

5/ Mình Có tìm hiểu trên Internet thấy hầu hết người ta Viết một số ứng dụng trên Delphi cũng có 2 phiên Bản x32 & x64 chưa thấy ai viết 1 ứng dụng chạy ok trên 2 nên tảng đó = Dlephi mà có liên Quan tới Office_x32 và Office_x64

6/ Mạnh thấy Add-ins Atools cũng có bản x32 & x64 ....Nếu Mình nói sai ...Thành thật xin Lỗi vì có nêu Atools ở đây

Nhờ các Bạn test dùm .... sẻ lỗi với Office_x64

xin cảm ơn
 

File đính kèm

  • Test.rar
    62.7 KB · Đọc: 21
Upvote 0
5/ Mình Có tìm hiểu trên Internet thấy hầu hết người ta Viết một số ứng dụng trên Delphi cũng có 2 phiên Bản x32 & x64 chưa thấy ai viết 1 ứng dụng chạy ok trên 2 nên tảng đó = Dlephi mà có liên Quan tới Office_x32 và Office_x64

6/ Mạnh thấy Add-ins Atools cũng có bản x32 & x64 ....Nếu Mình nói sai ...Thành thật xin Lỗi vì có nêu Atools ở đây

Nhờ các Bạn test dùm .... sẻ lỗi với Office_x64

xin cảm ơn

Đúng rồi. Ứng dụng tạo ra không thể vừa 32 vừa 64 bit. Bộ Office từ 2010 của MS cũng 2 bản cài đặt rõ ràng, Add-in A-Tools cũng thế (vì nó phụ thuộc Office). Viết DLL buộc phải tạo theo ứng dụng mẹ (ứng dụng gọi nó), nếu bạn tạo chương trình chạy độc lập mà không can thiệp nhiều bộ nhớ thì 32 bit là cho tất cả các Windows.
DLL có 2 lại: Standard DLL thì không cần đăng ký vào Registry, mục đich cung cấp và chạy các hàm cho ứng dụng mẹ. Windows bản thân nó chạy đc là dùng nhiều hàn API ở các thư viện user32.dll, gdi32.dll, winsock.dll.,,, Đặc biệt loại thư viện này không cung cấp đối tượng COM/Class.
Loại DLL thứ 2 là ActiveX DLL là để tạo các đối tượng COM/Class, lập trình đối tượng như làm Class trong VB6, tuy nhiên lập trình trong Delphi hay hơn nhiều, thừa kế đối tượng rất rõ ràng, loại thư viện này muốn sử dụng được thì phải đăng ký vào Registry (phải cài đặt), nó cũng cho phép tạo các hàm kiểu API giống như Standard DLL, nếu chỉ cần dùng các hàm API này thì không cần đăng ký Registry, còn nếu dùng Class thì bắt buộc. Add-in A-Tools cung cấp một DLL nhưng có 2 tính chất ActiveX và Standard DLL, cho phép người lập trình viết code tương tác vào các Class của nó. (Ví dụ này tạo COM,Class BSConnection để lập trình kết nối CSDL
)
Trong Office sử dụng thư viện, đối tượng bổ sung là FM20.dll , chính là đẻ tạo Userform, các controls trên nó, đó là ActiveX DLL. Loại DLL này tạo phức tạp hơn loại Standard rất nhiều, không dễ như VB6.

Lập trình DLL là dần dần bạn sẽ phải hiểu biết về hệ thống Windows, cơ chế gọi thư viện ở các môi trường, bạn phải debug nhiều ở các môi trường như Windows gì? Office gì? Thời gian bạn phải bỏ ra nghiên cứu gấp 100 lần học VBA nhưng nếu thành công thì bạn đã ở tầm hiểu biết rộng lắm rồi, VBA chỉ là một lĩnh vực lập trình và ứng dụng rất nhỏ và hạn chế trong thế giới ứng dụng của Windows mà thôi.
 
Upvote 0
Đúng rồi. Ứng dụng tạo ra không thể vừa 32 vừa 64 bit. Bộ Office từ 2010 của MS cũng 2 bản cài đặt rõ ràng, Add-in A-Tools cũng thế (vì nó phụ thuộc Office). Viết DLL buộc phải tạo theo ứng dụng mẹ (ứng dụng gọi nó), nếu bạn tạo chương trình chạy độc lập mà không can thiệp nhiều bộ nhớ thì 32 bit là cho tất cả các Windows.
DLL có 2 lại: Standard DLL thì không cần đăng ký vào Registry, mục đich cung cấp và chạy các hàm cho ứng dụng mẹ. Windows bản thân nó chạy đc là dùng nhiều hàn API ở các thư viện user32.dll, gdi32.dll, winsock.dll.,,, Đặc biệt loại thư viện này không cung cấp đối tượng COM/Class.
Loại DLL thứ 2 là ActiveX DLL là để tạo các đối tượng COM/Class, lập trình đối tượng như làm Class trong VB6, tuy nhiên lập trình trong Delphi hay hơn nhiều, thừa kế đối tượng rất rõ ràng, loại thư viện này muốn sử dụng được thì phải đăng ký vào Registry (phải cài đặt), nó cũng cho phép tạo các hàm kiểu API giống như Standard DLL, nếu chỉ cần dùng các hàm API này thì không cần đăng ký Registry, còn nếu dùng Class thì bắt buộc. Add-in A-Tools cung cấp một DLL nhưng có 2 tính chất ActiveX và Standard DLL, cho phép người lập trình viết code tương tác vào các Class của nó. (Ví dụ này tạo COM,Class BSConnection để lập trình kết nối CSDL
)
Trong Office sử dụng thư viện, đối tượng bổ sung là FM20.dll , chính là đẻ tạo Userform, các controls trên nó, đó là ActiveX DLL. Loại DLL này tạo phức tạp hơn loại Standard rất nhiều, không dễ như VB6.

Lập trình DLL là dần dần bạn sẽ phải hiểu biết về hệ thống Windows, cơ chế gọi thư viện ở các môi trường, bạn phải debug nhiều ở các môi trường như Windows gì? Office gì? Thời gian bạn phải bỏ ra nghiên cứu gấp 100 lần học VBA nhưng nếu thành công thì bạn đã ở tầm hiểu biết rộng lắm rồi, VBA chỉ là một lĩnh vực lập trình và ứng dụng rất nhỏ và hạn chế trong thế giới ứng dụng của Windows mà thôi.
1/ Mình có coi trên mạng thấy có mấy Bản Delphi ...Ver 7.0, ... Ver 7.2, và Bản Delphi 7.3.4.3_Lite Edition điều rất nhẹ có mấy trăm MB ...Nhưng không hổ trợ Unicode

2/ Còn bản XE7 và XE8 có hổ trợ Unicode nhưng quá nặng bản XE7 file *.ISO trên 5G , Bản XE8 File *.ISO trên 7G ...khi cài vào máy nó ra khoãng gần 10G lận

3/ Mình biết bạn đang sử dụng Bản Delphi 7 để viết Add-Ins Atools .... Vậy nếu được bạn cho mình hỏi là: bằng cách gì bạn có thể sử dụng được Unicode trong Delphi 7 ....phải chăng phải sử dụng hàm để chuyên đổi Unicode Như VB6 hay Add-ins nào đó ...hay Tạo File *.pas Và *.res để sử dung Unicode

4/ Với một người mới tập làm quen với Delphi như mình xài Bản Delphi 7.3.4.3_Lite Edition là quá tốt (chưa cần thiết đến mấy bản XE)
nếu rành Delphi7 là có thể viết đủ thứ ....nhưng đang kẹt Unicode ....nếu được mong Bạn chỉ dùm làm sao để sử dụng được Unicode trong Delphi7

Xin cảm ơn
 
Upvote 0
1/ Mình có coi trên mạng thấy có mấy Bản Delphi ...Ver 7.0, ... Ver 7.2, và Bản Delphi 7.3.4.3_Lite Edition điều rất nhẹ có mấy trăm MB ...Nhưng không hổ trợ Unicode

2/ Còn bản XE7 và XE8 có hổ trợ Unicode nhưng quá nặng bản XE7 file *.ISO trên 5G , Bản XE8 File *.ISO trên 7G ...khi cài vào máy nó ra khoãng gần 10G lận

3/ Mình biết bạn đang sử dụng Bản Delphi 7 để viết Add-Ins Atools .... Vậy nếu được bạn cho mình hỏi là: bằng cách gì bạn có thể sử dụng được Unicode trong Delphi 7 ....phải chăng phải sử dụng hàm để chuyên đổi Unicode Như VB6 hay Add-ins nào đó ...hay Tạo File *.pas Và *.res để sử dung Unicode

4/ Với một người mới tập làm quen với Delphi như mình xài Bản Delphi 7.3.4.3_Lite Edition là quá tốt (chưa cần thiết đến mấy bản XE)
nếu rành Delphi7 là có thể viết đủ thứ ....nhưng đang kẹt Unicode ....nếu được mong Bạn chỉ dùm làm sao để sử dụng được Unicode trong Delphi7

Xin cảm ơn

Delphi chỉ hỗ trợ Unicode chính thống từ bản Delphi9 (bản này cũng rất nhẹ. Delphi7 là chạy nhẹ và ngon nhất, nếu chỉ để viết ứng dụng nhỏ, không unicode và để học tập thì là đủ.

Tôi viết Add-in A-Tools bằng Delphi từ khi thời phiên bản Delphi7, nhưng tôi viết hỗ trợ unicode. Cách làm như sau:
=> Với ký tự và chuỗi:
+ Với kiểu ký tự, bạn phải thay Char -> WideChar (Char là AnsiChar không hỗ trợ unicode)
+ Với kiểu con trỏ ký tự, bạn phải thay PChar -> PWideChar hoặc PWChar
+ Với kiểu chuỗi, bạn phải thay String , ShortString-> WideString (String là AnsiString, ShortString thực chất là AnsiString[255] đều không hỗ trợ unicode)
(*) Trong Delphi có kiểu dữ liệu OleVariant giống Variant của VB6/VBA nên cũng lưu được unicode nhé.

=> Với Form bạn cần cài component TntUnicode (bạn cần học cách cài các package vì trongDelphi việc tích hợp các mã bên ngoài là rất cần thiết để mở rộng ứng dụng) .

Nếu bạn dùng Delphi7 để viết form và hàm với chuỗi unicode thì bạn sẽ hiểu bản chất về 2 loại chuỗi trong Windows. Còn nếu bạn ngại tìm hiểu sâu mà muốn làm unicode một cách nghiễm nhiên thì tôi khuyến khích bạn cài Delphi9.

Sau này làm ngon rồi, đầu tư con máy RAM, CHIP, HDD tốt thì cài Delphi mới nhất hiện nay là 10.2 chiếm dung lượng ổ cứng tấm 20 GB :D.
 
Upvote 0
Delphi chỉ hỗ trợ Unicode chính thống từ bản Delphi9 (bản này cũng rất nhẹ. Delphi7 là chạy nhẹ và ngon nhất, nếu chỉ để viết ứng dụng nhỏ, không unicode và để học tập thì là đủ.

Tôi viết Add-in A-Tools bằng Delphi từ khi thời phiên bản Delphi7, nhưng tôi viết hỗ trợ unicode. Cách làm như sau:
=> Với ký tự và chuỗi:
+ Với kiểu ký tự, bạn phải thay Char -> WideChar (Char là AnsiChar không hỗ trợ unicode)
+ Với kiểu con trỏ ký tự, bạn phải thay PChar -> PWideChar hoặc PWChar
+ Với kiểu chuỗi, bạn phải thay String , ShortString-> WideString (String là AnsiString, ShortString thực chất là AnsiString[255] đều không hỗ trợ unicode)
(*) Trong Delphi có kiểu dữ liệu OleVariant giống Variant của VB6/VBA nên cũng lưu được unicode nhé.

=> Với Form bạn cần cài component TntUnicode (bạn cần học cách cài các package vì trongDelphi việc tích hợp các mã bên ngoài là rất cần thiết để mở rộng ứng dụng) .

Nếu bạn dùng Delphi7 để viết form và hàm với chuỗi unicode thì bạn sẽ hiểu bản chất về 2 loại chuỗi trong Windows. Còn nếu bạn ngại tìm hiểu sâu mà muốn làm unicode một cách nghiễm nhiên thì tôi khuyến khích bạn cài Delphi9.

Sau này làm ngon rồi, đầu tư con máy RAM, CHIP, HDD tốt thì cài Delphi mới nhất hiện nay là 10.2 chiếm dung lượng ổ cứng tấm 20 GB :D.
Cảm ơn bạn vậy là quá tốt rồi ... Mình sẻ xài Delphi 7 khi nào tốt rồi xài bản XE cũng không sao
Hôm rồi cài bản XE8 thấy viết Unicode trực tiếp luôn rất tốt ...nhưng nặng quá nó chiếm hơn 10G ....ổ cứng ... từng bước nghiên cứu và học tập mà
 
Upvote 0
Web KT
Back
Top Bottom