Microsoft Visual C++ Target O/S - c++

I am working on a .NET application that is using C++ libraries. One library is a C++/CLR library that uses another C++ library. The application that uses these libraries is required to operate at least on Windows 7. The system is compiled using Visual Studio 2019, and is using the latest SDK. From what I've read, using the latest SDK is possible if targeting at minimum Windows 7.
When I launch the application on Windows 7, I get the following error:
A procedure imported by 'XXX.Net.dll' could not be loaded.
Running on Windows 10 causes no problems.
XXX.Net.dll is the C++/CLR library which uses the C++ library.
I read that setting the WINVER and _WIN32_WINNT macros would explicitly target the version that is wanted. I've added these definitions based on what Microsoft indicated:
to modify the macros, in a header file (for example, in targetver.h
So, within my C++ library, I added the following macro declaration to targetver.h:
#define WINVER 0x0601
#define _WIN32_WINNT 0x0601
From what I understand, this should allow the library to operate properly on Windows 7. Can someone tell me why this would not work?
Note: we are using Ninject for packing all binaries into the main binary. And this error occurs in the line:
new StandardKernel(new Bindings().

OK -- I had decided to test the library failing directly -- and found that the library was accessing an SDK operation not available on Windows 7 - which was causing the library to fail.

Related

How to use Visual Studio 2019 to target Windows 7?

I would like to use Visual Studio 2019 to enjoy the latest C++ additions, but targeting Windows 7.
I created a Windows C++ application using the VS 2019 wizard (running on Windows 10).
A targetver.h file is created by the wizard, with the following content:
#pragma once
// // Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>
I followed the instructions in the comment lines, and added the following lines intargetver.h (before the #include <SDKDDKVer.h> line):
// Target Windows 7 SP1
#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0601
To test that, in the program's main function I invoked an API (PathCchAppend) that is not supported in Windows 7.
The program builds fine (I statically link the CRT), and runs fine in Windows 10.
The same program fails when executed in Windows 7, showing the following error message:
Now, the program should have not compiled at all, because I specified the Windows 7 target, and the aforementioned API is not available on Windows 7.
Is this a bug in the Windows SDK?
Is it possible to target Windows 7 using VS 2019 and the Windows 10 SDK, getting errors during the build process when an API or structure that is not supported in Windows 7 is used in the code, and how?
VS 2019's toolset and the latest Windows 10 SDK support targeting Windows 7 Service Pack 1.
You have already configured the Windows headers in the Windows 10 SDK properly:
#include <winsdkver.h>
#define _WIN32_WINNT 0x0601
#include <sdkddkver.h>
You can still call APIs that are not supported by Windows 7 in this mode, which is why calling PathCchAppend builds, links, and fails at runtime.
The problem you are seeing may also be related to the Universal C/C++ Runtime not being on your target machine. Install the x86 and/or x64 native version on your target test machine.
See Microsoft Docs.

Targeting the Windows 7 OS with Visual Studio 2017 gives a ucrtbased.dll missing error

I have a client that is running a Windows 7 machine and I want to him build an .exe that he can run on his computer. However, since I am running Windows 10, I am building everything in Visual Studio 2017. The program I am making is a Winforms CLR C++ program. I put in the Windows 7 WINVER define in one of the C++ files:
#define WINVER 0x0601
The compile the project with the following properties:
I send him an .exe file but when he opens it up, it gives him a an error saying that he is missing the ucrtbased.dll. I verified that he has the correct .NET framework installed on his computer:
What could be the cause of this?
Build and send him a release copy. He will still need the appropriate windows libraries.
ucrtbase (Universal C Runtime) is the replacement for the msvc* runtime dlls.
To get the correct runtime, see https://www.microsoft.com/en-us/download/details.aspx?id=48234
and also possibly https://support.microsoft.com/en-us/help/2999226/update-for-universal-c-runtime-in-windows
if you have problems.

Visual C++ application won't run on windows 7

I am using Visual Studio Community 2015 and I wrote some simple Win32 demo application which should download file from internet and execute two HTTP GET requests.
I am using functions like InternetOpenA, InternetConnectA, HttpOpenRequestA, URLDownloadToFile, etc.
Only thing that I have changed in settings is Platform Toolset to Visual Studio 2013 (v120) and my targetver.h file looks like this:
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <WinSDKVer.h>
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#include <SDKDDKVer.h>
However, it runs on my Windows 10 computer, but it does not run on windows 7. It says: Missing MSVCR120.dll file. I can install appropriate C++ Redistributables but that is not solution that I need.
Is there any other options I need to include when I compile so I can avoid this error?
To avoid your application needing a separate runtime DLL, in the project settings, look under:
C/C++ > Code Generation > Runtime Library
and choose multi-threaded, rather than multi-threaded DLL.
You do not need to change the platform toolset.
In my project, that I compile with VS 2017 and want to run all the way down to Vista, I do the same as you, but without the first #include <WinSDKVer.h>. I just set the _WIN32_WINNT macro to 0x0600 and so far it's working fine.
I target the Windows 8.1 SDK, and use MFC, if that helps.
I've used dependency walker in the past to diagnose dll dependencies. Hopefully it's something silly like the 32-bit or 64-bit runtimes being missing.
As keith recommended in his answer, you can also try static linking the vc runtime (/MT[d] under C++/Code generation/Runtime Library) so that it doesn't need to load the runtime as a dll. Note that this is not the recommended option, since the VC runtime cannot be patched by Windows Update if it's burned into your executible.

Compile C++ program to run on windows 7 using VS2010 running on windows8

I use visual studio 2010 running on Windows 8.1
the program is in C++ and uses MFC library
when I compile it in my computer running windows 8, and then I run it on the destination computer running windows 7, the program stops unexpectedly.
how to compile it specifically for windows 7
Without using a newer SDK there is no special switch to set to compile a program for Windows 7.
Read aboutthe SDK versions and settings for the header files in the [MSDN][1]
Even if you use a newer SDK and it is a standard MFC program, than you shouldn't have a problem using it under Windows 7. In 99% of all cases using a newer SDK (with incompatible compiler settings) and run the program on an incompatible (older) OS, the program will not start. In such cases some DLL entry points of new function can't be found.
If you program stops unexectable you should use remote debugging to find the bug. Or use minidumps to do a post mortem analysis. I am sure you have a bug in your program. And that it runs on Windows 8 may be simply luck.
Check if the values of WINVER and/or _WIN32_WINNT in your project have been #defined as 0x0602 or higher -- see this MSDN article for a list of possible values
It might be an issue of the runtime libraries not being present on the Windows 7 machine. This can prevent the program from starting with a non-intuitive error message.
In that case, you can install the Visual C++ 2010 Redistributable Package on the Windows 7 machine and see if that helps. Alternatively you can deploy the application with the runtime library DLL files in the same directory as the .exe.
I have a dll project project in my solution, in which target OS version is not defined.
even have the following warning:
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
this might be the problem. After testing it I will confirm the answer

Explorer thumbnails (winXP)

I have a file format I need to be able to show in explorer thumbnails. Since the target system is windows XP, the Vista PreviewHandler API will not be suitable. Ill be using c++.
How would I do it?
You'll need to register a shell extension for your file type. The extension contains code that extracts/generates the thumbnail by implementing the IExtractImage interface.
See: IExtractImage Interface on MSDN
https://github.com/reliak/moonpdf/tree/master/ext/sumatra/src/previewer is perfect example.
To build both x86 and x64 versions of DLL I use VS 2010 with SP1 along with Win7 x64 SDK (for <thumbcache.h>) installed on Windows 7 x64. Builded DLLs works fine on Win7 and Win10 of either bitness.
Also don't forget /MD linker flag to avoid necessity to install Microsoft Visual C++ 2010 Redistributable Package (x86) on WinXP.
Next lines may be added to "targetver.h" to avoid import and using of new functions from newer versions of Windows system DLLs (say, there is no RegDeleteTreeW in WinXP's advapi.dll):
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#include <winsdkver.h>
#include <SDKDDKVer.h>
Additionally it has implementation of previewer for some file formats, but related interfaces can be completely omitted in your implementation.