Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Ausgabe von Konsolenprogrammen abfangen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.07.2003, 21:30 Uhr
~Lars
Gast


Hi,

wie kann ich die Ausgaben eines W32-Konsolenprogrammes abfangen, sodass nicht mal das Konsolenfenster aufgeht? Und umgekehrt: Wie kann ich dem Teil bei erwarteten Eingaben was rübersenden? Postmessage geht hier nicht imho, aber dass es irgendwie geht, weiß ich

thx

Lars
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.07.2003, 11:34 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
das erzeugen des Consolefenster wirst Du nicht verhindern können, da dieses spätestens beim Eintritt in main erzeugt wird. Man kann höchstens nach dem Erzeugen die Console schließe.

C++:
#include <stdio.h>
#include <windows.h>

HWND GetConsoleHwnd(void);

int main(int argc, char* argv[])
{
    ShowWindow(GetConsoleHwnd(),SW_HIDE);
    for(int i=65; i<=90;i++)
        printf("%c\n",i);
    Sleep(2000);
    ShowWindow(GetConsoleHwnd(),SW_SHOW);
    return 0;

}

HWND GetConsoleHwnd(void)
   {
       // Microsoft Knowledge Base Article - Q124103

       #define MY_BUFSIZE 1024
       HWND hwndFound;        
       char pszNewWindowTitle[MY_BUFSIZE];
                                          
       char pszOldWindowTitle[MY_BUFSIZE];
                                          

       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

      

       wsprintf(pszNewWindowTitle,"%d/%d",
                   GetTickCount(),
                   GetCurrentProcessId());

       SetConsoleTitle(pszNewWindowTitle);

      

       Sleep(40);


       hwndFound=FindWindow(NULL, pszNewWindowTitle);

      
       SetConsoleTitle(pszOldWindowTitle);

       return(hwndFound);
}


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2003, 00:00 Uhr
~Lars
Gast


Hallo Uwe,

danke für die ausführliche Antwort. Ich fürchte, ich habe mich mißverständlich ausgedrückt. Ich möchte von einem anderen Programm aus die Ausgaben eines Konsolen-Programmes haben und in diesem auch Eingaben tätigen können.

cu

Lars
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2003, 12:27 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
ups, dann über Pipes, folgend z.B. das einlesen der Ausgabe von Cmd.exe mit Parameterübergabe zum auflisten des aktuellen Ordner. Schreiben funktioniert ähnlich.

C++:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  SECURITY_ATTRIBUTES sa;
  ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
  sa.nLength=sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle=true;
  sa.lpSecurityDescriptor=NULL;
  HANDLE hRead;
  HANDLE hWrite;
  if(!CreatePipe(&hRead,&hWrite,&sa,0))
        RaiseLastWin32Error();

  STARTUPINFO si;
  ZeroMemory(&si,sizeof(STARTUPINFO));
  si.cb=sizeof(STARTUPINFO);
  si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
  si.wShowWindow=SW_HIDE;
  si.hStdOutput=hWrite;
  si.hStdError=hWrite;

  PROCESS_INFORMATION pi;
  ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
  if(!CreateProcess("C:\\Windows\\System32\\Cmd.exe",
      "/C Dir",NULL,NULL,true,0,NULL,NULL,&si,&pi))
      RaiseLastWin32Error();
  char Data[1024];
  for (;;){
    DWORD BRead;
    DWORD BTotal;
    DWORD BLeft;

    if(!PeekNamedPipe(hRead,Data,sizeof(Data),&BRead,
        &BTotal,&BLeft))RaiseLastWin32Error();
    if(BRead){
      if(!ReadFile(hRead,Data,sizeof(Data)-1,&BRead,NULL))
          RaiseLastWin32Error();
      Data[BRead]='\0';
      Memo1->Lines->Add(AnsiString(Data));

    }
    else{
      if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)break;

    }
  }
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(hRead);
  CloseHandle(hWrite);

}


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2003, 14:30 Uhr
~Lars
Gast


Ah, das sieht gut aus, danke Dir für die Mühe!

Lars
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: