Sử dụng DLL ActiveX COM mà không cần đăng ký sử dụng với Windows

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/ xuất phát từ chính nhu cầu sử dụng của tôi
2/ trên VB6 thì đâu đó họ cũng đã viết có từ 15 năm trước
3/ trên Delphi cũng có từ 15 năm trước nhưng chưa thấy ai xuất API sử dụng nó
...
5/ Tôi viết 1 Hàm để sử dụng nó load DLL ActiveX mà ko cần đăng ký sử dụng nó
6/ Test trên Excel 64 bít sử dụng tốt ... Tôi ko dùng Excel 32 bít nên ko biết
7/ Úp lên đây là 2 DLL nhỏ gọn 32 và 64 bít .... cho ai có nhu cầu cần thì sử dụng nó
8/ để sử dụng nó yêu cầu lấy Guid của Class mà bạn viết trong DLL khi build nó
9/ chỉ 1 hàm duy nhất đơn giản là bạn có thể sử dụng ActiveX COM DLL do mình viết mà ko cần đăng ký sử dụng nó

Mã:
#If Win64 Then
    Declare PtrSafe Function GetInstance Lib "DirectCOM64.dll" _
            (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
#Else
    Declare PtrSafe Function GetInstance Lib "DirectCOM32.dll" _
            (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
#End If
Rem ==========
Const CLASScVBLib = "{3BF679EA-E443-4311-89EC-F29937A0F9CC}"

Sub Main_GetInstance()
    Dim xx As Object ''As Variant
    Dim DLL As Variant
    DLL = ThisWorkbook.path & "\MyLibrary64.dll"
    Set xx = GetInstance(CLASScVBLib, DLL)
    Range("A1").Value = xx.SelectFilesDialog
    Set xx = Nothing
    Debug.Print TypeName(xx)
End Sub

đính kèm File là code mẫu sử dụng cho Excel 64 bit và DLL 64 bit .... chưa test trên 32 bit

quá trình sử dụng có lỗi vui lòng mô tả Lỗi ... trong phạm vi điều chỉnh tôi sẻ viết lại nó

Chúc ai đó sử dụng linh hoạt và thân thiện nhất ko cần đăng ký sử dụng DLL COM do mình viết với Windows

RegFreeCOM
 
Lần chỉnh sửa cuối:
Bạn nào còn dùng VB6 viết ActiveX DLL thử xem nó chạy tốt đấy

Lưu ý nó không Hổ trợ ActiveX Exe trên VB6

chỉ cần lấy đúng Guid của Class đó + path DLL chính xác là nó chạy các hàm trong VB6 của ai đó thôi

Lách 1 cách thân thiện và nhẹ nhàng không đụng hàng UAC của Windows khi sử dụng ActiveX COM trên PC cài Windows không có quyền Admin
 
để thân thiện hơn tôi viết thêm 1 Hàm nhỏ cho bạn nào đó mới làm quen với lập trình chưa hình dung ra Guid là gì thì sử dụng nó lấy mã guid của 1 Class bất kỳ nào đó đã đăng ký sử dụng DLL với Windows

Vài điều gửi gió 1 chút

1/ để lấy mã guid trên 1 calss của 1 ActiveX DLL chưa đăng ký thì từ xa xưa VB6 họ đã làm dược rồi
2/ trên Delphi thì tôi chưa làm được như mục số 1
3/ Hàm sau chỉ hổ trợ lấy Guid từ 1 ActiveX DLL đã đăng ký sử dụng Với Windows
...
Lách nó như sau:

1/ khi bạn viết DLL = VB6 trên máy của chính Mình thì đăng ký sử dụng nó với Windows
2/ xong mục trên thì sử dụng Hàm tôi viết ( Or bạn viết = Tùy thích ) ... lấy Mã guid đó gán vào hàm GetInstance = xong

3/ Khi gửi dự án code + Tools của Bạn + DLL cho khách hàng thì không cần đăng ký sử dụng nữa .... nó đã tự động load DLL theo Guid + Path DLL rồi

Code đơn giản như sau


Mã:
Sub Main_GetClassIDToGuidStr()
    Dim ClassID As Variant, ClassIDADO
    ClassID = GetClassIDToGuidStr("MyLibrary.cFso")
    ClassIDADO = GetClassIDToGuidStr("ADODB.Recordset")
    Debug.Print "MyLibrary" & vbTab & ClassID
    Debug.Print "ADODB" & vbTab & ClassIDADO
End Sub

xem hình minh họa
Guid.PNG

Nếu ai chưa biết cách lấy Guid từ 1 Class đã đăng ký thì tải File bài này ... chỉ khác Bài số 1 thêm cái hàm lấy Guid từ 1 calss

Rảnh và có thời gian tôi sẻ tìm cách lấy Guid từ 1 class chưa đăng ký và viết thêm vào hàm sau

Khi đó ta chỉ cần truyền cái tên ClassName + path DLL vào hàm là xong

Chúc ai đó tùy biến và sử dụng nó vào mục đích và yêu cầu của mình + đối tác của ai đó ngăn cản không cho đăng ký ActiveX DLL trên PC với quyền Admin

_)(#;_+)(9
 
Lần chỉnh sửa cuối:
Thấy anh khá "tâm huyết" về Delphi và vụ class *.dll này.
Anh có thể giải thích rõ hơn, về việc sử dụng file đính kèm không.
#1. Các modul này giúp add 1 thư viện *.dll bất kỳ mà không cần đăng ký với Window từ trước, chỉ cần lấy được Guid ?
#2. Bằng cách này có thể sử dụng thư viện *.dll của 1 app bất kỳ ?
Click CommandButton1 thì bị lỗi nhu hình.
1666665737422.png

1666665776819.png
 
Thấy anh khá "tâm huyết" về Delphi và vụ class *.dll này.
Anh có thể giải thích rõ hơn, về việc sử dụng file đính kèm không.
#1. Các modul này giúp add 1 thư viện *.dll bất kỳ mà không cần đăng ký với Window từ trước, chỉ cần lấy được Guid ?
#2. Bằng cách này có thể sử dụng thư viện *.dll của 1 app bất kỳ ?
Click CommandButton1 thì bị lỗi nhu hình.
View attachment 282457

View attachment 282458
File tôi Úp đó là dùng cho Excel 64 bit ... nếu dùng cho 32 bít thì viết lại code trên VBA 1 chút thay mấy tên File là 64 thành 32 thử xem + khai báo lại API chút
Vì tôi ko dùng Excel 32 bit nên ko test được


Mã:
Rem ==========
#If Win64 Then
    Declare PtrSafe Function GetInstance Lib "DirectCOM64.dll" _
            (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
    Rem ==========
    Declare PtrSafe Function GetClassIDToGuidStr Lib "DirectCOM64.dll" _
            (ByVal ClassID As Variant) As Variant
#Else
    Declare  Function GetInstance Lib "DirectCOM32.dll" _
            (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
    Rem ==========
    Declare  Function GetClassIDToGuidStr Lib "DirectCOM32.dll" _
            (ByVal ClassID As Variant) As Variant
#End If
Rem ==========
Const CLASScVBLib As String = "{3BF679EA-E443-4311-89EC-F29937A0F9CC}"
Rem ==========
Sub Main_GetInstance()
    Dim xx As Object ''As Variant
    Dim DLL As Variant
    DLL = ThisWorkbook.path & "\MyLibrary32.dll"        ''Cho Excel 32 bit
    Rem DLL = ThisWorkbook.path & "\MyLibrary64.dll"    ''Cho Excel 64 bit
    Set xx = GetInstance(CLASScVBLib, DLL)
    Range("A1").Value = xx.SelectFilesDialog()
    Set xx = Nothing
    Debug.Print TypeName(xx)
End Sub
 
DLL là 32 bít thì chỉ load DLL là 32 bit cái này lịch sử xa xưa Ms bày ra rồi .... trừ khi ai đó hack Or Lách nó

Tôi mới thử đảo ngược dùng từ 64 bit sang 32 bít báo lỗi như hình sau

1666668127802.png
 
Bạn nào đang sử dụng Excel 32 bít mà tải File bài số 1 và số 3 thì Copy code sau thay thế nha

Tối viết lại chút dùng chung cho 32 bit và 64 bit


Mã:
Rem ==========
#If Win64 Then
    Declare PtrSafe Function GetInstance Lib "DirectCOM64.dll" _
           (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
    Rem ==========
    Declare PtrSafe Function GetClassIDToGuidStr Lib "DirectCOM64.dll" _
           (ByVal ClassID As Variant) As Variant
#Else
    Declare  Function GetInstance Lib "DirectCOM32.dll" _
            (ByVal GUIDString As Variant, ByVal DLLPath As Variant) As Variant
    Rem ==========
    Declare  Function GetClassIDToGuidStr Lib "DirectCOM32.dll" _
            (ByVal ClassID As Variant) As Variant
#End If
Rem ========== Tuy chon DLL 32 Bit va 64 Bit
#If Win64 Then
    Const strMyLib As String = "\MyLibrary64.dll"
#Else
    Const strMyLib  As String = "\MyLibrary32.dll"
#End If
Rem ==========
Const CLASScVBLib As String = "{3BF679EA-E443-4311-89EC-F29937A0F9CC}"
Rem ==========
Sub Main_GetInstance()
    Dim xx As Object ''As Variant
    Dim DLL As Variant
    Rem ==========
    Rem DLL = ThisWorkbook.path & "\MyLibrary32.dll"        ''Cho Excel 32 bit
    Rem DLL = ThisWorkbook.path & "\MyLibrary64.dll"        ''Cho Excel 64 bit
    Rem ========== thay the 2 dong tren
    DLL = ThisWorkbook.path & strMyLib
    Rem ==========
    Set xx = GetInstance(CLASScVBLib, DLL)
    Range("A1").Value = xx.SelectFilesDialog()
    Set xx = Nothing
    Debug.Print TypeName(xx)
End Sub
Rem ==========
Sub Main_GetClassIDToGuidStr()
    Dim ClassID As Variant, ClassIDADO
    ClassID = GetClassIDToGuidStr("MyLibrary.cFso")
    ClassIDADO = GetClassIDToGuidStr("ADODB.Recordset")
    Debug.Print "MyLibrary" & vbTab & ClassID
    Debug.Print "ADODB" & vbTab & ClassIDADO
End Sub
Rem ==========

Vài lời gửi cùng gió và mây

Nếu ai đó biết viết DLL ActiveX COM trên VB.net, C#, C++, VB6 ................... theo chuẩn COM của Ms thì làm theo chỉ dẫn bài số 1 và bài số 3 thử xem sao

nha .... hãy thử đi xong cả nói ... mọi cái đã nói hết 3 bài đầu rồi nên không cần thiết nhắc lại nữa
 
Tôi làm mẫu code cho ai còn yêu thích VB6 sử dụng nó

Code trên VB6 như sau
Mã:
Sub test()
    MsgBox " Chay COM VB6"
End Sub

Xem hình Project code VB6

Capture.PNG

Code chạy hàm RegFreeCOM như sau

Mã:
Sub MainVB6_GetInstance()
    Dim sGuid As Variant, xx As Variant
    Dim DLL As Variant
    sGuid = "{416D6362-A063-4953-B638-618F1CBB6153}"
    DLL = "C:\ExcelTools\MyDLL.dll"
    Set xx = GetInstance(sGuid, DLL)
    xx.Test
End Sub

Lưu ý: khi bạn builder lại DLL thì kiểm tra lại cái Guid của Class xem nó có thay đổi hay không

Code Kiểm tra như sau ... trước Khi kiểm tra thì Class đó phải được đăng ký ( Chi tiết bài số 3)

Mã:
Sub MainVB6_GetClassIDToGuidStr()
    Dim ClassID As Variant, ClassIDADO
    ClassID = GetClassIDToGuidStr("MyDLL.cMyClass")
    Debug.Print "MyDLL" & vbTab & ClassID
End Sub

Trên máy tôi mới Builder lại nó ra mã Guid mới là: {416D6362-A063-4953-B638-618F1CBB6153}
Bạn nào đó Builder lại nhớ kiểm tra lại nó

Toàn bộ code VB6 Úp phía dưới

ai đó có khả năng viết trên Delphi, C#, VB.net,c/c++ ........................ theo chuẩn ActiveX DLL COM của Ms thì cứ vậy thử đi xem sao he
 
Rảnh tôi viết thêm bài này tặng cho các bạn đang, đã và sẻ tập tành lập trình kiểu 1 +1 = Tám he

Bài số 8 Tôi hướng dẫn cho dùng Sub thì bài này Tôi hướng dẫn cho cách dùng hàm và cho thấy sự khác nhau khi dùng RegFreeCOM và đăng ký DLL với Windows

1/ Copy code sau vào VB6 File bài số 8

Mã:
Function Cong(a As Double, b As Double) As Double
    Cong = a + b ''VB6
End Function

2/ Cách sử dụng Thông thường khi đăng ký DLL với Windows

Mã:
Sub VBA_Call_Function_VB6()
    Dim xx As Object, MySum As Double
    Set xx = CreateObject("MyDLL.cMyClass")
    MySum = xx.Cong(10, 10)
    Debug.Print MySum
    Set xx = Nothing
End Sub

3/ Cách sử dụng RegFreeCOM mà không cần đăng ký sử dụng DLL Với Windows

Mã:
Private Const sGuid As String = "{8F0A35B7-551C-475A-8C05-ED8EE3AAF1C3}"

Private Sub VBA_Call_Function_VB6_RegFreeCOM()
    Dim xx As Object, MySum As Double
    Dim DLL As Variant
    DLL = "C:\ExcelTools\MyDLL.dll"
    Set xx = GetInstance(sGuid, DLL)
    MySum = xx.Cong(10, 10)
    Debug.Print MySum
    Set xx = Nothing
End Sub

Lưu ý:

1/ Khi Bạn Builder lại DLL nhớ kiểm tra lại Mã sGuid xem có thay đổi hay không ... Nếu thay đổi thì chỉnh sửa lại cho 9 xác

2/ DLL = "C:\ExcelTools\MyDLL.dll" ==> chỉnh sửa lại cái này theo ý của ai đó


Ai đó viết ActiveX DLL COM trên bất cứ Tools nào khác theo chuẩn ActiveX DLL COM của Ms thì cứ thế thử đi he

:::"""><::?>>
 
Lần chỉnh sửa cuối:
Chủ đề này đã truyền đi 1 thông điệp và hoàn thành nó ... Tôi mới xóa hết File bài số 1 và số 3
Úp lại File bài số 1 ... xóa hết các hàm thừa và Fix lại DLL

Dung lượng DLL mới giản hơn 1 MB chỉ còn như Hình sau

1666833933256.png

Nhỏ nhất có thể ... ai đó nếu chưa có khả năng viết được nó và muốn sử dụng nó ... có thể nhúng DLL vào DLL xong load nó từ trong DLL của chính Bạn việc này có làm được hay không thì phụ thuộc vào chính ai đó

Nếu ko làm được cứ Lưu vào đâu đó mà dùng cho khỏe khỏi mệt ra he :p

Dự án chuẩn Tôi Úp lên GitHub ai quan tâm có thể tải trực tiếp trên GitHub Link sau Hoặc File bài số 1 là như nhau

RegFreeCOM - ActiveX DLL
 
Lần chỉnh sửa cuối:
Rảnh tôi mới viết lại Thư viện RegFreeCOM úp lại trên Github còn các File trên này lỗi thời Tôi mới xóa hết

ai quan tâm có thể xem và tải trên github.com Link sau

RegFreeCOM - ActiveX-DLL
 
Web KT
Back
Top Bottom