2010-01-08 3 views
2

우리는 수년 동안 구축, 등록 및 실행해온 성숙한 C++ COM 코드베이스를 보유하고 있습니다. 여기에는 수많은 개발자 머신과 자동 빌드 머신이 포함됩니다.내 dll에있는 형식 라이브러리가 손상되었습니다 (등록시 TYPE_E_CANTLOADLIBRARY가 반환됩니다)?

코드베이스는 여러 dll과 exes를 만듭니다. 이들 중 일부는 COM 서버입니다.

전형적인 설정은 XP64 우리는 32 비트를 가지고 64 비트 빌드 비주얼 스튜디오 2005 년과 2008 년

을 모두 사용합니다.

갑자기 xp64 2005 자동 빌드 시스템이 작동하지 않습니다. 유일한 코드 변경은 C++ 도우미 메서드 내에서 사소한 변경과 일부 버전 번호에 대한 업데이트입니다.

우리가 볼 수없는 오류는 dll의 x64 릴리스 버전을 등록하지 못했기 때문입니다.

손상된 DLL로 인해 오류가 발생한 것 같습니다. dll이 성공적으로 빌드되지만 등록 시도가 TYPE_E_CANTLOADLIBRARY로 실패합니다.

dll에는 형식 라이브러리가 내장되어 있습니다 (rc 파일의 include 포함).

이 항상 전에 일을 아직도 VS 2005 XP64, 우리의 다른 컴퓨터에서 작동하고있다

2008 년 typelibrary의 IDL 소스가 볼 수있는 깨진 DLL의 바이너리를 검사 - 그것은 다른 위치에 있지만 DLL의 손상되지 않은 버전보다.

깨진 dll이 다른 컴퓨터에 등록되지 않습니다. 동일한 컴퓨터가 동일한 dll의 로컬 빌드를 성공적으로 등록합니다.

dll을 열 때 Oleview도 같은 오류로 실패합니다.

도움이 될만한 제안이나 사례가 있습니까?

답변

1

글쎄, 우리는 이것을 시각적 인 스튜디오 버그로 보았다고 생각합니다.

자동 빌드가 실행되는 경로가 최근에 변경되어 컴파일러가 생성하는 모든 파일의 절대 경로 이름이 길어지는 것을 발견했습니다.

우리는 또한 64 비트 릴리스 빌드의 대상 폴더가 우리 구성 중 가장 긴 경로 이름을 가지고 있다는 것을 알고 있습니다.

소스 트리가 체크 아웃 된 최상위 디렉토리의 이름을 변경하여 경로를 단축했으며 문제가 사라진 것처럼 보입니다. 분명히 우리는 몇 번 반복하여 경로가 아닌지 확인합니다 흡충.

저는 Visual Studio가 절대 경로 이름을 바이너리에 삽입 할 때 (여전히 그렇듯이) 버퍼에서 과부하가되어서 바이너리를 손상시킬 수 있다고 생각합니다.

+0

나는 우리가 같은 것을 보았다고 생각하지만 해결책을 찾지 못했습니다. 우리의 빌드는 대부분의 경우 작동했지만, 때때로 정확한 방식으로 실패했습니다. 그것은 경로 길이 문제 였을 수도 있습니다. 감사합니다. –

1

이것은 빌드 서버의 디스크가 잘못 될 때처럼 간단 할 수 있습니다. 게시물에 아무것도 더 복잡한 것을 제안하는 내용은 없습니다. IDL을 DLL에서 다시보기는 꽤 이상하지만 유형 라이브러리는 바이너리입니다.

+0

그는 typelib을 열 것을 요청 받았을 때 OLEView에서 보여주는 텍스트를 참조합니다. typelib을 디코딩하여 소스 IDL과 매우 유사한 양식으로 표시합니다. – sharptooth

+0

죄송합니다. 바이너리 dll 자체에 포함 된 텍스트를 언급했습니다. 이제는 실제로 다시 한 번 봐야합니다. 실제로 winmerge가 좋은 바이너리 diffs를 지원하는 방식으로 레지스트리 키 항목을 idl로 리셋했습니다. – morechilli

관련 문제