Gọi thủ tục từ một file *.dll (2 người xem)

  • Thread starter Thread starter nvson
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

nvson

Geotechnics
Thành viên danh dự
Tham gia
20/9/06
Bài viết
793
Được thích
1,287
Nghề nghiệp
ĐCTV - ĐCCT
+Trong VB6 tôi tạo một ActiveX DLL; đặt tên class là clsThu.
Sau đó viết Code cho một thủ tục đơn giản như sau:
Public Sub thu123()
MsgBox "Hello"
End Sub
Đặt tên Project là Thu
Dịch ra Thu.dll
+Trong Excel, Insert Module, rồi viết Code như sau:
Declare Sub Thu123 Lib "D:\Nguyen Van Son\Visual Basic\thu.dll" ()

Public Sub thu456()
Call Thu
End Sub


Khi chạy thu456 thì báo lỗi:
Run-time error '453':
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Khi chạy Thu123 thì báo lỗi:
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Mong các bác chỉ dẫn (thật chi tiết) cách gọi một thủ tục từ một file *.dll
 
nvson đã viết:
+Trong VB6 tôi tạo một ActiveX DLL; đặt tên class là clsThu.
Sau đó viết Code cho một thủ tục đơn giản như sau:
Public Sub thu123()
MsgBox "Hello"
End Sub
Đặt tên Project là Thu
Dịch ra Thu.dll
+Trong Excel, Insert Module, rồi viết Code như sau:
Declare Sub Thu123 Lib "D:\Nguyen Van Son\Visual Basic\thu.dll" ()

Public Sub thu456()
Call Thu
End Sub


Khi chạy thu456 thì báo lỗi:
Run-time error '453':
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Khi chạy Thu123 thì báo lỗi:
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Mong các bác chỉ dẫn (thật chi tiết) cách gọi một thủ tục từ một file *.dll


Sau khi bien dich ra file *.dll, ban cần làm thêm động tác nữa là đăng ký Dll đó với Window bằng cách:
- Vào Start/Run Gõ lệnh Regsvr32 Path\*.dll
(Path là đường dẫn của Dll)
Sau dó vào VBA của Excel, Refrence đến cái DLL đó
Tiếp theo mới khai báo biến trong Modul
Public BienThu as new clsThu
Trong Thủ tục gọi DLL lúc này mới dùng được
Call BienThu.Thu123

Chúc bạn thành công.
Nếu không thành công thì qua 60 Nguyễn Viết Xuân, gặp Việt Anh, Tôi tiếp tục giúp bạn thành công
 
Upvote 0
nvson đã viết:
+Trong VB6 tôi tạo một ActiveX DLL; đặt tên class là clsThu.
Sau đó viết Code cho một thủ tục đơn giản như sau:
Public Sub thu123()
MsgBox "Hello"
End Sub
Đặt tên Project là Thu
Dịch ra Thu.dll
+Trong Excel, Insert Module, rồi viết Code như sau:
Declare Sub Thu123 Lib "D:\Nguyen Van Son\Visual Basic\thu.dll" ()

Public Sub thu456()
Call Thu
End Sub


Khi chạy thu456 thì báo lỗi:
Run-time error '453':
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Khi chạy Thu123 thì báo lỗi:
Can't find DLL entry point Thu123 in D:\Nguyen Van Son\Visual Basic\thu.dll

Mong các bác chỉ dẫn (thật chi tiết) cách gọi một thủ tục từ một file *.dll


Bạn cần phân biệt giữa ActiveX DLL với Nomal DLL.

ActiveX DLL là công nghệ ActiveX OLE, còn Nomal DLL là các thư viện được dịch dưới dạng DLL (như kenel32.dll, user32.dll, v.v...). Vì 2 loại DLL trên là khác nhau VỀ BẢN CHẤT nên cách viết (cách tạo) và cách sử dụng 2 loại DLL trên đương nhiên là khác nhau. Bạn cứ hiểu là 1 cái thì liên quan tới các đối tượng, 1 cái thì là thư viện (hôm nọ có người hỏi là class & module khác nhau ở chỗ nào và tớ đã giải thích qua qua 1 chút rồi đấy). Hầu hết các DLL tạo trong VB đều là ActiveX DLL. Còn Normal DLL thường được compiled bằng VC, Delphi, ASM, v.v... Bên cạnh 2 loại DLL trên thì còn 1 loại DLL nữa trong môi trường .NET. Hầu hết các controls for .NET đều có dạng đuôi là DLL.

Mình thì có thể nói bản chất của chúng cho bạn được nhưng để tăng khả năng tự học hỏi (mình thích cách này hơn, chắc bạn cũng sẽ thích cách này giống mình) thì mình giới thiệu 1 phương pháp học trên Internet như sau:

Để biết bản chất của chúng & cách sử dụng chúng như thế nào trong môi trường VB(A) thì bạn có thể Google: "How to use ActiveX DLL in VB" hoặc Google: "How to use DLL in VB"

Hope that helps!

PMXD đã viết:
Public BienThu as new clsThu
Trong Thủ tục gọi DLL lúc này mới dùng được
Call BienThu.Thu123

Viết thế này thì quá nguy hiểm vì:
1 - Khi nào thì sử dụng Public? Tại sao lại dùng Public ở đây?
2 - Trong VB, nếu khai báo
Mã:
Dim objA as New clsThu 

'// Bản chất thì giống như 2 dòng ở dưới nhưng chúng ta ko nên viết như vậy trong VB. 
'// Trong .NET thì ko sao nhưng trong VB thì các chuyên gia khuyên là nên viết như sau 
'// (vì rất nhiều lý do liên quan đến bộ nhớ mà ko thể nói hết ra đây được).
'// Đây chỉ là kinh nghiệm mà thôi.

Dim objA as clsThu 
Set objA = New clsThu
3 - Sử dụng xong thì phải release object bằng cách:

Mã:
Set objA = Nothing
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn đọc bài này và download file của tôi về xem nhé.
http://www.giaiphapexcel.com/forum/showthread.php?p=2686#post2686

Trong VB nếu tạo DLL theo định kiẻu ActiveX DLL thì nó phải được tạo Class, trong Class này bạn tạo các thuộc tính (Property), thủ tục (Sub), hàm (Function), sự kiện (Event),...
Khi muốn sử dụng các dữ kiện của DLL bạn phải khai báo như hai2hai đã hướng dẫn.

Khi khai báo kiểu
Declare...Lib file.dll
file.dll không phải là ActiveX DLL mà phải là một dạng "tĩnh". Tạo file dạng này người ta thường hay tạo trong môi trường ASM,C/C++, Delphi.
 
Upvote 0
To Hai2Hai
Cám ơn bạn vì những ý kiến đóng góp
 
Upvote 0
Có cách nào để VBA tư động đăng ký file DLL không khi open Workbook?
thỉnh thoảng reference lại báo MISSING: ..., tôi lại phải reference lại, mặc dù file DLL vẫn còn và đúng đường dẫn đấy.
 
Upvote 0
Các bạn cho hỏi cách sử dụng lệnh Application.RegisterXLL?
 
Upvote 0
Sau khi bien dich ra file *.dll, ban cần làm thêm động tác nữa là đăng ký Dll đó với Window bằng cách:
- Vào Start/Run Gõ lệnh Regsvr32 Path\*.dll
(Path là đường dẫn của Dll)
Sau dó vào VBA của Excel, Refrence đến cái DLL đó
Tiếp theo mới khai báo biến trong Modul
Public BienThu as new clsThu
Trong Thủ tục gọi DLL lúc này mới dùng được
Call BienThu.Thu123

Chúc bạn thành công.
Nếu không thành công thì qua 60 Nguyễn Viết Xuân, gặp Việt Anh, Tôi tiếp tục giúp bạn thành công
Xin các bạn cho hỏi thêm, có cách nào đăng ký với ứng dụng để sử dụng DLL ngoài cách khai báo trong Refrence (VBA Excel) không?
 
Upvote 0
Mình đang tập VBA và VB6 Viết Code Gọi thủ tục từ một file *.dll
mà gặp lỗi không biết sai chỗ nào xin úp lên nhờ các bạn chỉ dùm
code 1 mình tạo một sub test sau đó tạo thành một file *.dll và dùng một sub khác từ Excel gọi thì chạy ok
1/ code1. code tạo trong file *.dll
PHP:
Sub Test()
    MsgBox "Kieu Van Manh"
End Sub

code1. code tạo trong file Excel
PHP:
Sub Call_FileDLL()
    Dim vbVBA As VB6T.ThongBao
    Set vbVBA = New VB6T.ThongBao
    vbVBA.Test
    Set vbVBA = Nothing
End Sub

2/ cũng tương tự như vậy mình viết một code khác khi chạy báo lỗi mình không hiểu là tại sao mong các bạn chỉ dùm

code tạo trong file Excel này khi chạy báo lỗi
PHP:
Sub Call_Dic()
    Dim vbVBA As Dic.DuyNhat
    Set vbVBA = New Dic.DuyNhat
    vbVBA.Dic_DN
    Set vbVBA = Nothing
End Sub

Code tạo trong file *.dll
PHP:
Sub Dic_DN()
Dim nguon(), kq(), i As Long, j As Long, k As Long
nguon = Range([A4], [B65536].End(xlUp)).Value
ReDim kq(1 To UBound(nguon, 1), 1 To UBound(nguon, 2))
With CreateObject("scripting.dictionary")
    For i = 1 To UBound(nguon)
        If Not .Exists(nguon(i, 1)) Then
            k = k + 1
            .Add nguon(i, 1), k
             kq(k, 1) = nguon(i, 1)
             kq(k, 2) = nguon(i, 2)
        End If
    Next
    [G4].Resize(k, UBound(nguon, 2)) = kq
End With
End Sub
Xin cảm ơn các bạn rất nhiều
 
Upvote 0
Mình đang tập VBA và VB6 Viết Code Gọi thủ tục từ một file *.dll
mà gặp lỗi không biết sai chỗ nào xin úp lên nhờ các bạn chỉ dùm
code 1 mình tạo một sub test sau đó tạo thành một file *.dll và dùng một sub khác từ Excel gọi thì chạy ok
1/ code1. code tạo trong file *.dll
PHP:
Sub Test()
    MsgBox "Kieu Van Manh"
End Sub

code1. code tạo trong file Excel
PHP:
Sub Call_FileDLL()
    Dim vbVBA As VB6T.ThongBao
    Set vbVBA = New VB6T.ThongBao
    vbVBA.Test
    Set vbVBA = Nothing
End Sub

2/ cũng tương tự như vậy mình viết một code khác khi chạy báo lỗi mình không hiểu là tại sao mong các bạn chỉ dùm

code tạo trong file Excel này khi chạy báo lỗi
PHP:
Sub Call_Dic()
    Dim vbVBA As Dic.DuyNhat
    Set vbVBA = New Dic.DuyNhat
    vbVBA.Dic_DN
    Set vbVBA = Nothing
End Sub

Code tạo trong file *.dll
PHP:
Sub Dic_DN()
Dim nguon(), kq(), i As Long, j As Long, k As Long
nguon = Range([A4], [B65536].End(xlUp)).Value
ReDim kq(1 To UBound(nguon, 1), 1 To UBound(nguon, 2))
With CreateObject("scripting.dictionary")
    For i = 1 To UBound(nguon)
        If Not .Exists(nguon(i, 1)) Then
            k = k + 1
            .Add nguon(i, 1), k
             kq(k, 1) = nguon(i, 1)
             kq(k, 2) = nguon(i, 2)
        End If
    Next
    [G4].Resize(k, UBound(nguon, 2)) = kq
End With
End Sub
Xin cảm ơn các bạn rất nhiều
Viết sai tè le sao chạy được chứ
Thử tải file và xem cách làm nhé
 

File đính kèm

Upvote 0
Quên kèm theo code trong VB6 thì coi nổi gì chứ
PHP:
Option Explicit
Private Excel As Excel.Application
Public Property Set ExcelApp(ByRef ExcelApp As Excel.Application)
Set Excel = ExcelApp
End Property
Public Sub ShowMessage()
MsgBox "Hello!", vbInformation
End Sub
Public Sub Unique()
Dim arr(), i As Long, Dic As Object
Set Dic = CreateObject("scripting.dictionary")
With Excel.ActiveWorkbook.Sheets("Sheet1")
    arr = .Range("A1", .[A65536].End(3)).Value
    For i = 1 To UBound(arr)
        Dic.Item(arr(i, 1)) = ""
    Next
    .[D:D].ClearContents
    .[D1].Resize(Dic.Count) = Excel.Transpose(Dic.keys)
End With
End Sub
Private Sub Class_Terminate()
Set Excel = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Quên kèm theo code trong VB6 thì coi nổi gì chứ
PHP:
Option Explicit
Private Excel As Excel.Application
Public Property Set ExcelApp(ByRef ExcelApp As Excel.Application)
Set Excel = ExcelApp
End Property
Public Sub ShowMessage()
MsgBox "Hello!", vbInformation
End Sub
Public Sub Unique()
Dim arr(), i As Long, Dic As Object
Set Dic = CreateObject("scripting.dictionary")
With Excel.ActiveWorkbook.Sheets("Sheet1")
    arr = .Range("A1", .[A65536].End(3)).Value
    For i = 1 To UBound(arr)
        Dic.Item(arr(i, 1)) = ""
    Next
    .[D:D].ClearContents
    .[D1].Resize(Dic.Count) = Excel.Transpose(Dic.keys)
End With
End Sub
Private Sub Class_Terminate()
Set Excel = Nothing
End Sub
một File winrar.exe chạy không được Anh vì Anh chưa đăng ký với win mà phải thêm file sau nữa chạy với quyền Admin mới ok
cho chung với file ra giải nén vào c khi winra giải nén xong thi lập tức chạy file Bat
OK tuyệt vời
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
một File winrar.exe chạy không được Anh vì Anh chưa đăng ký với win mà phải thêm file sau nữa chạy với quyên Admin mới ok
cho chung với file ra giải nén vào c khi ra giải nén xong thi lập tức chạy file Bat
Từ từ nghiên cứu tiếp. Món này coi bộ cũng hấp dẫn đây.
 
Upvote 0
một File winrar.exe chạy không được Anh vì Anh chưa đăng ký với win mà phải thêm file sau nữa chạy với quyền Admin mới ok
cho chung với file ra giải nén vào c khi winra giải nén xong thi lập tức chạy file Bat
OK tuyệt vời
Khi nén file cho luôn dòng lệnh đăng ký vào chung file dll luôn hình như là chạy tốt đấy. Đang test thấy rất khả quan.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom