Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
em không nói là LoadLibrary của thầy ạ. cái đó em hỏi thêm thôi.
theo như trên clip thì máy thầy dùng office 32bit thì phải
còn em dùng office 64 bit, nên em build ra file dll bit và chép vào C:\Windows\SysWOW64
code delphi thế này
Mã:
library MyDLL;
uses
System.SysUtils,
System.Classes;
Function GetSum(a, b: Integer): Integer; stdcall;
begin
Result := a + b;
end;
exports
GetSum;
begin
end.
trên vba e khai báo thế này
Mã:
#If VBA7 And Win64 Then
Declare PtrSafe Function GetSum Lib "MyDLL.dll" (ByVal a As Integer, _
ByVal b As Integer) As Integer
#Else
Declare Function GetSum Lib "MyDLL.dll" (ByVal a As Integer, _
ByVal b As Integer) As Integer
#End If
Public Function MySum(ByVal x As Integer, ByVal y As Integer) As Integer
MySum = GetSum(x, y)
End Function
thì kết quả ở E4, E5 theo công thức bên cạnh thì ra 18448
còn khi thay Integer thành Double thì E3 =getsum(E1;E2) = 0 -> sai E4=mysum(E1;E2) = 150 -> đúng như vậy thì tốn thêm 1 hàm trung gian là MySum, trong khi trên video thầy chỉ thì dùng trực tiếp luôn.
còn code để LoadLibrary em sửa lại như chỉ dẫn của thầy Long thành LongPrt thì code chạy được, không báo lỗi, nhưng
2 chỗ này
Private Function LoadDLL() As LongPtr
Private Sub FreeDLL(hModule As LongPtr)
LongPrt liệu 32 bit có chạy được không thầy
nếu không được thì phải viết lại như thế nào thầy? có phải viết 2 hàm để Load dành riêng cho 32 bit riêng, 64 bit riêng ko thầy.
nội dung code
Mã:
#If VBA7 And Win64 Then
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As LongPtr) As LongPtr
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName$) As LongPtr
#Else
Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName$) As Long
#End If
Dim hModule As LongPtr
Rem 1/ Cach viet nay Ap dung Cho File *.DLL cung Folder lam don Gian khai bao su dung Ham dai dong
Rem 2/ Ap dung Cho WindowsX32: Copy Vao Windows\System32\VBLibrary.dll
Rem 3/ Ap dung Cho WindowsX64: Copy Vao Windows\SysWOW64\VBLibrary.dll
Rem 4/ Neu thuc hien Muc 2 Or 3 thi xoa het Code trong Module Nay
Private Function LoadDLL() As LongPtr
'LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Release\VBLibrary.dll")
#If VBA7 Then
LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Win64\Debug\MyDLL.dll")
#Else
LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Win32\Debug\MyDLL.dll")
#End If
End Function
Rem ==========
Private Sub FreeDLL(hModule As LongPtr)
Do Until FreeLibrary(hModule) = 0
Loop
End Sub
Rem ==========
Sub Auto_Open()
Rem Load the DLL into memory
hModule = LoadDLL()
End Sub
Rem ==========
Sub Auto_Close()
Rem Unload the DLL from memory
Call FreeDLL(hModule)
End Sub
Rem ==========
xem mấy video thì 1 muốn hết là xuất ra exe, xong tạo thư viện dll thì em xem tới trang 9 rồi thì chỉ có mỗi video làm hàm GetSum nhưng làm trên office 32bit , mấy trang sau em chưa xem tới nên không biết có thêm video nào tạo thư viện hàm, Form trên thư viện dll để có thể gọi và thao tác trên excel không. toàn thấy bàn ADO, addins, tò mò copy vô thử thì toàn lỗi chỗ khai báo trên Delphi. nếu chỉ có mỗi 1 video tạo thư viện DLL như vậy thì khó cho người mới như em để bắt đầu quá ạ. vì đây là diễn đàn excel nên chắc mọi người muốn chương trình hoặc tiện ích họ lập ra chạy trên nền excel.
và trên hết mong có nhiều video đến từ thầy hoặc các anh chị khác hướng dẫn trên máy 64bit để em và mọi người có thể xem và đỡ mắc công thầy trả lời và giải đáp mấy lỗi trên 64bit nếu em có hỏi ạ.
Delphi 10.4.1 is a quality-focused release, and this goes for code completion! There are settings to mimic classic code completion behaviour, plus many fixes.
blogs.embarcadero.com
Hay đấy ??!!! ... Không ngờ có thớt này + Sự kiêm trì mò của Mạnh từng bước tiếp cận Delphi ngon lành
Cảm Ơn các Bạn nhiều
em không nói là LoadLibrary của thầy ạ. cái đó em hỏi thêm thôi.
theo như trên clip thì máy thầy dùng office 32bit thì phải
còn em dùng office 64 bit, nên em build ra file dll bit và chép vào C:\Windows\SysWOW64
code delphi thế này
Mã:
library MyDLL;
uses
System.SysUtils,
System.Classes;
Function GetSum(a, b: Integer): Integer; stdcall;
begin
Result := a + b;
end;
exports
GetSum;
begin
end.
trên vba e khai báo thế này
Mã:
#If VBA7 And Win64 Then
Declare PtrSafe Function GetSum Lib "MyDLL.dll" (ByVal a As Integer, _
ByVal b As Integer) As Integer
#Else
Declare Function GetSum Lib "MyDLL.dll" (ByVal a As Integer, _
ByVal b As Integer) As Integer
#End If
Public Function MySum(ByVal x As Integer, ByVal y As Integer) As Integer
MySum = GetSum(x, y)
End Function
thì kết quả ở E4, E5 theo công thức bên cạnh thì ra 18448
còn khi thay Integer thành Double thì E3 =getsum(E1;E2) = 0 -> sai E4=mysum(E1;E2) = 150 -> đúng như vậy thì tốn thêm 1 hàm trung gian là MySum, trong khi trên video thầy chỉ thì dùng trực tiếp luôn. View attachment 244957
còn code để LoadLibrary em sửa lại như chỉ dẫn của thầy Long thành LongPrt thì code chạy được, không báo lỗi, nhưng
2 chỗ này
Private Function LoadDLL() As LongPtr
Private Sub FreeDLL(hModule As LongPtr)
LongPrt liệu 32 bit có chạy được không thầy
nếu không được thì phải viết lại như thế nào thầy? có phải viết 2 hàm để Load dành riêng cho 32 bit riêng, 64 bit riêng ko thầy. View attachment 244958
nội dung code
Mã:
#If VBA7 And Win64 Then
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As LongPtr) As LongPtr
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName$) As LongPtr
#Else
Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName$) As Long
#End If
Dim hModule As LongPtr
Rem 1/ Cach viet nay Ap dung Cho File *.DLL cung Folder lam don Gian khai bao su dung Ham dai dong
Rem 2/ Ap dung Cho WindowsX32: Copy Vao Windows\System32\VBLibrary.dll
Rem 3/ Ap dung Cho WindowsX64: Copy Vao Windows\SysWOW64\VBLibrary.dll
Rem 4/ Neu thuc hien Muc 2 Or 3 thi xoa het Code trong Module Nay
Private Function LoadDLL() As LongPtr
'LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Release\VBLibrary.dll")
#If VBA7 Then
LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Win64\Debug\MyDLL.dll")
#Else
LoadDLL = LoadLibrary(ThisWorkbook.Path & "\Win32\Debug\MyDLL.dll")
#End If
End Function
Rem ==========
Private Sub FreeDLL(hModule As LongPtr)
Do Until FreeLibrary(hModule) = 0
Loop
End Sub
Rem ==========
Sub Auto_Open()
Rem Load the DLL into memory
hModule = LoadDLL()
End Sub
Rem ==========
Sub Auto_Close()
Rem Unload the DLL from memory
Call FreeDLL(hModule)
End Sub
Rem ==========
xem mấy video thì 1 muốn hết là xuất ra exe, xong tạo thư viện dll thì em xem tới trang 9 rồi thì chỉ có mỗi video làm hàm GetSum nhưng làm trên office 32bit , mấy trang sau em chưa xem tới nên không biết có thêm video nào tạo thư viện hàm, Form trên thư viện dll để có thể gọi và thao tác trên excel không. toàn thấy bàn ADO, addins, tò mò copy vô thử thì toàn lỗi chỗ khai báo trên Delphi. nếu chỉ có mỗi 1 video tạo thư viện DLL như vậy thì khó cho người mới như em để bắt đầu quá ạ. vì đây là diễn đàn excel nên chắc mọi người muốn chương trình hoặc tiện ích họ lập ra chạy trên nền excel.
và trên hết mong có nhiều video đến từ thầy hoặc các anh chị khác hướng dẫn trên máy 64bit để em và mọi người có thể xem và đỡ mắc công thầy trả lời và giải đáp mấy lỗi trên 64bit nếu em có hỏi ạ.
Bạn đang học thì nên theo các ví dụ đơn giản chứ đừng động vào mấy cái LoadLibrary. Những hàm này phát huy tốt trong Delphi vì có cách lấy địa chỉ hàm và gọi theo kiểu hàm khai báo. Trong VBA không cho ép kiểu nên đồng động vào LoadLibrary hay GetAddressProc là rắc rối lắm mà không hề cần thiết. Vấn đề lỗi 64 bit bạn gặp phải thì phải có ví dụ code của bạn cụ thể và đừng động vào mấy thứ phức tạp khi mới học.
Bạn đang học thì nên theo các ví dụ đơn giản chứ đừng động vào mấy cái LoadLibrary. Những hàm này phát huy tốt trong Delphi vì có cách lấy địa chỉ hàm và gọi theo kiểu hàm khai báo. Trong VBA không cho ép kiểu nên đồng động vào LoadLibrary hay GetAddressProc là rắc rối lắm mà không hề cần thiết. Vấn đề lỗi 64 bit bạn gặp phải thì phải có ví dụ code của bạn cụ thể và đừng động vào mấy thứ phức tạp khi mới học.
em cảm ơn thầy
giờ em ko dùng LoadLibrary nữa mà cho địa chỉ file thẳng vào khai báo luôn đỡ phải chép file nữa.
vậy còn hàm MySum thế nào vậy thầy! em có thử trên 32 bit thì ra kết quả đúng, còn trên 64 bit em khai báo như trên thì ra kết quả sai, phải thông qua 1 bước trung gian trên VBA thì mới ra kết quả đúng. như thế trên 64 bit thiệt quá.
Vấn đề hàm API sử dụng khi nó lhai báo trực tiếp bằng declare trong Module sẽ lỗi trong Excel 64 bit. Bạn chỉ có cáh là viết lại khai báo cấu trúc hàm dưới dạng hàm VbA, trong đó bạn sử dụng hàm declare từ DLL. lỗi chỉ là dùng hàm khai báo Declare như một UDF (hàm dùng trên worksheet). Vấn đề này là giới hạn của Excel 64 bit. Các ngôn ngữ lập trình như Delphi, Visual C/C++ gặp lỗi như nhau. Cách đây mấy năm mình đã report vấn đề này tới Microsoft và họ không có cách nào khác.
Vấn đề hàm API sử dụng khi nó lhai báo trực tiếp bằng declare trong Module sẽ lỗi trong Excel 64 bit. Bạn chỉ có cáh là viết lại khai báo cấu trúc hàm dươia dạng hàm VbA, trong đó bạn sử dụng hàm declare từ DLL. lỗi chỉ là dùng hàm Declare mhuw một UDF (hàm dùng trên worksheet). Vấn đề này là giới hạn của Excel 64 bit. Các mgoon ngưc lầm trình như Delphi, Visual C/C++ gặp lỗi như nhau. Cacha đây máy năm mình đã report tới Microsoft và họ không có cách nào khác.
Mạnh mới thử cái đó của bạn trên Windows10x64 + Office2016x64 cũng bị vậy
thôi xác định sống chung với lũ thôi hạn chế xài hàm API trên Cells cho Officex64.... nếu xài thì lách qua hàm trung gian của VBA vậy
Úp lên đây cho các Bạn yêu thích Delphi Viết COM Add-ins cho Excel
có thể ứng dụng nó viết DLL API riêng và COM Addins riêng xong liên kết nó lại ====> lách Excel ngăn cản gõ sự kiện trên Form nhúng trên COM Add-Ins
(Code này là của tây đó ko phải của Mạnh he )
Nội dung tây nó viết như sau
Modeless form cannot receive key input in Excel Add-in developed by Delphi
To solve this problem, start another UI thread and run message loop in it is needed.
Steps:
1.Compile MultipleUIThreadsinVCLGroup.groupproj
2.Open cmd as Administrator,use regsvr32 MultipleUIThreadsinVCL.DLL to register the Excel Add-in
3.Open Excel
This solves the following issue:
1. Modeless form cannot receive user input. If start message loop in VCL main thread, form can receive key input but all async function in Excel will be broken.
2.When click Excel work sheet, modeless form doesn't lose focus.
3.When modeless form is open, close Excel will cause crash, and then ask user whether to disable the add-in at next start of Excel.
4.Many other message related problems in Excel add-in.
Tôi không biết có sự liên quan nào tới nhận thức hay tâm lý của học sinh hay không, nhưng tôi không hiểu, tại sao không phù hợp với sinh lý của học sinh.
Theo tôi bỏ đi là được rồi. Học không có tính thực tế.
Muốn dạy thuật toán, tư duy lập trình... thì Python, C++ là quá dữ rồi và tính thực tiễn áp dụng cao.
Theo tôi bỏ đi là được rồi. Học không có tính thực tế.
Muốn dạy thuật toán, tư duy lập trình... thì Python, C++ là quá dữ rồi và tính thực tiễn áp dụng cao.
Nên học pascal cơ bản , vì delphi có ngôn ngữ phần code đơn giản giống hệt pascal
Còn Delphi nên hay không nên thì tùy, nhưng Delphi vẫn kiểu nửa nọ nửa kia vẫn 1 bước nữa tới hoàn toàn hướng đối tượng
Còn phổ thông bỏ pascal là đúng rồi, nhưng học Python hay C++ cũng đều không nên ..... học gì thì xem thế giới họ dạy gì cho học sinh , khác xa ta .... cứ cái gì người lớn có là đem dạy ... hay cứ người lớn nghĩ là đúng .....
Pascl, Python, C++ gì gì đó thì tôi không biết có nên dạy hay không.
Nhưng hướng đối tượng thì hơi khó dạy. HĐT cần tư duy khác hẳn. Số người VN có khả năng tư duy này không nhiều. Số giáo viên có khả năng này lại càng hiếm.
Vào mấy diễn đàn chuyên Java, C# hay C++ sẽ thấy mấy bài tập LTHĐT cứng như que củi, quanh quẩn ba cái ví dụ lớp này lớp nọ. Cái lớp có thể phức tạp kinh khủng nhưng tinh thần HĐT là zê-rô.
Không hề thấy thầy/cô nào dạy học sinh nhìn vào môi trường vấn đề như một khung cảnh mà trong đó có nhiều vật thể tương tác với nhau. Không hề thấy một bài tập nào cho phép học sinh tự do thiết kế các lớp của mình.
Điển hình là xem tất cả các bài tập về Excel mà học sinh đem lên GPE hỏi. Chỉ toàn là lập công thức này công thức nọ chứ chả thấy bài tập nào hỏi cách thiết lập một bảng tính trải rộng hay cách đọc dữ liệu trong bảng tính cả.