[Alg] Console app output*

Pagina: 1
Acties:

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Is het mogelijk om van een console programma zijn uitvoer op te vangen? Ik heb een programma dat ik graag binnen een eigen geprogrammeerd programma wil uitvoeren en de tekst die het programma uitvoert in bijvoorbeeld een memo op het scherm tonen.

Nu heb ik deze pagina gevonden voor het redirecten (pipen) van de stdout van een console programma (in C++ Builder):
http://www.leunen.com/cbuilder/redirect.html
Maar deze werkt niet voor het programma dat ik wil gebruiken. Het verschil zit hem waarschijnlijk in dat voor de bovenstaande link het programma gebruik moet maken van cout << "tekst" maar dat mijn programma de functies WriteConsole en ReadConsole gebruikt.

Als ik het programma in de command prompt draai en het commando programma.exe >> output.txt gebruik blijft het tekst bestand gewoon leeg.

Nu vroeg ik me af of het mogelijk was om op een andere manier toch de tekst van het programma in mijn eigen geprogrammeerde programma te gebruiken. Alvast bedankt voor jullie tips!

B-Man

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is niet mogelijk als dat programma niet gewoon naar stdout schrijft

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Dat zou erg jammer zijn. Misschien kan je/iemand me uitleggen waarom het wel mogelijk is om stdout te laten zien binnen mijn programma, maar WriteConsole niet?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
stdout is een file descriptor die standaard gemapt wordt naar de virtuele "console file". Een WriteFile hierheen wordt intern in Widnows gemapt naar een WriteConsole. Als je nu de stdout file descriptor naar een gewone file laat wijzen, dan gaat de WriteFile gewoon naar disk.

WriteConsole gaat direct naar het scherm, en dus niet via WriteFile (dan zou je een oneindige loop krijgen). Daarom kun je dat dus niet (triviaal) remappen. De enige mogelijkheid die ik zie is om de linkage naar WriteConsole tijdens het laden te fixen, maar dat is ingewikkeld.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Mmm, bedankt voor je uitleg, die is erg duidelijk.

Dan ben ik bang dat ik het maar anders moet gaan proberen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Omdat WriteConsole direct naar de console buffer, en dus niet via een file handler zoas WriteFile (en indirect ook printf () en std::cout). Omdat ie naar de console buffer schrijft komt het dus altijd in de console terecht, en niet bijvoorbeeld aan de andere kant van de pipe als stdout een pipe betreft

Je moet het eigenlijk zo zien:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// interfaces en implementaties
class StreamWriter
{
public:
    virtual void write (const char * str) = 0;
};

class ConsoleWriter : public StreamWriter
{
public:
    void write (const char * str)
    {
        console.append (str);
    }
};

class PipeWriter : public StreamWriter
{
public:
    void write (const char * str)
    {
        buffer.append (str);
    }
};


// de WriteConsole en WriteFile functies:
void WriteConsole (const char * str)
{
    console.append (str);
}

void WriteFile (FileWriter * writer, const char * str)
{
    writer->write (str);
}


stdout is een StreamWriter. Je kunt die gewoon laten wijzen naar een ConsoleWriter (default) of een PipeWriter (dus als je m piped). Via een call naar WriteFile gaat dat gewoon goed, die gebruikt de interface waar stdout naar wijst

WriteConsole schrijft altijd direct naar de console, ook al wijst stdout naar een PipeWriter. Waarnaar stdout wijst boeit dus helemaal niet, het komt altijd in de console terecht. Gevolg: het is niet te pipen

.edit: te laat :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Jullie beweren hetzelfde, hieruit mag ik dus concluderen dat het inderdaad waar is ;) :P
.oisyn ook bedankt voor je uitleg, ook deze is erg duidelijk.

Ik zoek wel een andere oplossing dan (als die er is)!

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 23:42

johnwoo

3S-GTE

Ik kan ernaast zitten hoor, maar was een Console object niet een door Windows gemanagede resource? Wellicht kun je op de een of andere manier die console benaderen vanuit je 'parent' programma, uiteraard met de juiste security descriptors.

Ik zou zo snel niet weten hoe je zoiets implementeert, maar aangezien een console niet door je eigen proces, maar door Windows beheerd wordt, zou het theoretisch mogelijk moeten zijn om die console ook vanuit andere processen te benaderen, en er dus ook uit te lezen :)

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik zou het niet weten (anders zou ik deze vraag ook niet gesteld hebben ;):P) Misschien dat iemand dit weet?

Is het daarnaast trouwens wel mogelijk om de tekst die in het command-prompt scherm getoond wordt aan de gebruiker te kopieeren? In principe het zeflde als men zelf ook kan, gewoon de tekst selecteren en dan kopieeren, alleen deze keer niet met de "muis", maar met "software" ? Dat zou namelijk een groot deel van mijn probleem oplossen!
Pagina: 1