ATL로 프로젝트를 만드는 이유 중의 하나는 가볍다는 것이다.
그러나 가볍게 만들기 때문에 의존성이 있는 라이브러리를 포함하지 않고 빌드한다.
이로인해 배포 후 다양한 사용자 환경 때문에 환장하는 결과가 찾아오기도 한다.

예전에는 그냥 같은 디렉토리에 포함되기만 해도 되었는데 2005이후 SxS Assembly 때문에 짜증나게 바뀌었다.

이에 대한 예방법이 기본적으로 Static으로 빌드를 하는 것이다. 이것은 atl90.dll 과 manifast 파일을 포함하게 된다. 이로서 최종 빌드된 파일의 용량은 대략 25k 정도 증가한다.

사용자 삽입 이미지




허나 이것으로 해결이 된 것이 아니다.

정적 빌드로 된 것으로 배포 후 사용하려 하면 다양한 의존성 관련 에러메세지를 내뱉어내고 ActiveX DLL인 경우는 죽어도 웹에 바인딩이 되지 않는다. 아주 환장할 노릇!

해결점은 다음과 같다.

0. VS의 셋업 프로젝트를 이용한다. -_-

1. Microsoft Visual C++ 2008 재배포 가능 패키지를 포함한다. -_-

2. .Net Framework를 설치한다. -_-

3. Private Assembly를 설치하는 것이다. Install 파일을 만들때 Microsoft.VC90.CRT.manifest, msvcp90.dll, msvcr90.dll를 포함하여 사용할 DLL과 같은 디렉토리에 설치하는 것이다. regsvr32등은 해줄 필요가 없다. 허나 새로운 버전의 DLL이 나왔을 때 패치되지 않는다.

여기 까지는 그나마 행복한 InstallShield를 사용했을 때다.

4. ActiveX를 위해 만든 ATL은 cab 파일을 만들 때 저 파일들을 포함시켜줘야 한다. 그리고 inf 파일에 [Add.Code]에 넣어주고 아래도 같이 적어주면 된다.

[Add.Code]
   msvcr90.dll=msvcr90.dll
   msvcp90.dll=msvcp90.dll
   Microsoft.VC90.CRT.manifest=Microsoft.VC90.CRT.manifest

[Microsoft.VC90.CRT.manifest]
   file-win32-x86=thiscab

[msvcp90.dll]
   file-win32-x86=thiscab

[msvcr90.dll]
   file-win32-x86=thiscab

대충 이렇다.

5. 이 짓들을 모두 무마하는 설정이 있으니... 그것은 바로바로바로바로바로...
런타임 라이브러리를 다중 쓰레드 DLL에서 다중 쓰레드로 변경하는 것이다. -_)
사용자 삽입 이미지