AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé!

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Lạ nhỉ em đọc từ bài đầu thì thấy bác tham gia từ năm 2018, thấy bác viết Api, dlll, ocx clien server sql gì tùm lum mà sao học lại cái này nhỉ ===\.
 
Upvote 0
Tôi có bói gì đến LoadLibrary đâu. Cả link bạn trích dẫn cũng không liên quan gì.
Bài đã được tự động gộp:
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.
1599386359813.png
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.
1599386629911.png
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 ạ.
 
Upvote 0

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 -0-0-0-
Cảm Ơn các Bạn nhiều

1599542250983.png
 
Upvote 0
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.
 
Upvote 0
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á.
 
Upvote 0
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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

1599571439333.png
 
Upvote 0
Ú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.
5.gif
 

File đính kèm

  • MultipleUIThreadsinVCL.zip
    29.5 KB · Đọc: 41
Lần chỉnh sửa cuối:
Upvote 0
Delphi hổ trợ thấy cũng nhiều thứ quá tốt

Học Delphi Mạnh thấy cái hay của nó là có thể chia Sẻ mã nguồn cho người khác xài mà vẫn bảo vệ tốt mã nguồn của mình

đó là gửi File *.dcu cho người nhận chia sẻ code -0-0-0-

1599881242181.png
 
Lần chỉnh sửa cuối:
Upvote 0
Delphi hổ trợ thấy cũng nhiều thứ quá tốt

Học Delphi Mạnh thấy cái hay của nó là có thể chia Sẻ mã nguồn cho người khác xài mà vẫn bảo vệ tốt mã nguồn của mình

đó là gửi File *.dcu cho người nhận chia sẻ code -0-0-0-

View attachment 245419
Về chia sẻ DCU thì cũng không phải là nhẹ nhàng, thú vị hoàn toàn. DCU cũng có phiên bản (phiên bản compiler). Nếu người dùng có phiên bản khác(phiên bản Delphi - compiler) thì không dùng được.
 
Upvote 0
Upvote 0
Không biết mấy tay nhà báo nó viết vậy có khách quan không nhỉ ?????!!!

View attachment 245433


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.
 
Upvote 0
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.
vậy việc Học Delphi ta có nên bỏ không nhỉ :p
mà Delphi có nguồn gốc từ Pascal
 
Upvote 0
vậy việc Học Delphi ta có nên bỏ không nhỉ :p
mà Delphi có nguồn gốc từ Pascal
Thực ra người ta nói về Pascal, cũ lắm rồi. Delphi không phải là ngôn ngữ, Delphi là MÔI TRƯỜNG lập trình. Ngôn ngữ được dùng là Object Pascal. Pascal và Object Pascal là khác nhau.
 
Upvote 0
oh mà chưa học pascal ngày nào luôn ta ... mấy sư phụ keo nên học lại căn bản pascal ... giờ tính sao đây ???
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 .....
 
Upvote 0
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ả.
 
Upvote 0
Không biết ai như mình không. Chọn Delphi là ngôn ngữ chính từ năm 2007, đi ngược với xu thế lúc đó trào lưu sang .net. :D
 
Upvote 0
Web KT
Back
Top Bottom