MFC C++ Projekt, ausgabe auf der Console

Guten Morgen,

ich habe hier ein MFC Projekt in VS2005. Jetzt habe ein Array wo ich nicht genau weiss ob alles so drin steht wie ich das haben moechte.
Ich habe versuch mit mit (AllocConsole()) ein Consolenfenster zu oeffnen und dort dann mit cout oder printf das Array auszugeben. Leider erfolgloss, die Konsole ging auf nur keine Ausgabe.
Ist das ueberhaupt moeglich? Wenn ja wie?
Gibt es in VS2005 eine schoene alternative sich den Inhalt einer Varaiblen anzuschauen. Im Debugging Fenster finde ich das persoenlich nicht so angenehm dort sieht man nicht auf einen Blick ob der Inhalt des Arrays stimmt.

Gruss und
Danke pfefferkeks

Hallo Pfefferkeks,

Ich habe versuch mit mit (AllocConsole()) ein Consolenfenster
zu oeffnen und dort dann mit cout oder printf das Array
auszugeben. Leider erfolgloss, die Konsole ging auf nur keine
Ausgabe. Ist das ueberhaupt moeglich? Wenn ja wie?

Was hast Du denn genau gemacht? Nur AllocConsole
reicht nicht. Hast Du stdio und/oder cout
darauf (neue Konsole) umgeleitet?

Im Prinzip gänge das so:

 ...
 char \* con\_buf = new char[SIZE\_IOBUF];
 
 // file name exe anzeigen
 if( !GetModuleFileName(hInstance, con\_buf, SIZE\_IOBUF) ) 
 strcpy(con\_buf,"???????.???");
 
 AllocConsole();
 SetConsoleTitle(con\_buf);
 
 // standard file handles -\> neue console
 int hCrtOut = \_open\_osfhandle((long) GetStdHandle(STD\_OUTPUT\_HANDLE), \_O\_TEXT);
 int hCrtInp = \_open\_osfhandle((long) GetStdHandle(STD\_INPUT\_HANDLE), \_O\_TEXT);
 int hCrtErr = \_open\_osfhandle((long) GetStdHandle(STD\_ERROR\_HANDLE), \_O\_TEXT);
 FILE \*hfout = \_fdopen( hCrtOut, "w" );
 FILE \*hfinp = \_fdopen( hCrtInp, "r" );
 FILE \*hferr = \_fdopen( hCrtErr, "w" );
 \*stdout = \*hfout;
 \*stdin = \*hfinp;
 \*stderr = \*hferr;
 setvbuf( stdout, con\_buf, \_IOLBF, SIZE\_IOBUF );
 setvbuf( stdin , NULL, \_IONBF, 0 );
 setvbuf( stderr, NULL, \_IONBF, 0 );
 fflush( stdout );
 fflush( stdin );
 fflush( stderr );

 // link c++ rtl cout\> ggf.)
 ofstream con\_out( hCrtInp );
 ostream\* p\_cout = &cout;
 cout = con\_out;
 cout.sync\_with\_stdio();

 // ab hier gehts dann:
 das\_eigentliche\_program\_beginnt();
 fflush(stdout); 

 // fertig, aufraeumen
 cout.sync\_with\_stdio();
 fflush(stdout); // clear buffers
 cout = \*p\_cout;
 fclose(hfout); // close standard channels
 fclose(hfinp);
 fclose(hferr);
 FreeConsole(); // close console
 delete [] con\_buf;
 ...

Versuchs mal.

Grüße

CMБ

Was hast Du denn genau gemacht? Nur AllocConsole
reicht nicht. Hast Du stdio und/oder cout
darauf (neue Konsole) umgeleitet?

Hallo Semjon,

ist das wirklich so aufwendig? Ich dachte, MFC macht alles ganz einfach - in Delphi sage ich:

{$APPTYPE CONSOLE}

begin
write (‚hello,world‘);
end.

Hintergrund: mit der Compilerdirektive Applikation = Console ist alles so voreingestellt, wie man das von einer Konsole gewöhnt ist. Gibt es sowas in MFC nicht?

Gruss Reinhard

Was hast Du denn genau gemacht?

Ich habe es nur mit AllocConsole() und dann cout versucht.

Danke Dir fuer deine Hilfe. Werde es gleich mal so versuchen.

Grusse pfefferkeks

Hi pfefferkeks,

nachdem du mit der MFC schreiben willst, geh’ ich mal davon aus, daß du generell eigentlich ein Windows-Programm schreiben willst.
Ich lege mir meistens für ein neues Programm als erstes eine Listbox und eine Variable dafür an. (Kann man ja später wieder raushauen). Das ist dann quasi mein beim Programmablauf direkt sichtbares Debugfenster, in das ich meine Variablenwerte ausgebe.
Also, im Resourcen-Editor irgendwo eine Listbox (z.B. ListBox1) aufziehen (Größe, Platz und Sichtbarkeit kann ja im Code angepasst werden), eine Variable dort definieren (z.B. m_ListBox1)und eine zweite globale CListBox-Variable (z.B. CListBox* g_List) im Code.
Diese ist dann in InitDialog od. der entsprechenden Startfunktion zu belegen (g_List= this->m_ListBox1), damit sie auch ausserhalb der Klasse erreicht werden kann.
Voila. Dein Debug-Fenster.
Gruß
husky

Hallo Reinhard

ist das wirklich so aufwendig? Ich dachte, MFC macht alles
ganz einfach - in Delphi sage ich:

{$APPTYPE CONSOLE}

begin
write (‚hello,world‘);
end.

Hintergrund: mit der Compilerdirektive Applikation = Console
ist alles so voreingestellt, wie man das von einer Konsole
gewöhnt ist. Gibt es sowas in MFC nicht?

Es gibt natürlich einen „Anwendungstyp“
Console Windows Application in VC bzw. VC/MFC,
aber den hat er ja nicht. Er hat eine
„konsolefreie“ Windowsanwendung und
will normales stdout bzw. cout nutzen.

Also muss er sich eine Konsole, mit allen
Schikanen, bauen.

Der Quelltext wird viel kürzer,
wenn man nur einen Ausgabestrom
(z.b. nur printf --> stdout) benutzt
und umlenkt, und nicht alle,
wie in meinem Beispiel.

Grüße

CMБ

Es gibt natürlich einen „Anwendungstyp“
Console Windows Application in VC bzw. VC/MFC,
aber den hat er ja nicht. Er hat eine
„konsolefreie“ Windowsanwendung und
will normales stdout bzw. cout nutzen.

Also muss er sich eine Konsole, mit allen
Schikanen, bauen.

Hallo Semjon,

da hast du natürlich recht, hab ich übersehen. Btw, das geht in Delphi so auch nicht. Ich mache es daher wie die meisten und verwende ein eigenes Fenster für Debug-Ausgaben, im einfachsten Fall eine MessageBox.

Mit OutputDebugString und DebugWindow habe ich schon mal experimentiert, aber das kommt sich mit dem Debugger der IDE ins Gehege (ich habe hier gerade ein umfangreiches Programm, das einwandfrei läuft, aber im Debugger stürzt es zusammen mit diesem ab). Ein eigenes Debugfenster ist eine unabhängige Lösung, so was habe ich inzwischen standardmässig in meine Anwendungen integriert.

Gruss Reinhard

Servus!

Das ist doch ganz einfach!

Du stellts deine App auf Console um, dann gibt der Linker die Funktion main als Startadresse dem Lader vom Betriebssystem an (Bei einer Win32 App gibt er die WinMain an).

Schreibe folgenden Inhalt in die Datei mfcconsole.cpp (die musst du in deinem Projekt verzeichniss anlegen):

#include „stdafx.h“

#include
#include

extern „C“
{
int PASCAL WinMain(HINSTANCE inst,HINSTANCE dumb,LPSTR param,int show);
};

int main(int ac,char *av[])
{
char buf[256];
int i;
HINSTANCE inst;

inst=(HINSTANCE)GetModuleHandle(NULL);

buf[0]=0;
for(i=1; i