Как зарегистрировать библиотеку типов в VBA - PullRequest
1 голос
/ 30 октября 2009

Я пытаюсь зарегистрировать библиотеку типов программно из кода VBA, используя два варианта метода, найденного с помощью Google (Subs RegisterTypeLibrary и RegisterTypeLibrary2 ниже).

Приведенный ниже код дает сбой при нарушении прав доступа при вызове LoadTypeLib / LoadTypeLibEx. Что я делаю неправильно? В случае необходимости библиотека типов представляет собой файл TLB, сгенерированный из сборки .NET с использованием tlbexp.

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

EDIT

Я подозреваю, что это что-то особенное в моей библиотеке типов. Я нашел решение, которое я разместил в качестве ответа ниже.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2009

Я нашел решение, используя код ниже. По сути, третий параметр LoadTypeLibEx (ITypeLib ** в C / C ++) объявлен как stdole.IUnknown вместо Object.

Для этого мне нужно было добавить ссылку на stdole32.tlb в проект VBA.

Я подозреваю, что в моей библиотеке типов есть что-то, что не может быть объявлено как объект 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
1 голос
/ 30 октября 2009

Я подозреваю, что в вашей библиотеке типов (TLB) есть ошибки, поскольку предоставленный вами код работает, когда я тестировал его на стороннем TLB.

Я предполагаю, что вы собираетесь использовать вашу сборку .NET от VBA. Поэтому я предлагаю вам убедиться, что вы можете ссылаться на свой TLB из VBA без ошибок.

Обратите внимание, что все объекты, предоставляемые вашей библиотекой .NET, должны иметь открытые конструкторы, которые не принимают аргументов. Это может быть причиной проблемы.

...