DOS output in Memo rein.
-
hi,
ein paar fragen hät ich da zu einer DOS anwendung
wie kann ich:- Mit meinem Programm eine DOS - Anwendung starten, allerdings soll sie nicht sichbar werden. (geht das überhaupt?)
- Wie kann ich den text, den diese DOS application von sich gibt, irekt in ein TMemo reinschaufeln?
- Wie kann ich dieser DOS - Anwendung paramter beim starten übergeben? z.B. pfade etc.Hoffe ihr könnt mir diese drei fragen beantworten. Danke, muser
-
Ich denke da wirst du mit WinAPI arbeiten müssen... (Stichwort Pipes) Ich denke wir schaufeln deinen Beitrag mal da hin (:
Für die WinAPI-er: ein TMemo ist ein mehrzeiliges Textfeld und dürfte vemutlich kein Problem darstellen. Primär geht es vermutlich um das Starten und Pipen des outputs.
-junix
[ Dieser Beitrag wurde am 10.07.2002 um 07:43 Uhr von junix editiert. ]
-
*schieb*
-
Ich tippe mal darauf, dass du kein DOS starten willst, sondern eine Konsole - lies dir zur Unterscheidung mal das hier durch: [URL][/URL].
--- Theorie 1: Du willst in deinem Programm eine neue Konsole haben:
Also mit AllocConsole() bekommst du deine Konsole und dann kannst du sie mit der Funktion HideConsole() - ebenfalls aus der Konsolen-FAQ - verstecken. Es kann aber durchaus sein, dass sie kurz aufblitzt.
Wie du den Text in ein TMemo bekommst weis ich nicht. Ich kann dir nur sagen wie du die Eingabe in einen char* bekommst.
Keine Ahnung, du musst deiner Konsole gar keine Parameter mitgeben.
----------
---Theorie 2: Du willst ein bestehendes Programm öffnen:
Also mit WinExec() kannst du das Programm ausführen.
Keine Ahnung wie du den Text bekommst
.
Bei WinExec() kannst du auch die Parameter angeben.
----------
MfG SideWinder
-
Mit Pipes gehts, hatte mir mal irgendwann ne Funktion dafür gebastelt:
// int cmd(char *cmd, char *output, DWORD maxbuffer); // cmd // Datei, die ausgeführt werden soll, am Besten mit // komplettem Pfad // output // Zeiger zum Speicher für den Text, die von derr // Anwendung ausgegeben wird // maxbuffer // Wieviele Bytes maximal in den Output-Buffer passen int cmd(char *cmd, char *output, DWORD maxbuffer) { HANDLE readHandle; HANDLE writeHandle; HANDLE stdHandle; DWORD bytesRead; DWORD retCode; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); ZeroMemory(&si,sizeof(STARTUPINFO)); sa.bInheritHandle=true; sa.lpSecurityDescriptor=NULL; sa.nLength=sizeof(SECURITY_ATTRIBUTES); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; if (!CreatePipe(&readHandle,&writeHandle,&sa,NULL)) { OutputDebugString("cmd: CreatePipe failed!\n"); return 0; } stdHandle=GetStdHandle(STD_OUTPUT_HANDLE); if (!SetStdHandle(STD_OUTPUT_HANDLE,writeHandle)) { OutputDebugString("cmd: SetStdHandle(writeHandle) failed!\n"); return 0; } if (!CreateProcess(NULL,cmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) { OutputDebugString("cmd: CreateProcess failed!\n"); return 0; } GetExitCodeProcess(pi.hProcess,&retCode); while (retCode==STILL_ACTIVE) { GetExitCodeProcess(pi.hProcess,&retCode); } if (!ReadFile(readHandle,output,maxbuffer,&bytesRead,NULL)) { OutputDebugString("cmd: ReadFile failed!\n"); return 0; } output[bytesRead]='\0'; if (!SetStdHandle(STD_OUTPUT_HANDLE,stdHandle)) { OutputDebugString("cmd: SetStdHandle(stdHandle) failed!\n"); return 0; } if (!CloseHandle(readHandle)) { OutputDebugString("cmd: CloseHandle(readHandle) failed!\n"); } if (!CloseHandle(writeHandle)) { OutputDebugString("cmd: CloseHandle(writeHandle) failed!\n"); } return 1; }
-
@geeky: Habe deine Funktion mal ausprobiert. Irgendwie funktioniert das ganze nur, wenn das Programm eine Konsolenanwendung ist, ist es eine Fensteranwendung bleibt er in der Funktion hängen. Also folgendes funktioniert bei mir nicht (Windows XP):
#include <windows.h> int cmd(char *cmd, char *output, DWORD maxbuffer) { HANDLE readHandle; HANDLE writeHandle; HANDLE stdHandle; DWORD bytesRead; DWORD retCode; SECURITY_ATTRIBUTES sa; PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); ZeroMemory(&si,sizeof(STARTUPINFO)); sa.bInheritHandle=true; sa.lpSecurityDescriptor=NULL; sa.nLength=sizeof(SECURITY_ATTRIBUTES); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; if (!CreatePipe(&readHandle,&writeHandle,&sa,NULL)) { OutputDebugString("cmd: CreatePipe failed!\n"); return 0; } stdHandle=GetStdHandle(STD_OUTPUT_HANDLE); if (!SetStdHandle(STD_OUTPUT_HANDLE,writeHandle)) { OutputDebugString("cmd: SetStdHandle(writeHandle) failed!\n"); return 0; } if (!CreateProcess(NULL,cmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) { OutputDebugString("cmd: CreateProcess failed!\n"); return 0; } GetExitCodeProcess(pi.hProcess,&retCode); while (retCode==STILL_ACTIVE) { GetExitCodeProcess(pi.hProcess,&retCode); } if (!ReadFile(readHandle,output,maxbuffer,&bytesRead,NULL)) { OutputDebugString("cmd: ReadFile failed!\n"); return 0; } output[bytesRead]='\0'; if (!SetStdHandle(STD_OUTPUT_HANDLE,stdHandle)) { OutputDebugString("cmd: SetStdHandle(stdHandle) failed!\n"); return 0; } if (!CloseHandle(readHandle)) { OutputDebugString("cmd: CloseHandle(readHandle) failed!\n"); } if (!CloseHandle(writeHandle)) { OutputDebugString("cmd: CloseHandle(writeHandle) failed!\n"); } return 1; } int WINAPI WinMain(HINSTANCE hInstanceHandle, HINSTANCE hPreviousInstanceHandle, LPSTR lpszCommandLine, INT nShowState) { char PingOutput[2048]; cmd("ping", PingOutput, 2048); MessageBox(NULL, PingOutput, "Ping-Output", MB_OK); return EXIT_SUCCESS; }
-
Bei mir klappt das (Win98), vielleicht muss man bei Win2k/XP noch was bei der SECURITY_ATTRIBUTES-Struktur machen...
...oder ich hab da irgendwo was falsch gemacht.Änder mal SW_HIDE in SW_SHOWNORMAL - vielleicht hat er schon Probleme ping zu finden (steht nix im Debug-Fenster ?)
-
Ok, hab's jetzt mal mit SW_SHOWNORMAL ausprobiert. Man sieht ganz kurz die Ausgabe von ping. Soweit so gut, aber dannach bleibt er bei ReadFile hängen. Es schlägt nicht fehl, aber die Funktion wird nicht verlassen.
Ich kann mir nicht vorstellen, das da irgendwelche Security Attributes gesetzt werden müssen, denn als Konsolenanwendung funktioniert das ganze ja.
Ich habe es übrigens auch mit der POSIX-Funktion popen getestet (_popen unter VC++). Damit funktioniert es auch nicht bei einer Fensteranwendung.
-
Hmm, das Problem mit ReadFile hatte schonmal irgendwer mit der Funktion, wenn ich jetzt noch wüsste ob und wie dass Problem gelöst wurde...
-
Hmm, nach Jahren mal wieder hier reingeguckt und nu frage ich mich, was ReadFile bei Fensteranwendungen auch liefern sollte
-
Ich wollte ja nicht die Ausgaben einer Fensteranwendung auslesen, sondern aus einer Fensteranwendung heraus, ein Konsolenprogramm.
Aber das Problem hatte sich schon erledigt:
Probleme mit Pipes
-
axo