2009-10-30 4 views
1

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 

편집

나는 내 형식 라이브러리에 대한 구체적인 무언가 생각한다. 아래에 답변으로 게시 한 솔루션을 발견했습니다.

답변

2

아래 코드를 사용하여 해결책을 찾았습니다. 기본적으로 LoadTypeLibEx (C/C++의 ITypeLib **)에 대한 세 번째 매개 변수는 Object가 아닌 stdole.IUnknown로 선언됩니다.

이렇게하려면 stdole32.tlb에 대한 참조를 VBA 프로젝트에 추가해야했습니다.

VB (late-bound) 개체로 선언 할 수 없다는 것을 의미하는 내 형식 라이브러리에 대한 의구심이 있습니다.

또한 세 번째 매개 변수를 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 
+0

참고로 "stdole32.tlb에 대한 참조를 VBA 프로젝트에 추가해야했습니다."이미 "OLE 자동화"라는 참조가 있어야합니다. – AMissico

+1

RegisterTypeLibrary의 Object versioin을 사용할 때 함수 내에서 중단 점을 사용하여 실행을 중지 할 수 없습니다. VBA 편집기가 충돌하고 Excel이 "복구"됩니다. 코드가 작동했기 때문에 처음으로 코드를 실행했을 때 디버깅을 시도하지 않았습니다. 디버깅을 시도했다면 왜 코드를 실행하는 데 차이가 있었는지 설명 할 수 있습니다. 참고, RegisterTypeLibrary의 stdole.IUnknown 버전을 사용하여 중단 점을 설정하고 실행을 중지하고 그렇지 않으면 정상적으로 디버그 할 수있었습니다. – AMissico

+0

"이미"OLE 자동화 "로 나열된 참조가 있어야합니다 - 내 사무실 stdole2에 대한 참조가있었습니다.tlb "OLE 자동화"로 나열됩니다. 여기에는 IUnknown의 정의가 포함되어 있지 않으므로이를 제거하고 IUnknown을 정의하는 stdole32.tlb로 대체했습니다. – Joe

1

타사 TLB에 대해 테스트했을 때 제공 한 코드가 작동하기 때문에 형식 라이브러리 (TLB)에 오류가있는 것으로 의심됩니다.

VBA에서 .NET 어셈블리를 사용한다고 가정합니다. 따라서 VBA에서 오류없이 TLB를 참조 할 수 있는지 확인하십시오.

.NET 라이브러리에 의해 노출 된 모든 개체에는 인수를 허용하지 않는 공용 생성자가 있어야합니다. 이로 인해 문제가 발생할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 예. 오류없이 VBA IDE에서 TLB를 등록 할 수 있습니다. 내 .NET typelib에 문제가있는 경우 0x80029c4a와 같은 오류가 발생하는 것을 이해할 수 있습니다. 형식 라이브러리를로드하는 동안 오류가 발생하지만 액세스 위반은 아닙니다. – Joe

+0

다른 TLB를 등록하는 것은 어떻습니까? 코드가 작동하면 코드 액세스 보안 정책으로 해결할 수있는 보안 문제가 있다고 생각합니다. (코드를 테스트하기 위해 .NET 어셈블리에서 TLB를 만들 시간이 없으며 그 순간에 DLL 어셈블리를 가질 필요가 없습니다.) – AMissico

+0

개발자가 되었습니까, 아니면 사용자입니까? 나는 개발자로서 만 테스트했다. – AMissico

관련 문제