Google (Subs RegisterTypeLibrary 및 RegisterTypeLibrary2 아래)을 사용하여 찾은 기술의 두 가지 변형을 사용하여 프로그래밍 방식으로 형식 라이브러리를 VBA 코드에서 등록하려고합니다.VBA에서 형식 라이브러리를 등록하는 방법
아래 코드는 LoadTypeLib/LoadTypeLibEx 호출시 액세스 위반으로 인해 충돌합니다. 내가 도대체 뭘 잘못하고있는 겁니까? 관련된 경우 유형 라이브러리는 tlbexp를 사용하여 .NET 어셈블리에서 생성 된 TLB 파일입니다.
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
편집
나는 내 형식 라이브러리에 대한 구체적인 무언가 생각한다. 아래에 답변으로 게시 한 솔루션을 발견했습니다.
참고로 "stdole32.tlb에 대한 참조를 VBA 프로젝트에 추가해야했습니다."이미 "OLE 자동화"라는 참조가 있어야합니다. – AMissico
RegisterTypeLibrary의 Object versioin을 사용할 때 함수 내에서 중단 점을 사용하여 실행을 중지 할 수 없습니다. VBA 편집기가 충돌하고 Excel이 "복구"됩니다. 코드가 작동했기 때문에 처음으로 코드를 실행했을 때 디버깅을 시도하지 않았습니다. 디버깅을 시도했다면 왜 코드를 실행하는 데 차이가 있었는지 설명 할 수 있습니다. 참고, RegisterTypeLibrary의 stdole.IUnknown 버전을 사용하여 중단 점을 설정하고 실행을 중지하고 그렇지 않으면 정상적으로 디버그 할 수있었습니다. – AMissico
"이미"OLE 자동화 "로 나열된 참조가 있어야합니다 - 내 사무실 stdole2에 대한 참조가있었습니다.tlb "OLE 자동화"로 나열됩니다. 여기에는 IUnknown의 정의가 포함되어 있지 않으므로이를 제거하고 IUnknown을 정의하는 stdole32.tlb로 대체했습니다. – Joe