ConsoleOutputBuffer handle holen ?!?!
-
hallöchen,
ich hab da mal nen problem:) und zwar: habe ich eine API anwendung die
mit ShellExecute ne konsole öffnet. nun will ich mir ne funktion bauen, die sich das consoleoutputbuffer handle holt und anschliessend einen text string dahin sendet, der dann in der konsole erscheint.(diese funktion wird in der API-anwendung benutzt).
Ist das irgendwie umsetzbar, wenn ja wie?Gruß Tobi.
-
http://www.codeproject.com/useritems/ConsoleAdapter.asp
MfG SideWinder
-
hmm und wo genau ist die stelle die mir da weiter hilft? ich find die net wo er sich des handle holt.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hallo ?
-
Steht doch alles im Artikel, zuerst das externe Konsolenprogramm an den eigenen Prozess anschließen:
CodeProject schrieb:
We can use the standard Windows APIs such as AttachConsole() or AllocConsole() for attaching a console to our application. The difference between these two alternatives is that, the first needs a separate console application to which we can attach the current process. The AttachConsole() API has process identifier as its parameter. So we need the PID of the console application to which we needs to attach.
Danach hast du eine Konsole und kannst weiterlesen wie du cout/printf daran anbindest.
MfG SideWinder
-
aber ich dachte allocconsole(9 erstellt gleiuch ne neue console, ich will aber eine externe... also brauch ich doch attachconsole oder? aber er arbeitet da mit alloc... hmmm
-
Ja du brauchst AttachConsole(), richtig
Und nach etwas googeln finden sich da auch Beispiele du Faulsack :p
MfG SideWinder
-
oki werd mal mein glück probieren.:)
-
hi, ich habe das jetzt mal ausprobiert in zwei varianten.
zu erst einaml habe ich hier eine anwendung die das handle einer datei besorgen soll und anschliessend einen text posten soll.#include <windows.h> #include <iostream> using namespace std; int main( int argc, char* argv[] ) { //////////////////////////////////////////////////////////////////////////////// // Initialisation HANDLE hPipe = 0; DWORD cWritten = 0; char msg[] = "Test file here!"; char path[] = "Dump.exe"; //////////////////////////////////////////////////////////////////////////////// try { hPipe = CreateFile( path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); if( hPipe == INVALID_HANDLE_VALUE ) { throw 0; } } catch( ... ) { cerr << " Shutdown error, process will terminate ..."; getchar(); CloseHandle( hPipe ); return 0; } cout << " File was successful open ..." << endl; cout << " Try to write ..." << endl; try { if( WriteFile( hPipe, msg, strlen( msg ), &cWritten, 0 ) ) { cout << " Writeoperation was successful ..." << endl; } else { throw 0; } } catch( ... ) { cerr << " Shutdown error, process will terminate ..."; getchar(); CloseHandle( hPipe ); return 0; } getchar(); CloseHandle( hPipe ); return 0; }
als erstes hab ich es mit einem normalen text file( .txt) ausprobiert. das resultat war:
- alles lief beim ausfuehren glatt, der text wurde gepostet
- aber, erst nach schliessen des text files ist der post im file erschienen,
- ich wollte aber das der text zur laufzeit im file erscheintdanach habe ich die ganze routine noch mal mit einer console versucht also eigentlich peer-to-peer oder ?
ich habe also die dump-console die sich im gleichen ordner wie mein tracker befindet geöffnet und anschliessend mein tracker... aber nichts passiert es erscheint lediglich im tracker die nachricht das ich des was net geklappt hat.kann mir mal einer sagen wo hier die probleme liegen?
Gruß Tobi.
-
Du hast dir hier blödsinn zusammengebastelt *g* Du schreibst direkt in die andere Executable. Also meiner Meinung sollte deine API-Anwendung (die eigentlich gar keine ist, sondern auch eine Konsolenanwedung - zumindest hättest du ja sonst kein _tmain...) mit AllocConsole die Debug-Konsole aufmachen.
Aber wenn es denn schon unbedingt ein anderes Programm sein soll, dann starte dieses doch statt mit ShellExecute über CreateProcess. Dann kannst du die Methode aus dem dortigen Artikel ConsoleAdapter::SpawnDumpConsole verwenden. Also direkt:
// In der "API-Anwendung" (die keine ist ^^): ConsoleAdapter::SpawnDumpConsole( "C:\\Das\\andere\\Konsolen\\Programm.exe", OUTPUT_CONS ); cout << "und so schnell würde es gehen" << endl;
MfG SideWinder