2009-03-27 6 views
1

Je voudrais compiler un projet C++ avec un seul appel à WinExec afin de lancer un autre exécutable avec des paramètres de ligne de commande. Je n'ai aucune idée des paramètres à spécifier dans mon projet afin de produire un exécutable qui fonctionne sans nécessiter de DLL côte à côte Microsoft, que je ne veux pas avoir à installer sur mon système cible. Des indices?Comment créer une application C++ fonctionnant sous XP SP2 avec Visual Studio 2008 et sans DLL côte à côte?

Le symptôme est une application qui ne parvient pas à démarrer et l'événement suivant s'écrit dans le journal d'application (librement traduit du français):

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

MISE À JOUR: Je sais que l'utilisation WinExec est une mauvaise pratique, mais cela fonctionne comme un charme, et Microsoft ne peut probablement pas l'enlever dans une future version de l'API, n'est-ce pas?

Répondre

2

Jachymko et Josh ont répondu (partiellement) à la solution. Voici la solution complète:

  1. Set Propriétés du projet/Configuration/Linker/Input/Ignorer toutes les bibliothèques par défaut à Oui et ajoutez kernel32.lib à dépendances supplémentaires. Ce seul ne sera pas lié, car le code se réfère automatiquement à __security_check_cookie et _WinMainCRTStartup.

  2. Supprimer /GS basculez pour demander au compilateur de ne pas injecter le code de contrôle de sécurité. Pour cela, définissez Propriétés du projet/Configuration/C/C++/Génération de code/Sécurité de sécurité Cochez à N °.

  3. Set Propriétés du projet/Configuration/C/C++/Génération de code/Runtime Library à multi-thread (/ MT). Le code généré initialement par Visual Studio 2008 contient un point d'entrée nommé _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int). Modifiez-le en le renommant WinMain et convertissez le troisième argument en LPSTR.

  4. Set Propriétés du projet/Configuration/Linker/Avancé/Point d'entrée à WinMain.Avec ces changements à un projet par défaut C++

, le code compile enfin et des liens, et fonctionne sur un Vista ou XP fraîchement installé, qui n'a pas la bibliothèque d'exécution.

7

Si vous spécifiez que vous voulez lier statiquement le temps d'exécution (/ MT ou/MTd), vous devriez être bon. Propriétés du projet-> C/C++ -> Génération de code-> Bibliothèque d'exécution

7

Si vous n'avez besoin que de CreateProcess/ShellExecute (WinExec est déconseillé depuis NT 3.1/Win 95), vous n'avez besoin d'aucune bibliothèque d'exécution. Dans Propriétés du projet/Configuration/Lieur/Entrée Activer Ignorer toutes les bibliothèques par défaut et ajouter kernel32.lib à Dépendances supplémentaires.

Questions connexes