Как создать приложение C ++, которое работает на старой версии XP SP2 с Visual Studio 2008 и без параллельных библиотек DLL? - PullRequest
1 голос
/ 28 марта 2009

Я бы хотел скомпилировать проект C ++ с помощью всего одного вызова WinExec, чтобы запустить другой исполняемый файл с некоторыми параметрами командной строки. Я понятия не имею, какие настройки указать в моем проекте, чтобы получить исполняемый файл, который работает без параллельных библиотек Microsoft, которые я не хочу устанавливать в моей целевой системе. Есть намеки?

Симптом - это приложение, которое не запускается и в журнал приложения записывается следующее событие (свободно переводится с французского):

Error, SideBySide, event #33
Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" cannot be found. 

ОБНОВЛЕНИЕ: я знаю, что использование WinExec - это плохая практика, но это работает как чудо, и Microsoft не может удалить его в любом будущем выпуске API, не так ли?

Ответы [ 3 ]

7 голосов
/ 28 марта 2009

Если все, что вам нужно, это CreateProcess / ShellExecute (WinExec устарела с NT 3.1 / Win 95), вам вообще не нужна никакая библиотека времени выполнения. В Свойства проекта / Конфигурация / Компоновщик / Ввод включить Игнорировать все библиотеки по умолчанию и добавить kernel32.lib в Дополнительные зависимости .

7 голосов
/ 28 марта 2009

Если вы укажете, что хотите статически связать среду выполнения (/ MT или / MTd), у вас все получится. Свойства проекта-> C / C ++ -> Генерация кода-> Библиотека времени выполнения

2 голосов
/ 28 марта 2009

На решение ответили (частично) и Яхимко, и Джош. Вот полное решение:

  1. Установить Свойства проекта / Конфигурация / Компоновщик / Ввод / Игнорировать все библиотеки по умолчанию в Да и добавить kernel32.lib в Дополнительно зависимости . Это само по себе не будет связывать, так как код автоматически ссылается на __security_check_cookie и _WinMainCRTStartup.

  2. Снимите переключатель / GS , чтобы дать указание компилятору не вводить код проверки безопасности. Для этого установите Свойства проекта / Конфигурация / C / C ++ / Генерация кода / Проверка безопасности буфера в Нет .

  3. Установить Свойства проекта / Конфигурация / C / C ++ / Генерация кода / Библиотека времени выполнения - Многопоточный (/MT).

  4. Исходный сгенерированный код Visual Studio 2008 содержит точку входа с именем _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int). Измените его, переименовав WinMain и преобразовав третий аргумент в LPSTR.

  5. Установить Свойства проекта / Конфигурация / Компоновщик / Дополнительно / Точка входа в WinMain.

С этими изменениями в проекте C ++ по умолчанию код, наконец, компилируется и связывается, и запускается на только что установленной Vista или XP, в которой отсутствует библиотека времени выполнения.

...