Invalid Win32 program with C runtime libs 2011 on WinXP - c++

I have compilled program in Visual Studio 2011 on Windows consumer preview with v110 toolkit (c runtime 2011) and it refuse to run on Windows XP even with needed runtime dlls for 2011 libs (from VC/redist/) folder. It says that file is not valid Win32 app. How I can get that app to run on XP?

The VS 11 Beta does not support Windows XP as a target platform (or as a development platform, just to be complete).
There have been some statements from Microsoft personnel that this might change for RTM.
But I wouldn't hold my breath.
If you're adventurous, here's an article that describes in detail how you can create your own library that will smooth over the things that prevent the runtime library from allowing an application to load on WinXP:
How to get Visual C++ 2012 (VC 11 Beta) statically linked CRT and MFC applications to run on Windows XP
Update (15 June 2012):
Microsoft has reconsidered not allowing VC++ 2012 to target Window XP. Unfortunately the decision came too late to allow targeting WinXP to be supported in RTM, so you'll have to wait for a subsequent update:
Targeting Windows XP with C++ in Visual Studio 2012

Applications compiled with Visual Studio 11 do not run on XP. Please vote for this request -- perhaps Microsoft will realize their mistake then.

Use a 32-bit cross-compiler, or rebuild the app on Windows XP for 32-bit.

Unfortunately there are changes to the PE version as well as the CRT for Visual Studio 2011 which means, even with binary modification (yuk) XP is not supported. To quote the answer from Microsoft:
Visual Studio 11 Beta doesn't support Windows XP. As to Visual Studio
11 final release, there's no such information published yet. We will
refer to the official website for supported OS.

Related

Is it possible to target windows 10.0.14393 with C++/WinRT?

I would like to make an app for my Lumia stuck on Win 10.0.14393 (or 1609) using C++/WinRT. I've created a Blank app project with
Target platform version: 10.0.17134.0 and
Target platform min. version: 10.0.14393.
The project fails to compile with the following errors:
error C2039: 'DisconnectUnloadedObject': is not a member of 'winrt::BlankApp2::implementation::MainPageT'
error C2039: 'UnloadObject': is not a member of 'winrt::BlankApp2::implementation::MainPageT'
Is this a bug or intentional behavior? Please note, that setting any newer min. version results in successful build.
The latest version of C++/WinRT can support all versions of Windows 10, including 14393 and older versions as well.
Keep in mind that C++/WinRT is both a library and a language projection. The language projection provides access to Windows APIs targeting a given version of Windows. Each version introduces new APIs. So if you want to target a minimum version of Windows, you need to ensure that you limit yourself to the APIs available on that version of Windows. I would however recommend using the latest compiler and the latest Windows SDK as they include many bug fixes.
I suggest you use Visual Studio 2015 when targeting older C++/WinRT and Windows 10 updates. My impression is that most of those were delivered on top of Visual Studio 2015 with Visual Studio 2015 updates and Windows 10 SDK updates and C++/WinRT updates.
When using Visual Studio 2015 with C++/WinRT, you will need the latest update, Update 3. Check for updates and make sure that your copy of Visual Studio 2015 has the most recent updates. I was just using an install of Visual Studio 2015 Enterprise to recompile something that compiles fine with Visual Studio 2017 and found that I was missing tools and SDKs including for Win 10 SDK 10.0.14393 that were in the Update 3 which I had not yet installed.
You can also go to Programs and Feature from within Control Panel, look for Microsoft Visual Studio 2015 in the list and then do a right mouse click and Change which will allow you to check what is installed and change anything.
Working with C++/WinRT over the last few months I have used both the Visual Studio 2017 Community Edition and the Visual Studio 2015 Enterprise Edition.
I have seen differences when moving a solution from VS 2015 to VS 2017 that required me to review the Properties page of the solution. See also the discussion in synchronizing SDK with Windows 10 update and using WinRT with Standard C++
Working with the latest Windows 10 updates and VS 2017 works best for me because I am able to target the recent Windows 10 updates. However I have found that trying to target older Windows 10 updates with VS 2017 can be problematic.
I'm sorry that I can not be more specific. This whole area of C++/WinRT and Windows 10 updates has much more cowboy than I would like though it now seems to be settling down.
C++/WinRT is a template library that was originally an open source project on GitHub. My impression is that Microsoft has acquired it and it is now a standard product offering. I believe there was a significant rewrite of C++/WinRT at one time as the Visual Studio 2015 and then Visual Studio 2017 moved to implement more of the C++17 and proposed C++20 standards and the Technical Specifications for coroutines.
This seems to be an area still changing to some extent. However most of the changing was going on with VS 2015 and the early VS 2017 along with the SDKs. It seems to be pretty solid now with the latest updates.

How to target Windows XP in Microsoft Visual Studio C++ [duplicate]

This question already has answers here:
MSVCP140.dll missing
(4 answers)
Closed 6 years ago.
I'm using Microsoft Visual Studio 2015 on Windows 8.1. I want to compile a program targeting Windows XP. I've looked it up on Google and other similar questions, but none helped. In the solution settings, target platform toolset is set to the Windows XP one, but there is no option for Windows XP in the target platform version.
I did read https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx (Using the Windows Headers) and added these lines to my program:
#define WINVER _WIN32_WINNT_WINXP
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#define NTDDI_VERSION NTDDI_WINXP
But it still doesn't work. It says that it can't find "MSVCP140.dll". After I got this dll, it begins to complain about can't find "VC140.dll". After that is "ucrtbased.dll", and then finally "api-ms-win-core-string-11-1-0.dll", which I don't even have it in my Windows 8.1 computer. The program can run on Windows 8.1, but not Windows XP.
What can I do to make the program run on Windows XP?
In order to build a Windows XP compatible EXE with VS 2015 (or VS 2012 / VS 2013) you have to use the v140_xp Platform Toolset rather than the default v140 Platform Toolset.
UPDATE: Note that VS 2017 includes support for Windows XP via v141_xp. For VS 2019, this feature is no longer being updated but you can still install the v141_xp toolset to use with the VS 2019 IDE.
See your Project Properties, the General page:
This is because the default Platform Toolset uses the Windows 8.1 SDK (or you can opt into the Windows 10 SDK), and this only supports building applications for Windows Vista or later. When you select the v140_xp Platform Toolset, you are using a version of the Windows 7.1 SDK which was the last version to support targeting Windows XP or Windows Server 2003.
Note that Visual Studio can target Windows XP Service Pack 3 or Windows Server 2003 Service Pack 2. The C/C++ Runtime is not compatible with older versions of Windows.
If you are using DirectX in your app, this has some profound implications because a lot changed between the Windows 7.1 SDK and the Windows 8 SDK. See this post for details.
With VS 2015, you will also need to select the Windows XP support in the Custom Install options or via Programs & Features / Microsoft Visual Studio 2015 / Change... / Modify:
It sounds like the program runs fine on your development machine (Windows 8.1 + MSVS 2015), but doesn't run on an XP machine.
SOLUTION: you must include the MSVC runtime along with your .exe.
Look here: Deploying Native Desktop Applications (Visual C++)
and here: Visual C++ Redistributable for Visual Studio 2015.
Update from Chuck Walbourn -
Note that in the particular case of VS 2015 Update 3 and VS 2017, you
can use the VS 2017 or 2019 REDIST and it will work fine. See:
VC Runtime in MSVC 2017 is binary compatible with
2015
and
Microsoft Docs: C++ binary compatibility between Visual Studio
2015, 2017, and
2019.
And to repeat - your "setup" should include a compatible MSVC runtime (aka "VCRedist").

How to install Visual Studio Build Tools 2010 on Visual Studio 2015 Community?

I have a project created on Visual Studio 2010. When I try to run the project on Visual Studio 2015 Community edition I get the error below,
Severity Code Description Project File Line
Error MSB8020 The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution". graphics C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Platform.targets 55
And when I tried to build it with Visual Studio 2015 Build Tools I encountered about 1500+ errors.
Is there any way to make the project work?
If you can't install VS2010, Windows SDK for Windows 7 contains needed compiler tools (v100), you may actually skip installing the SDK itself and install only the compiler tools, headers and libs. Please note, that the compiler included in Windows SDK is the same that VS2010 has, but VS2010 SP1 has a bit newer compiler. If you need that, you'll also need to install Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1. But be aware, that if you install these, you may have issues later if you decide to install VS2010, there are bugs in installer that requires you to install components in strict order. Also, if your code uses MFC or ATL you must install VS2010, installing Windows SDK will not be enough.
You either install VS 2010 and build your project, or better yet you upgrade your projects. The VS 2015 custom install options will let you install the v120 Platform Toolset, but not the v110 or v100 Platform Toolsets.
One major change in VS 2015 is that the C++ tools (i.e. v140) are not installed by the Typical installation option. See the Visual C++ Team Blog.
Keep in mind that Visual C++ 2010 used the C++0x Draft Standard, and Visual C++ 2015 meets the C++11 Standard with the exception of Expression SFINAE (which is partly there in Update 1), so quite a bit has changed in the intervening years including some breaking changes. Since you are jumping three major releases at once--and about 10 minor updates--, it can be a bit overwhelming especially working through all the new warnings.
Another thing to keep in mind is that Visual C++ 2010 used the Windows 7.1 SDK, while Visual C++ 2012 or later use the Windows 8.x SDK. There's been a lot of change there too particularly for DirectX development. It's particularly important for Windows desktop apps that you set the _WIN32_WINNT preprocessor define for your target platform as the Windows 8.x SDK does not default to the 'oldest supported platform' like earlier Windows SDKs did. See Using the Windows Headers
VS 2010 and the v100 toolset supports targeting Windows XP and Windows Server 2003. The v140 toolset does not support targeting Windows XP / Server 2003. You have to use v140_xp Platform Toolset instead. See this post for some notes as this means you are again using the Windows 7.1 SDK rather than the Windows 8.x SDK with the _xp toolsets.
See Breaking Changes in Visual C++ 2012, Breaking Changes in Visual C++ 2013, and Breaking Changes in Visual C++ 2015.
See also Support For C++11/14/17 Features (Modern C++), and Where is the DirectX SDK?.
If you need to build the code both with VS 2010 and with VS 2015, then you should create two projects/solution files, one for each. You may also want to read this article for some notes on writing code that can build with multiple Visual C++ toolsets, which again is particularly challenging due to the Windows SDK changes.
VS 2015 supports targeting Windows Vista SP2, Windows 7 SP1, Windows 8.0, Windows 8.1, Windows 10, and optionally Windows XP SP3. It does not support targeting Windows Vista RTM, Windows Vista SP1, or Windows 7 RTM.

Visual C++11 executables and Windows XP [duplicate]

I compile my C++ source code with Visual Studio 11 Developer Preview. I statically link to the runtime library.
The resulting executable cannot be executed on Windows XP. When I try to execute it on Windows XP I get the error message "[Executable Path] is not a valid Win32 Application.".
According to Microsoft Visual Studio 11 won't support Windows XP.
How does it work that the resulting executable cannot be executed on Windows XP? Is there anything special within the executable?
They seem to drop support for older systems in every new release of VS (NT4,2000,XP) Even if you don't use the CRT at all, they still force the PE subsystem version to high numbers. You can work around that by changing the numbers back to 5.0 in a post build step. Just changing those numbers should allow the exe to start on XP unless the new CRT is using WinAPI functions that don't exist on XP.
The other alternative if you want to keep using VS11 is to use multi-targeting and older compilers...
Visual Studio 2012 will be able to target Windows XP later in 2012:
Targeting Windows XP with C++ in Visual Studio 2012
"Later this fall, Microsoft will provide an update to Visual Studio 2012 that will enable C++ applications to target Windows XP. This update will make the necessary modifications to the Visual C++ 2012 compiler, runtime, and libraries to enable developers to create applications and DLLs that run on Windows XP and higher versions as well as Windows Server 2003 and higher."
Edit: This has now happened (phew!)
The workaround is to use a different Platform Toolset, which will link a different version of CRT and produce binaries compatible to older operating systems.
See more here: Target Windows XP in Visual Studio 11 Beta using the Visual Studio 2010 compiler and libraries.
With v90 toolset your binary will be able to run even in older systems, such as Windows 2000.
http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-65-69/7444.BlogPic.png
The runtime libraries bundled with VS 2010 and higher enforce your executable to import two new functions from kernel32.dll that are missing on Windows XP: EncodePointer and DecodePointer. Those are needed for yet another idiotic naive attempt to enhance the software "security".
In VS 2010 there is an option to use the runtime libraries of Visual Studio 2008, which solves this problem. I don't know if there's such an option in later versions of VS.

What is special about the executables compiled with Visual Studio 11 which results in that the executables cannot be executed on Windows XP?

I compile my C++ source code with Visual Studio 11 Developer Preview. I statically link to the runtime library.
The resulting executable cannot be executed on Windows XP. When I try to execute it on Windows XP I get the error message "[Executable Path] is not a valid Win32 Application.".
According to Microsoft Visual Studio 11 won't support Windows XP.
How does it work that the resulting executable cannot be executed on Windows XP? Is there anything special within the executable?
They seem to drop support for older systems in every new release of VS (NT4,2000,XP) Even if you don't use the CRT at all, they still force the PE subsystem version to high numbers. You can work around that by changing the numbers back to 5.0 in a post build step. Just changing those numbers should allow the exe to start on XP unless the new CRT is using WinAPI functions that don't exist on XP.
The other alternative if you want to keep using VS11 is to use multi-targeting and older compilers...
Visual Studio 2012 will be able to target Windows XP later in 2012:
Targeting Windows XP with C++ in Visual Studio 2012
"Later this fall, Microsoft will provide an update to Visual Studio 2012 that will enable C++ applications to target Windows XP. This update will make the necessary modifications to the Visual C++ 2012 compiler, runtime, and libraries to enable developers to create applications and DLLs that run on Windows XP and higher versions as well as Windows Server 2003 and higher."
Edit: This has now happened (phew!)
The workaround is to use a different Platform Toolset, which will link a different version of CRT and produce binaries compatible to older operating systems.
See more here: Target Windows XP in Visual Studio 11 Beta using the Visual Studio 2010 compiler and libraries.
With v90 toolset your binary will be able to run even in older systems, such as Windows 2000.
http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-65-69/7444.BlogPic.png
The runtime libraries bundled with VS 2010 and higher enforce your executable to import two new functions from kernel32.dll that are missing on Windows XP: EncodePointer and DecodePointer. Those are needed for yet another idiotic naive attempt to enhance the software "security".
In VS 2010 there is an option to use the runtime libraries of Visual Studio 2008, which solves this problem. I don't know if there's such an option in later versions of VS.