2009-12-20 3 views
1

Nous avons une application en ligne de commande qui pourrait bénéficier d'une interface graphique. Nous voulons ajouter une fonctionnalité de traçage et avons identifié une bibliothèque de traçage utilisant MFC. Au départ, nous avons développé une application séparée, mais nous préférons avoir l'interface graphique dans le même espace de traitement.Quel est un bon moyen d'ajouter MIG gui à une application de ligne de commande Win32 C++?

Je pensais éventuellement à une interface graphique dans une DLL MFC qui pourrait être hébergée dans l'application de production ET dans une application de test.

Les questions sont les suivantes:

  • Quelles sont les étapes nécessaires pour ajouter une interface graphique MFC à une application de ligne de commande win32
  • Est-il possible de faire une interface graphique dans une DLL MFC et comment peut-il être fait ? (De sorte que différentes applications peuvent réutiliser le même GUI)

EDIT

Je dois ajouter que cela est une application non gérée (et doit le rester - il doit être très performant, fait largement appel modèles, stimuler, Allocators personnalisés, sérialisation fil développé en interne, etc.)

RÉSULTATS:

Nick d'de réponse fonctionnait très bien - especially the follow-up link in his comment with the details about a regular MFC DLL.

Notez que nous utiliserons Qt pour la prochaine itération. Modifier notre environnement de construction et s'habituer à un nouveau cadre était trop difficile cette fois-ci.

+0

Je n'ai pas VS 2008 mais la première étape serait de créer un projet "MFC AppWizard (dll)", ou quelque chose de similaire. –

+0

Nick, d'accord, mais quoi? Le diable est dans les détails - comme comment ajouter un support MFC dans l'exe existant? Est-ce nécessaire? – Tim

Répondre

3

Vous pouvez appeler/réutiliser le code GUI dans une DLL. (J'utiliser même les formes Delphi dans mon C++ projets)

Un exemple dll très simple:

// The DLL exports foo() function 
void foo() 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    CDlgFoo dlg; 
    dlg.DoModal(); 
} 

Dans le programme de la console, vous aurez le code comme ceci:

h = ::LoadLibrary("my.dll"); 
::DisableThreadLibraryCalls(h); 
pfoo = (foo_type*)::GetProcAddress(h, (const char*)1); 
if (pfoo) pfoo(); 
+0

Ah, le redouté afx_manage_state - Je me souviens vaguement de 1995 ou plus ... – Tim

+0

Super - y a-t-il autre chose que je dois faire dans l'application non-mfc? Cela va juste fonctionner?J'imagine que je voudrais commencer un nouveau fil pour cette fonction thread/gui? Quel est le nom de la méthode exportée que j'ai besoin d'appeler dans GetProcAddress (en supposant un gui basé sur dlg)? – Tim

+0

dans mon exemple 'GetProcAddress (h," foo ")' devrait également fonctionner. Je ne pense pas que vous ayez besoin d'un thread supplémentaire pour le code gui, mais cela dépend de vos besoins. –

2

D'abord, vous devra abandonner WinMain().

Si vous souhaitez toujours conserver la fonctionnalité des arguments de ligne de commande, traitez les arguments de commande dans InitInstance() de votre classe App.

+0

Qu'entendez-vous par «abandonner» winmain? L'exe est une exe de ligne de comman - aucun gui, aucune boucle d'événement - juste un principal – Tim

+0

que je voulais donner le point d'entrée d'application. C'est-à-dire, main() pour votre application CLI et WinMain() pour l'application GUI. MFC, étant un cadre plutôt qu'une bibliothèque, implémente le point d'entrée WinMain() et vous ne pouvez pas en avoir deux. –

+0

Donc je ne peux pas simplement appeler dans un dll ou quelque chose et commencer un nouveau thread pour l'utiliser comme sa boucle d'événement/thread graphique? – Tim

1

L'approche simple serait d'ajouter un commutateur à votre programme et donné une certaine valeur, il lancera le gui, sinon utiliser les options de ligne de commande. Quelque chose comme "app.exe -mode = gui". Si vous ne voyez pas cette commande arg au lancement du programme, revenez à l'ancien comportement de la ligne de commande. En ce qui concerne la DLL, vous pouvez écrire toutes les fonctionnalités de l'interface utilisateur dans une DLL et l'utiliser depuis votre "application de production" où vous avez une boucle de message en cours d'exécution et un WinMain. Mais quel est le point? Si c'est à des fins de test, pourquoi ne pas simplement séparer la présentation de la logique et tester la logique seule. Comment avez-vous l'intention de tester l'interface utilisateur dans votre application de test? Simuler les clics sur un bouton?

+0

+1 pour les différents modes d'exécution - gui/no gui Je pensais à cela aussi - nous aimerions fonctionner avec gui on ou off sans recompilation Le test est vraiment pour que je n'aie pas besoin de l'application live - le gui est assez minime - un histogramme - l'exe principal recueille beaucoup et beaucoup de données et a des dépendances de ressources importantes.Je veux une application de test léger qui peut nourrir les données de timbre – Tim

+0

pour moi cela ressemble à un exemple parfait où vous avez besoin pour déplacer la logique à une bibliothèque (DLL) et utiliser la bibliothèque dans l'application de test/production –

+0

et tandis que nous sommes sur le sujet de l'interface graphique, une raison pour choisir MFC? Je suggère fortement Qt (vous obtenez cross plate-forme gratuitement , on ne sait jamais ...) J'ai aussi trouvé des widgets de complots ici http://qwt.sourceforge.net/ et je parie qu'il y en a plus. –

Questions connexes