2013-10-03 2 views
0

하나의 ActiveX DLL로 인해 다른 인스턴스를 만들려고 혼란스럽고 일관성없는 결과가 나타납니다.오류 48 코드를 다시 작성한 후 dll을로드하는 중 MSADO 관련

우리는 전체 코드베이스를 재구성 할 때까지 모든 것이 작동했습니다. 몇 년 전부터 사용하지 않았던 모든 것이 작동했습니다. 우리는 이전에 우리가 필요로하는 조각을 만들었습니다.

문제는 여기에 여러 장소에서 발생되지만 것이 대표적인 예입니다

Dim objMid As MiddlePiece.clsMyClass 
Set objMid = CreateObject("MiddlePiece.clsMyClass") 

이 오류 타격 경우 : CreateObject 라인 (48 DLL을로드하는 오류). 나는 코드를 바꾸려고 시도하고 다음과 같은 결과를 얻었다.

Dim objMid As MiddlePiece.clsMyClass 
Set objMid = New MiddlePiece.clsMyClass 

그러면 오류 48이 다시 나타납니다. 또한 오류 하나가 실제로 작동하는지 (48)

Dim objMid As Object 
Set objMid = CreateObject("MiddlePiece.clsMyClass") 

을 제공

Dim objMid As Object 
Set objMid = New MiddlePiece.clsMyClass 

.

누구나 실제 차이점이 무엇인지 설명 할 수 있으며, 왜 처음에는 적어도 하나가 작동 했는가?

나는 초기 바인딩과 후기 바인딩의 차이점을 이해하고 마지막 예제 만 후기 바인딩의 인스턴스라고 생각하지만 필자는 PC와 테스트 시스템을 빌드 할 때 레지스트리에 같은 버전의 MiddlePiece.dll, 그래서 이것이 왜 실패할지에 대해서는 명확하지 않다.

이 문제는 MiddlePiece.dll이 Microsoft ActiveX Data Objects로 작성되었다는 사실에서 비롯된 것으로 보입니다. 우리가 Windows XP에서 Windows 7로 옮긴 이래로 이것과 관련된 수많은 문제가있었습니다. msado26.tlb 라이브러리는 더 이상 우리를 위해 일하지 않으므로 대신 msado60_Backcompat.tlb를 참조하도록 해당 라이브러리에 대한 참조를 변경해야했습니다. 그것은 잠시 동안 작동하는 것처럼 보였지만 이후 msado15.dll의 두 가지 다른 버전에 더 많은 문제가있었습니다. 최신 버전은 VB6 및 C++ 모두에서 코드를 깨는 것입니다.

+0

이전 DLL을 삭제 했습니까? DLL을 삭제 한 다음 컴파일하면 새 GUID가됩니다. DLL이 이미 존재하면 guid는 기존 파일에서 읽습니다. 마지막 예제는 레지스트리에서 GUID를 조회하고 작동합니다. – Rob

+0

ID 유지를 위해 이진 호환성을 사용합니다. 우리는이 문제를 추적했습니다. 자세한 내용을 추가하겠습니다. –

답변

0

msado60_backcompat.tlb에 대한 모든 참조가 msado26.tlb에 대한 참조로 바뀌 었습니다. 약 2 년 전에 Windows 7로 전환했을 때 처음 구현 한 "수정"을 본질적으로 취소했습니다. 이는 기본적으로 Microsoft에서 제기 된 문제로 인한 것입니다. 관심있는 사람들을 위해 문제를 조사 할 수있는 좋은 출발점은 here.입니다. 이로 인해 Windows 7 컴퓨터의 모든 것을 다시 빌드하고 여러 문제를 해결할 수있었습니다.

관련 문제