代码之家  ›  专栏  ›  技术社区  ›  to StackOverflow

如何在VBA中注册类型库

  •  1
  • to StackOverflow  · 技术社区  · 16 年前

    Private Enum RegKind
        RegKind_Default = 0
        RegKind_Register = 1
        RegKind_None = 2
    End Enum
    
    Private Declare Function LoadTypeLibEx Lib "oleaut32.dll" ( _
        pFileName As Byte, ByVal RegKind As RegKind, pptlib As Object) As Long
    Private Declare Function LoadTypeLib Lib "oleaut32.dll" ( _
        pFileName As Byte, pptlib As Object) As Long
    Private Declare Function RegisterTypeLib Lib "oleaut32.dll" ( _
        ByVal ptlib As Object, szFullPath As Byte, _
        szHelpFile As Byte) As Long
    
    Private Sub RegisterTypeLibrary(FileName As String)
    
        Dim abNullTerminatedFileName() As Byte
        Dim objTypeLib As Object
        Dim lHResult As Long
    
        abNullTerminatedFileName = FileName & vbNullChar
        lHResult = LoadTypeLib(abNullTerminatedFileName(0), objTypeLib)
        If lHResult <> 0 Then
            Err.Raise lHResult, "LoadTypeLib", "Error registering type library " & FileName
        End If
        lHResult = RegisterTypeLib(objTypeLib, abNullTerminatedFileName(0), 0)
        If lHResult <> 0 Then
            Err.Raise lHResult, "RegisterTypeLib", "Error registering type library " & FileName
        End If
        Exit Sub
    
    End Sub
    Private Sub RegisterTypeLibrary2(FileName As String)
        Dim abNullTerminatedFileName() As Byte
        Dim objTypeLib As Object
        Dim lHResult As Long
    
        abNullTerminatedFileName = FileName & vbNullChar
        lHResult = LoadTypeLibEx(abNullTerminatedFileName(0), ByVal RegKind_Register, objTypeLib)
        If lHResult <> 0 Then
            Err.Raise lHResult, "LoadTypeLibEx", "Error registering type library " & FileName
        End If
    End Sub
    

    我怀疑这与我的类型库有关。我找到了一个解决方案,并将其作为答案发布在下面。

    2 回复  |  直到 11 年前
        1
  •  2
  •   to StackOverflow    16 年前

    我找到了一个解决方案,使用下面的代码。基本上,LoadTypeLibEx的第三个参数(C/C++中的ITypeLib**)被声明为stdole。而不是Object。

    为此,我需要在VBA项目中添加对stdole32.tlb的引用。

    我怀疑我的类型库中有一些东西意味着它不能被声明为VB(后期绑定)对象。

    我也可以将第三个参数声明为Long,但我不确定这不会导致引用计数问题。

    Private Enum RegKind
        RegKind_Default = 0
        RegKind_Register = 1
        RegKind_None = 2
    End Enum
    
    Private Declare Function LoadTypeLibEx Lib "oleaut32.dll" ( _
        pFileName As Byte, ByVal RegKind As RegKind, pptlib As stdole.IUnknown) As Long
    
    Public Sub RegisterTypeLibrary(FileName As String)
        Dim abNullTerminatedFileName() As Byte
        Dim objTypeLib As stdole.IUnknown
        Dim lHResult As Long
    
        abNullTerminatedFileName = FileName & vbNullChar
        lHResult = LoadTypeLibEx(abNullTerminatedFileName(0), ByVal RegKind_Register, objTypeLib)
        If lHResult <> 0 Then
            Err.Raise lHResult, "LoadTypeLibEx", "Error registering type library " & FileName
        End If
    End Sub
    
        2
  •  1
  •   AMissico    16 年前

    我怀疑你的类型库(TLB)有错误,因为当我对第三方TLB进行测试时,你提供的代码是有效的。

    我假设你会使用你的。NET程序集从VBA。因此,我建议您确保可以从VBA引用TLB而不会出错。

    请注意,您所暴露的所有对象。NET库必须具有不接受任何参数的公共构造函数。这可能是导致问题的原因。