The application was unable to start correctly (0xc

2018-12-31 16:58发布

I have a client/server app which I have been developing on a single PC. Now it needs two serial ports, so I borrowed a PC from a friend.

When I build my app and try to run or debug it (whether in the Delphi IDE or from Windows File manager), it errors "The application was unable to start correctly (0xc000007b)".

Googling doesn't bring up much, but seems to indicate that this is nothing Delphi specific and happens with other apps. It seems to be caused by calling into a 32 bit DLL from a 64 bit app or vice versa.

  • both PCs are Windows 7, 64 bit
  • both have Delphi Xe2 starter edition which can only handle 32 bits
  • The app runs fine on my PC, but not on my friend's
  • Other Delphi apps run just fine on both PCs

Can anyone give me a hint as to how to track this down?

16条回答
零度萤火
2楼-- · 2018-12-31 17:26

You can have this if you are trying to manifest your application that it has a dependancy on the Microsoft.Windows.Common-Controls assembly. You do this when you want to load Version 6 of the common controls library - so that visual styles are applied to common controls.

You probably followed Microsoft's original documentation way back from Windows XP days, and added the following to your application's manifest:

<!-- 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 is no longer the OS, and you're no longer a 32-bit application. In the intervening 17 years Microsoft updated their documentation; now it's time for you to update your manifest:

<!-- 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 has a lovely history of the Common Controls:

查看更多
路过你的时光
3楼-- · 2018-12-31 17:28

In my case the error occurred when I renamed a DLL after building it (using Visual Studio 2015), so that it fits the name expected by an executable, which depended on the DLL. After the renaming the list of exported symbols displayed by Dependency Walker was empty, and the said error message "The application was unable to start correctly" was displayed.

So it could be fixed by changing the output file name in the Visual Studio linker options.

查看更多
美炸的是我
4楼-- · 2018-12-31 17:29

I experienced the same problem developing a client-server app using Microsoft Visual Studio 2012.

If you used Visual Studio to develop the app, you must make sure the new (i.e. the computer that the software was not developed on) has the appropriate Microsoft Visual C++ Redistributable Package. By appropriate, you need the right year and bit version (i.e. x86 for 32 bit and x64 for 64 bit) of the Visual C++ Redistributable Package.

The Visual C++ Redistributable Packages install run-time components that are required to run C++ applications built using Visual Studio.

Here is a link to the Visual C++ Redistributable for Visual Studio 2015 .

You can check what versions are installed by going to Control Panel -> Programs -> Programs and Features.

Here's how I got this error and fixed it:

1) I developed a 32 bit application using Visual Studio 2012 on my computer. Let's call my computer ComputerA.

2) I installed the .exe and the related files on a different computer we'll call ComputerB.

3) On ComputerB, I ran the .exe and got the error message.

4) On ComputerB, I looked at the Programs and Features and didn't see Visual C++ 2012 Redistributable (x64).

5) On ComputerB, I googled for Visual C++ 2012 Redistributable and selected and installed the x64 version.

6) On ComputerB, I ran the .exe on ComputerB and did not receive the error message.

查看更多
萌妹纸的霸气范
5楼-- · 2018-12-31 17:30

That can happen if for some reason a x86 resource is loaded from a x64 machine. To avoid that explicitly, add this preprocessor directive to stdafx.h (of course, in my example the problematic resource is 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
查看更多
登录 后发表回答