응용 프로그램을 올바르게 시작할 수 없습니다 (0xc000007b)


159

단일 PC에서 개발 한 클라이언트 / 서버 앱이 있습니다. 이제 두 개의 직렬 포트가 필요하므로 친구로부터 PC를 빌 렸습니다.

앱을 빌드하고 실행하거나 디버깅하려고하면 (Delphi IDE 또는 Windows 파일 관리자에서) "응용 프로그램을 제대로 시작할 수 없습니다 (0xc000007b)"오류가 발생합니다.

인터넷 검색은 많은 것을 가져 오지 않지만 델파이에만 해당되는 것은 아니며 다른 앱에서 발생한다는 것을 나타냅니다. 64 비트 응용 프로그램에서 32 비트 DLL을 호출하거나 그 반대로 인해 발생하는 것으로 보입니다.

  • 두 PC 모두 Windows 7, 64 비트
  • 둘 다 32 비트 만 처리 할 수있는 Delphi Xe2 스타터 에디션이 있습니다.
  • 내 PC에서는 앱이 제대로 실행되지만 친구의 컴퓨터에서는 실행되지 않습니다.
  • 다른 델파이 앱은 두 PC 모두에서 잘 작동합니다.

아무도 이것을 추적하는 방법에 대한 힌트를 줄 수 있습니까?


6
참고로, com0com 을 사용 하여 단일 PC에 가상 직렬 포트를 설치할 수 있습니다 . 디버깅 및 테스트에 적합합니다. 2 개의 가상 포트를 생성하고 구성에서 서로 연결 한 다음 각 포트에서 앱을 실행하여 서로 통신 할 수 있습니다.
Remy Lebeau

1
Windows 이벤트 로그를 확인 했습니까? 때때로 Windows는 앱이 실패한 DLL에 대한 추가 정보를 제공합니다.
Luis Carrasco

1
내가 생각하는 DLL 누락, 일반적으로 일부 유틸리티 또는 메모리 관리자 일 것입니다.
mj2008

4
@ mj2008 Missing DLL에서 다른 오류가 발생합니다 : 컴퓨터에 XXXX.dll이 없기 때문에 프로그램을 시작할 수 없습니다. 이 문제를 해결하려면 프로그램을 다시 설치하십시오.
David Heffernan

3
@snd이 오류는 STATUS_INVALID_IMAGE_FORMAT입니다. 시스템이 해당 이름의 DLL을 찾을 수 없으면 얻을 수 없습니다. 당신은 얻을 STATUS_INVALID_IMAGE_FORMATDLL을 찾을 수있는 경우에, 그러나 그것은 손상되었거나 잘못된 비트 수 있습니다.
David Heffernan

답변:


133

시작하려면 종속성 워커를 사용하여 응용 프로그램과 종속성 사이에 문제가 있는지 테스트하는 것이 좋습니다.


31
Windows 오류 코드 ( google.de/… )를 기반으로하는 이 오류 코드는 0xC000007B STATUS_INVALID_IMAGE_FORMAT을 의미합니다.
mox

95
32 비트 앱이 64 비트 DLL을로드하려고 시도했다는 좋은 증거입니다.
Remy Lebeau

4
실제로이 오류 코드 PDF 파일은 훌륭한 소스입니다.
mox

4
+1과 aswer. 고마워, 의존성 워커는 하루를 구했다. 64 비트 DLL을 32 비트 버전으로 바꾸었고 지금 작동합니다.
Mawg는 Monica를

6
올바른 버전의 Dependency Walker가 있는지 확인하십시오. x86에 따라 x64 바이너리에 대해 잘못된 결과가 표시됩니다.
Andreas Haferburg

53

로드 시간 종속성을 해결할 수 없습니다. 이를 디버깅하는 가장 쉬운 방법은 Dependency Walker 를 사용하는 것 입니다. 로드 옵션의 진단 출력을 얻으려면 프로파일 옵션을 사용하십시오. 이것은 실패 지점을 식별하고 솔루션으로 안내해야합니다.

이 오류의 가장 일반적인 원인은 64 비트 DLL을 32 비트 프로세스로로드하거나 그 반대로로드하는 것입니다.


2
+1. 또한 32 비트 버전의 종속성 워커를 실행하고로드 된 모든 DLL이 32 비트인지 확인해야합니다. 64 비트 버전 종속성 워커를 실행하려고하면 32 비트 버전이 있더라도 VCRedist와 같은 64 비트 DLL을 행복하게로드합니다.
liorda

12

누락 된 dll입니다. 아마도 COM 포트와 작동하는 dll은 dll 의존성을 해결하지 못했을 것입니다. 종속성 워커 및 Windows 디버거를 사용할 수 있습니다. 예를 들어 모든 mfc 라이브러리를 확인하십시오. 또한 nrCommlib를 사용할 수 있습니다. com 포트와 함께 사용할 수있는 훌륭한 구성 요소입니다.


12

나는 여기에 명시된 모든 것을 시도하고 또 다른 대답을 찾았습니다. 32 비트 DLL로 응용 프로그램을 컴파일해야했습니다. 32 비트와 64 비트로 라이브러리를 구축했지만 PATH64 비트 라이브러리로 설정했습니다. 내 응용 프로그램을 다시 컴파일 한 후 (코드도 많이 변경됨)이 무서운 오류가 발생하여 이틀 동안 어려움을 겪었습니다. 마지막으로, 다른 많은 것들을 시도한 후에 PATH64 비트 DLL 앞에 32 비트 DLL을 갖도록 변경 했습니다 (같은 이름을 가짐). 그리고 효과가있었습니다. 완전성을 위해 여기에 추가하고 있습니다.


9

이전 답변에서 종속성 워커를 사용하는 것이 좋은 방법이라고 언급했습니다. 제 경우 (응용 프로그램이 오류 코드로 계속 실패합니다), 종속성 워커는 관련이없는 몇 가지 dll을 보여주었습니다!

마지막으로 "프로파일"메뉴로 이동하여 프로파일 링을 실행할 수 있으며 응용 프로그램을 실행하고 문제를 일으키는 정확한 dll에서 중지합니다. 32 비트 dll이 경로 때문에 선택되어 수정되었음을 알았습니다.

여기에 이미지 설명을 입력하십시오


5

나는 최근에 (직렬 포트를 사용하는) 응용 프로그램을 개발하는 데 문제가 있었고 테스트 한 모든 컴퓨터에서 작동했지만 몇 사람 이이 오류를 겪고있었습니다.

오류가 발생한 모든 컴퓨터가 Win7 x64를 실행 중이며 절대 업데이트가 없었습니다.

Windows 업데이트를 실행하면 특정 경우에 모든 컴퓨터가 해결되었습니다.


5

Microsoft Visual Studio 2012를 사용하여 클라이언트-서버 앱을 개발할 때도 같은 문제가 발생했습니다.

Visual Studio를 사용하여 앱을 개발 한 경우 새 소프트웨어 (예 : 소프트웨어가 개발되지 않은 컴퓨터)에 적절한 Microsoft Visual C ++ 재배포 가능 패키지가 있는지 확인해야합니다. 적절하게는 Visual C ++ 재배포 가능 패키지의 올바른 연도 및 비트 버전 (32 비트의 경우 x86 및 64 비트의 경우 x64)이 필요합니다.

Visual C ++ 재배포 가능 패키지는 Visual Studio를 사용하여 빌드 된 C ++ 응용 프로그램을 실행하는 데 필요한 런타임 구성 요소를 설치합니다.

다음은 Visual Studio 2015 용 Visual C ++ 재배포 가능 패키지에 대한 링크 입니다.

제어판-> 프로그램-> 프로그램 및 기능으로 이동하여 설치된 버전을 확인할 수 있습니다.

이 오류가 발생하여 수정 한 방법은 다음과 같습니다.

1) 컴퓨터에서 Visual Studio 2012를 사용하여 32 비트 응용 프로그램을 개발했습니다. 내 컴퓨터를 ComputerA라고하겠습니다.

2) .exe 및 관련 파일을 ComputerB라고하는 다른 컴퓨터에 설치했습니다.

3) ComputerB에서 .exe를 실행하고 오류 메시지가 나타납니다.

4) ComputerB에서 프로그램 및 기능을 살펴본 결과 Visual C ++ 2012 재배포 가능 패키지 (x64)가 표시되지 않았습니다.

5) ComputerB에서 Visual C ++ 2012 재배포 가능 패키지를 검색하고 x64 버전을 선택하여 설치했습니다.

6) ComputerB의 ComputerB에서 .exe를 실행했는데 오류 메시지가 나타나지 않습니다.


3

실제로이 오류는 잘못된 이미지 형식을 나타냅니다. 그러나 왜 이런 일이 발생하고 일반적으로 오류 코드가 의미합니까? 실제로 이것은 64 비트 Windows 운영 체제 용으로 만들거나 의도 된 프로그램을 실행하려고하지만 컴퓨터가 32 비트 운영 체제에서 실행중인 경우에 나타날 수 있습니다.

가능한 이유 :

  • Microsoft Visual C ++
  • 다시 시작해야 함
  • DirectX
  • .넷 프레임 워크
  • 다시 설치해야 함
  • 응용 프로그램을 관리자 권한으로 실행해야합니다

출처 : http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/


2

디버거 디버깅이 유용한 경우 일 수 있습니다. 기본적으로 여기지침을 따르면 두 개의 아이디어를 실행할 수 있고 하나는 다른 것으로 디버깅 할 수 있습니다. 하나의 응용 프로그램을 사용하지 않으면 때로는 누락 된 오류를 잡을 수 있습니다. 시도해 볼 가치가 있습니다.


2
이것은 로더에서보고 한 오류 일 가능성이 높으므로 프로세스가 시작되기 전에 발생합니다. 따라서 디버깅은 옵션이 아닙니다. 물론 로더에서 오류가 발생했다는 진단에서 잘못되었을 수 있습니다.
David Heffernan

2

Visual C ++가 설치되지 않은 컴퓨터에서 VC ++ 디버그 실행 파일을 실행하려고 시도하는 동안 오류가 발생했습니다. 릴리스 버전을 빌드하고 사용하여 수정했습니다.


2

필자의 경우 DLL을 빌드 한 후 (Visual Studio 2015 사용) 이름을 바꿀 때 오류가 발생하여 DLL에 따라 실행 파일에 필요한 이름에 맞습니다. Dependency Walker가 표시 한 내 보낸 심볼 목록의 이름을 바꾼 후 "응용 프로그램을 올바르게 시작할 수 없습니다"라는 오류 메시지가 표시되었습니다.

따라서 Visual Studio 링커 옵션에서 출력 파일 이름을 변경하여 수정할 수 있습니다.


2

Microsoft.Windows.Common-Controls 어셈블리 에 종속 된 응용 프로그램을 나타내려고 할 때이 기능을 사용할 수 있습니다 . 공통 컨트롤 라이브러리 버전 6을로드 할 때 시각적 스타일이 공통 컨트롤에 적용되도록하려면이 작업을 수행하십시오.

아마도 Windows XP 시절부터 Microsoft의 원본 설명서를 따라 응용 프로그램의 매니페스트에 다음을 추가했을 것입니다.

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Windows XP는 더 이상 OS가 아니며 더 이상 32 비트 응용 프로그램이 아닙니다. 17 년 동안 Microsoft는 설명서를 업데이트했습니다 . 이제 매니페스트를 업데이트 할 차례입니다.

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Raymond Chen은 Common Controls의 멋진 역사를 가지고 있습니다.


3
"Windows XP는 더 이상 OS가 아닙니다" : D
Victoria

그러나 나는이 질문을 '12 년에 다시 물었습니다. Windows 응용 프로그램에도 매니페스트가 있었습니까?
Mawg는 모니카

1
@Mawg 문제와 관련이있을 수도 있고 그렇지 않을 수도 있습니다. 그러나 Stackoverflow는 지식에 대한 위키와 레딧의 조합입니다. 보고 한 정확한 오류를 아는 것이 좋습니다. 그러나 Windows 앱에는 Windows 2000으로 돌아가는 어셈블리 매니페스트가 있습니다. Windows XP부터는 어셈블리 매니페스트에서 의존성을 선언하지 않는 한 comctl32.dll의 최신 버전을 더 이상 얻지 못합니다.
Ian Boyd

1

내 개인 프로젝트 에서이 문제를 해결했습니다 (건조 덕분에). 저에게는 프로젝트 경로가 너무 길었기 때문입니다. .sln을 더 짧은 경로 (C : / MyProjects)에 저장하고 거기에서 컴파일 한 후 오류없이 실행되었습니다.


1
@jojodmo : 실제로, "프로젝트 경로가 너무 길었기 때문에"버그 찾기에 유효한 기여 인 것 같습니다 ...
Christian Severin


1

방금이 문제에 부딪 쳤습니다. Windows 10 제어판의 "Apps & Features (앱 및 기능)"에서 "C ++"을 검색 한 후 며칠 전에 어떤 종류의 업데이트가 실행되어 VC ++ 재배포 가능 패키지 2012-2017을 설치 한 것으로 나타났습니다. 오류 메시지가 발생한 앱에는 VC ++ 2010 만 필요했습니다. 모두 제거한 다음 2010 x86 / x64 만 다시 설치하면 오류가 사라지고 응용 프로그램이 예상대로 작동했습니다.


1

어떤 이유로 x86 리소스가 x64 시스템에서로드되는 경우 발생할 수 있습니다. 명시 적으로 피하기 위해이 전 처리기 지시문을 stdafx.h에 추가하십시오 (물론 예제에서 문제가되는 리소스는 Windows Common Controls DLL입니다.

#if defined(_WIN64)
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"")
#endif

1
공통 컨트롤은 운영 체제의 일부입니다. 운영 체제는 올바른 버전을로드 할 위치를 알고 있습니다. 이것은 OP의 문제를 해결하기 위해 아무것도하지 않습니다. 심지어 의존성을 설치하지도 않습니다. 공통 컨트롤의 버전 6을 사용하도록 매니페스트 리소스를 응용 프로그램으로 컴파일하기 만하면됩니다. 전 처리기 조건부도 필요하지 않습니다. 간단히 설정 processorArchitecture='*'하면됩니다.
IInspectable

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.