Приложение Visual Studio 2010 Win32 не запускается в Windows XP - PullRequest
1 голос
/ 03 февраля 2012

Мне пришлось написать простое приложение с некоторыми конкретными требованиями:
1. Он должен состоять только из одного exe-файла, без установщика или внешней библиотеки DLL
2. Он должен быть маленьким
3. Он должен работать на любой платформе Windows (Win32) (по крайней мере, в Windows XP), без внесения каких-либо изменений в установку Windows (без зависимостей от распространяемых пакетов .NET, JVM, MFC или Visual Studio)
4. Должен иметь простой (основанный на диалоге) пользовательский интерфейс

Я решил сделать это как простое Win32-приложение на C (C ++) и использовать только стандартный Win32 API, ничего особенного. Я создал проект с Visual Studio 2010 на 64-битной Windows 7 и изменил Runtime Library с многопоточной DLL на просто многопоточную. Я думал, что это создаст самое совместимое с Windows приложение.

Скомпилированное приложение отлично работает на моем Windows 7, но я не могу запустить его на любом ПК с Windows XP. Я пробовал как на Windows XP SP2 и SP3. Странно то, что я не получаю никаких сообщений об ошибках и никаких мошеннических процессов в Диспетчере активности, ничего не происходит, когда я дважды щелкаю exe-файл. И журнал DrWatson не создается.

Я проверил целевой компьютер в настройках проекта, и это MachineX86.

Я много гуглил по этой проблеме, и одним из советов было изменить targetver.h, что я сделал безрезультатно. Вот как сейчас выглядит мой targetver.h:

#include <WinSDKVer.h>
#define _WIN32_WINNT      _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

Я также пробовал обходчик зависимостей, но он показывает только ошибку загруженной с задержкой DLL, называемой DWMAPI.DLL, которая, похоже, является Vista DLL. А также предупреждения для двух других загруженных с задержкой библиотек DLL, MPR.DLL и SHLWAPI.DLL. Но так как они загружаются с задержкой, и я не думаю, что я использую в них что-либо, это не должно иметь значения (поиск в Google показывает, что эти предупреждения следует игнорировать).

Моя цель - собрать exe-файл, который будет работать на XP-машинах, не внося в них никаких изменений.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Я решил проблему.Когда я сказал, что сделал это как обычный Win32 без всяких причуд, это было не совсем так.Я не хотел, чтобы при запуске в современных операционных системах внешний вид до XP ощущался, поэтому я добавил следующие строки в stdafx.h (следуя совету, найденному в сети):

#define ISOLATION_AWARE_ENABLED 1
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

причина, по которой я не упомянул об этом, заключалась в том, что я уже пытался удалить эти строки, но это все еще не работало (и я все еще не могу понять, почему это не сработало, когда я удалил эти строки, я пытался сделать это больше, чемодин раз).

Но после прочтения статей MSDN я обнаружил, что эти строки должны быть перед включением windows.h, поэтому я переместил его и теперь он работает (как в классическом, так и в стиле xp)

Таким образом, проблема, кажется, в том, что я перешел на версию 6 ComCtl32 по ту сторону от включения windows.h, но я все еще не знаю, почему он не работал, когда я удалил эти строки.Может ли Windows каким-то образом кэшировать манифест?

0 голосов
/ 03 февраля 2012

Попробуйте создать программу, которая статически связана с библиотекой времени выполнения C.

В своем решении выполните в своем проекте следующее: Перейдите в Свойства |Конфигурация |C / C ++ |Генерация кода |Библиотека времени выполнения.

Релиз: Изменить / MD на / MT, многопоточный.Отладка: Измените / MDd на / MTd, Debug Multithreaded.

Если вы хотите продолжать использовать динамическое связывание, скопируйте файл времени выполнения MSVC ++ на ваш компьютер XP, как предложено @dbrank ().Однако в своем исходном сообщении вы указали, что вам нужен автономный .exe-файл без дополнительных файлов для копирования.

0 голосов
/ 03 февраля 2012

Может быть, вам нужно это на компьютере с XP: MSVC 2010 runtime

...