Avatar billede askalot Mester
07. marts 2009 - 19:13 Der er 25 kommentarer og
1 løsning

Hvordan kan læse/parse et cmdpromt-vindue?

Hej Experter

Hvilken vej skal man gå, hvis man gerne vil læse et CMD prompt vindue.

Jeg har et commandline program, som viser hvor langt den er i processen..problemet er at jeg gerne vil vise denne process i et andet interface.
Avatar billede arne_v Ekspert
07. marts 2009 - 20:03 #1
Er det muligt at starte det commandline program fra et andet program ?

Hvis ja  så kan du vil lave det med popen og læse derfra.
Avatar billede komputerdk Mester
07. marts 2009 - 23:06 #2
alternativt - > proces.txt

så lave en read i denne fil..
Avatar billede askalot Mester
09. marts 2009 - 17:34 #3
F.eks et af cmd-line programmerne er FFMPEG.. når man kører en encoding, skriver den i commandline vinduet for langt den er.

Det kan ikke outputtes med et > tegn som jeg plejer at gøre.

Nej vil gerne læse CMD line viduet f.eks via en dll. Burde nok have oprettet spørgmålet i c++ kategori i stedet.
Avatar billede askalot Mester
09. marts 2009 - 17:34 #4
Avatar billede askalot Mester
09. marts 2009 - 18:26 #5
arne_v ..hvad mener du med "popen" ?
Avatar billede arne_v Ekspert
09. marts 2009 - 18:32 #6
Eksempel:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *cmd = "cmd /c dir *.c";
  char buf[1000];
  FILE *ptr;
  if ((ptr = popen(cmd, "r")) != NULL)
  {
      while (fgets(buf, sizeof(buf), ptr) != NULL)
      {
            printf("%s", buf);
      }
      pclose(ptr);
  }
  return 0;
}
Avatar billede askalot Mester
13. december 2009 - 16:54 #7
Jeg er ret sikker på at jeg skal bruge WM_GETTEXT, men jeg er ikke helt sikker på hvad navnet/id er på selve textområdet i CMD prompten
Avatar billede arne_v Ekspert
13. december 2009 - 21:32 #8
Hvis du har mulighed for at starte command line programmet fra dit program, så er popen (eller andet som laver det samme) en fin løsning.

Hvis det ikke er tilfældet kan du allokere console og hente derfra. Lidt mere tricky.
Avatar billede askalot Mester
13. december 2009 - 23:13 #9
Planen var at lave en DLL med funktioner jeg kunne kalde fra mit program.

Nu er jeg nybegynder i c++, men kan du se om jeg er på rette vej med denne kode:

#include "dll.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
#pragma warning(disable:4129)
#define MAX_BUFFER 16384 

//typedef basic_string resStr string
char buf[1000];

char * runApp(char *cmdLine) {
    char *cmd = cmdLine;
    FILE *ptr;
    if ((ptr = popen(cmd, "r")) != NULL){
        while (fgets(buf, sizeof(buf), ptr) != NULL) {
              printf("%s", buf);
              }
        pclose(ptr);
        }
    return 0; 
    }
char* GetFromConsole() {
      return buf;
      }
   
int main(){
    }
Avatar billede arne_v Ekspert
14. december 2009 - 00:29 #10
Hvorvidt du vil have al koden i din EXE eller du vil have en EXE og en antal DLL er et spørgsmål om genbrugs muligheder. Den grundliggende kode til at implementere en given funktionalitet er den samme.

Koden er muligvis OK. Men vil du kalde runApp i en separat tråd ??
Avatar billede askalot Mester
14. december 2009 - 00:38 #11
Hej arne, og tak for svar.

Sagen er at min "hoved" applikation er flash wrappet i en exe.
dvs jeg kan ikke bruge C++ i hoved applikationen direkte..men jeg KAN "loade" .dll filer, og kalde funktioner, der så kan retunere strenge.
Avatar billede askalot Mester
14. december 2009 - 00:40 #12
min dll.h

ser sådan ud:

#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
DLLIMPORT void runApp(char *String);
DLLIMPORT char* GetFromConsole();
#endif /* _DLL_H_ */


ps. jeg er total ny i c++, så har ikke forsøgt at kompilere koden endnu.. óg regner ikke med at det vil fungere lige i første forsøg.
Avatar billede askalot Mester
14. december 2009 - 00:44 #13
hov.. runApp skal ikke returnere char

#include "dll.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
#pragma warning(disable:4129)
#define MAX_BUFFER 16384 

//typedef basic_string resStr string
char buf[1000];

void runApp(char *cmdLine) {
    char *cmd = cmdLine;
    FILE *ptr;
    if ((ptr = popen(cmd, "r")) != NULL){
        while (fgets(buf, sizeof(buf), ptr) != NULL) {
              printf("%s", buf);
              }
        pclose(ptr);
        }
    return 0; 
    }
char* GetFromConsole() {
      return buf;
      }
   
int main(){
    }
Avatar billede arne_v Ekspert
14. december 2009 - 00:54 #14
I den kontekst giver en DLL jo glimrende mening.

Men spoergsmaalet om traad er stadig gyldigt.
Avatar billede askalot Mester
14. december 2009 - 01:07 #15
seperat tråd?, jeg er ikke sikker på om jeg forstår..

Men tænkte at min hovedAPP loader dll'en.

Det var så tanken at jeg kunne kalde funktionen
runApp("ffmpeg -blablallal")
og så lave et interval som checker for output.

(flash kode)
myDLLcomm = new DLL()
myDLLcomm.init("theDLL.dll")
myFlashFunction = function(){
var returnedData = myDLLcomm.call("string" ,"GetFromConsole"); // return type || handler
}
Avatar billede askalot Mester
14. december 2009 - 01:10 #16
Det smarteste ville være, hvis jeg kunne kalde flere processer, og hvergang jeg kører runApp så returnerer den et "processID".. så jeg kan køre/checkke flere processor på een gang..

men .døøøh.. ville øsnke jeg rent faktisk var c++ programmør :D
Avatar billede askalot Mester
14. december 2009 - 01:30 #17
hm.. det lader til at min app fryser imedens popen kører... =/
Avatar billede arne_v Ekspert
14. december 2009 - 02:23 #18
Det er derfor du skal kalde runApp fra en tråd - ihvertfald så længde du bruger popen.
Avatar billede askalot Mester
14. december 2009 - 02:34 #19
Hej Arne, undksyld men, jeg ved vist ikke rigtigt hvad en tråd er.
Avatar billede askalot Mester
14. december 2009 - 02:53 #20
Jeg håber/går udfra at du mener at denne tråd skal køres i dll'en.

Som sagt er min hovedApp ikke lavet i c++ og kan ikke sammenlignes med normale konsol programmer.

Hedligvis har mit program, som nævnt, en mulighed for sende og modtage strenge til/fra dll filer.

Mit program skal bruges til at behandle nogle filer, med en række open source konsol-applikationer, og derfor har jeg brug for at kunne "læse" disse vindue alt imens de kører, så jeg kan tjekke hvor langt i processen de er nået.. (f.eks hvor mange procent har FFMPEG encoded)

Håber det beskriver mit problem bedre..
Avatar billede arne_v Ekspert
14. december 2009 - 02:55 #21
Jeg forstår nogenlunde hvad du vil.

En tråd er noget kode som kører uafhængigt af resten af koden d.v.s. at man kan vente i en tråd og så kører resten af applikationen videre.

http://en.wikipedia.org/wiki/Thread_%28computer_science%29
Avatar billede askalot Mester
14. december 2009 - 04:51 #22
ok, jeg har fundet en alternativ løsning..

jeg kan outputte indholdet til en textfil.. myTasks.bat > log.txt

- og så læse denne fil fra min hovedApp.. wee
Avatar billede askalot Mester
14. december 2009 - 19:19 #23
Arne, du fotjener points efter at have hjulpet mig.. svar! :)
Avatar billede arne_v Ekspert
15. december 2009 - 02:28 #24
ok
Avatar billede askalot Mester
17. december 2009 - 20:55 #25
Hmm, ved nogle programmer skal jeg bruge 2> for at fange output , så vidt jeg forstår er det når der returneres "fejl besked".

Ved du hvordan man outputter begge dele?



med dette får jeg normalt output
minCommand.bat 2> resultat.txt

med dette får jeg fejl output
minCommand.bat 2> resultat.txt

Men jeg vil gerne have begge i samme output, kan man det?
Avatar billede askalot Mester
18. december 2009 - 19:51 #26
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester