from: http://blog.naver.com/PostView.nhn?blogId=nawoo&logNo=80137677312


에러 메세지 : "Win32 error On14001"

응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오


프로그램 작성 & 테스트 환경


1. 프로그램 작성시 다른 것들(재배포가능패키지,닷넷프레임워크)를 안깔아도 프로그램이 실행 될 수 있도록 정적 라이브러리 MFC 사용


2. DLL 포함을 안시키는 간단한 프로그램 형태로 LIB를 사용


3. 테스트 PC는 재배포가능 패키지와 닷넷 프레임워크가 다 깔려있음


4. Dependency Walker 프로그램으로 DLL 종속성 확인(필요한 DLL과 테스트 컴퓨터에 깔려있는지 비교)



이런 환경에서도 위의 에러가 발생하였다.


출처: http://jihune.com/tc/zemyblue/tag/298


visual studio 2005부터 MFC나 CRT등의 dll 라이브러리를 사용할 때 각각의 버젼을 달리 사용할 수 있도록 winSxS(side-by-side) 기능을 도입해서 배포할 때 주의를 기울이지 않으면 "Win32 error On14001"의 "응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다"라는 에러를 볼 수 있습니다.

이 는 dll이나 exe 파일을 컴파일 할 때 링크로 참조하는 dll 파일들을 버젼과 경로등을 manifest라는 파일로 관리하고 이를 dll, exe 파일에 포함시켜서 찾으려고 하는데 찾지 못하기 때문에 나오는 에러입니다.

제가 이 에러를 본것은 콘솔창에서 실행되는 프로그램을 개발했기 때문에 VC80.CRT라는 디렉토리에 있는 라이브러리를 찾는데. 이를 visual studio 2008이 설치되지 않은 다름 컴에서는 찾지 못하기 때문에 발생을 했었습니다.
컴파일을 할 때 object들이 생성되는 디렉토리에 보면은 <프로그램명>.<확장자(exe또는 dll)>.intermediate(또는 embed).manifest 파일을 보실 수 있습니다. 이를 열어보면 다음과 같습니다.

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>


(위 파일을 Release로 컴파일을 한후에 생성된 manifest 파일입니다.)
여기서 중요한 것은 굵은 글씨체로 표시한 부분인데 이 부분이 참조할 dll 파일들의 경로와 버젼등의 정보를 표시한 것입니다. 이것을 찾아야 하는데 이게 없기 때문에 프로그램이 실행되지 않고 에러가 나오는 것입니다.

여기서 Microsoft.VC90.CRT라는 디렉토리를 찾게 되는데 찾는 디렉토리의 순서가 다음과 같기 때문에 다음의 어떠한 경우라도 속하면 프로그램은 이상없이 실행될 수 있습니다.

  1. WinSxS하위의 Side-by-side가 속한 디렉토리, 그러니까. 위와 같은 경우에는 "C:/Windows/WinSxS/x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_bcb86ed6ac711f91" 를 찾습니다.
  2. 어플이 있는 디렉토리에서 해당 DLL 파일, 위와 같은 경우에는 Microsoft.VC90.CRT로 구성된 msvcm90.dll, msvcp90.dll, msvcr90.dll 이 어플과 같이 있으면 됩니다.
  3. 어플이 있는 디렉토리에서 <assemblyname>.manifest 파일
  4. 어플이 있는 디렉토리에서 <assemblyname>디렉토리 하위에 해당 DLL 파일
  5. 어플이 있는 디렉토리에서 <assemblyname>/<assemblyname>.manifest 파일

그 러므로 위와 같이 해당 파일이 dll 파일이 적절히 있다면 문제없이 실행될 것입니다. 여기서 assemblyname은 위와 같은 경우에는 Microsoft.VC90.CRT가 해당됩니다.

첫번째에 바로 검색될 수 있게 하기위해서는 참조하는 dll들을 자동으로 설치해주는 재배포 파일을 설치하면 됩니다. 재배포파일은 http://www.microsoft.com/downloads/deta ··· 62a191ee 에서 다운로드할 수 있습니다.

그런데 만약 Debug로 컴파일이 되었다면 Microsoft.VC90.DebugCRT가 더 추가되어 있을 것입니다.
제도 이것때문에 삽질을 했는데 분명 Release로 컴파일을 했는데. 컴파일 옵션에 _DEBUG가 들어가 있어서 일부가 Debug로 컴파일 되어서 manifest에서 DebugCRT를 요구했엇는데 VS 2005에서는 재배포 파일에 DebugCRT의 dll이 있는데 VS 2008 용 재배포 파일에는 Debug용은 CRT이든 MFC이든 모두 없으므로 아무리 설치를 했다고 해도 실행이 안되는 건 마찬가지 일 것입니다.

그 러므로 이를 해결하기 위해서는 Microsoft.VC90.DebugCRT를 해당 어플이 있는 디렉토리에 복사하던가 컴파일 시 Debug 정보가 없도록 해야 합니다.

Microsoft.VC90.DebugCRT는 <VS2008설치디렉토리>/VC/redist/Debug_NonRedist/x86/에 있습니다.
그리고 컴파일시에 Debug 정보가 있는지의 여부는 object 파일들이 생기는 중간 디렉토리 하위에 있는 manifest에 DebugXXX의 정보가 없으면 됩니다. 있다면 다시 한번 확인해 보세요.



내 경우도 릴리즈로 컴파일 했음에도 불구하고 manifest 파일에 Microsoft.VC90.DebugCRT이 포함되어 있어서 실행이 안되었다.


_DEBUG가 있어서 그런것도 아니고 프로젝트에서 디버그용 LIB파일을 포함시켰기 때문에 그랬다.


다음부턴 프로젝트에 포함 X


그런데 Dependency Walker 프로그램으로 포함된 DLL을 살펴봤는데 Microsoft.VC90.DebugCRT는 없었는데..


이상하다 Dependency Walker 프로그램도 만능은 아닌듯


앞으로 Dependency Walker 프로그램과 manifest 파일 둘다 살펴봐야겠다

'Programming' 카테고리의 다른 글

Dependency Walker 2.2  (0) 2012.07.25
[펌] DecisionTable  (0) 2012.07.07
[펌] 시스템개발의 각 공정과 UML  (0) 2012.07.07
Posted by 세모아
,