2009-04-21 4 views
3

J'ai une application Qt en Visual Studio 2005 qui est liée en utilisant \subsystem:windows de telle sorte que lorsque j'exécute l'exécutable compilé, elle ne crée pas de terminal de ligne de commande , ainsi que.Un exécutable qui démarre en tant qu'application GUI ou application console basée sur une ligne de commande dans Visual Studio 2005

Je voudrais créer un mode de ligne de commande: lorsque je le lance avec l'argument de ligne de commande --nogui, l'interface graphique n'est pas présentée, mais un simple programme de ligne de commande est exécuté. Étant donné que la liaison utilise /subsystem:windows, le mode de ligne de commande n'affiche aucune des sorties std::cout sauf si je lier mon exécutable avec \subsystem:console.

Existe-t-il un moyen de définir la compilation/liaison de sorte que le même exécutable puisse présenter les fenêtres de l'interface graphique ou se comporter comme une application de console basée sur des paramètres de ligne de commande?

PS. J'utilise Qt 4.2.0 et Visual Studio 2005 et le projet est en C++.

Répondre

5

Je pense que la technique préférée pour la situation ici est la méthode ".com" et ".exe". Dans Windows à partir de la ligne de commande, si vous exécutez un programme et ne spécifiez pas d'extension, l'ordre de priorité dans la localisation de l'exécutable sera .com preferred over a .exe file.

Ensuite, vous pouvez utiliser des astuces pour que ".com" soit un proxy pour stdin/stdout/stderr et lancer le même fichier .exe. Cela donne le comportement de permettre au programme de se préformer en mode ligne de commande lorsqu'il est appelé former une console (potentiellement seulement lorsque certains arguments de ligne de commande sont détectés) tout en étant capable de lancer une application GUI sans console.

Il existe divers articles décrivant ceci, comme "Comment faire une application en tant qu'application GUI et Console?" (voir les références dans le lien ci-dessous).

J'ai hébergé un projet appelé dualsubsystem on google code qui met à jour une ancienne solution codeguru de cette technique et fournit le code source et les exemples de travail binaires.

J'espère que c'est utile!

1

Avez-vous essayé d'appeler AttachConsole dans votre programme pour que la sortie soit redirigée vers le terminal appelant?

+0

pourrait vous s'il vous plaît me donner un indice ce que les fichiers d'en-tête et la définition macro que je dois pouvoir utiliser AttachConsole ?J'ai essayé #include #include , mais apparemment cela ne suffit pas pour trouver la fonction AttachConsole –

+0

La documentation dit d'inclure '' et c'est certainement suffisant. Avez-vous oublié l'argument lors de l'appel de la fonction? –

+0

AllocConsole() peut également être approprié: http://msdn.microsoft.com/en-us/library/ms681944.aspx –

3

Vous ne pouvez pas. Voir cet article par Raymond Chen:

How do I write a program that can be run either as a console or a GUI application?

Pour les raisons indiquées dans cet article, vous voyez parfois deux versions du même outil fourni, un suffixé par « w » comme dans java.exe et javaw.exe sur Windows.

Toutefois, vous pouvez implémenter cette solution astucieuse: How to make an application as both GUI and Console application.

+0

Désolé, mais cette information est tout simplement fausse dans ce particulier, et 'AllocConsole 'fonctionnera très bien. Ce qu'il ne fait pas, c'est créer une nouvelle console quand elle n'existe pas - mais cela n'a pas été demandé (car un argument supplémentaire doit être entré ici pour lancer la version de la console quand même). Plusieurs personnes ont également fait ce commentaire à la poste de Raymond. –

+0

Désolé, je voulais dire 'AttachConsole', * pas * 'AllocConsole' (ce dernier fait autre chose). Aussi, j'ai oublié un mot: "cas". –

+0

@Konrad: D'après moi, 'AttachConsole' ne fonctionnerait que si votre processus parent est cmd.exe, c'est-à-dire que démarrer l'application avec --nogui à partir d'un raccourci ne fonctionnerait pas. À mon humble avis il n'y a pas de solution générale à ce problème, seulement quelques solutions de contournement. –

0

Pour utiliser AttachConsole, vous devez inclure la ligne suivante avant d'inclure < windows.h>:

//Require at least Windows XP 
#define _WIN32_WINNT 0x0501