Exe-Datei im Hintergrund ausführen
-
Hallo,
um es vorweg zu nehmen, ich habe (noch) nicht so wahnsinnig viel Ahnung von C++ und kämpfe mich gerade erst ein wenig rein. Für folgendes Problem habe ich bis jetzt noch keine Lösung gefunden (auch nicht in der Forumssuche):
Normalerweise arbeite ich mit einer Software, die eine vereinfachte VBS-Schnittstelle bietet (nicht alle Befehle stehen zur Verfügung). Um die Funktionalität zu erweitern, betseht jedoch die Möglichkeit, z.B. exe-Dateien direkt auszuführen. In meinem Fall müssen Binärdatein aufgespalten und gespeichert werden. Diese Funktion habe ich mit C++ bereits umgesetzt. Allerdings wird nach dem Aufruf der exe auch immer ein (leeres) Konsolenfenster geöffnet, das sich nach der ABarbeitung wieder schließt. Nun meine Frage: Gibt es eine Möglichkeit dieses Fenster zu unterdrücken, so dass das Programm komplett im Hintergrund läuft, z.B. durch eine andere Art der Kompilierung (ich arbeite mit Visual C++) oder einen Befehl im Programmcode?
Wäre für jede Hilfe extrem dankbar, weil mir langsam die Zeit wegläuft.
Gruß, Jan
-
1.) hat nichts mit standard c++ zu tun
2.) suche im winapi forum nach "createprocess" oder "shellexecute"
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp
-
Auf shellexecute und createprocess bin ich auch schon gestoßen, allerdings nützt mir das leider nichts. Der Aufruf der exe erfolgt aus der VBS-Umgebung. Da habe ich nur einen Befehl zum direkten Aufruf von exe-Dateien zur Verfügung, die Möglichkeiten wie ShellExecute und createprocess bietet er allerdigs nicht.
Heißt das jetzt, dass ich mit dem blöden Fenster leben muss?
-
aber unter vb kann man doch winapi funktionen auch nutzen, sie müssen nur entsprechend deklariert werden
zb:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
geht dieses nicht unter vbs
-
geht dieses nicht unter vbs
Wie gesagt, ich hab leider nur eine stark vereinfachte VB-Schnittstelle. Die WIN-API kann ich leider nicht einbeziehen. Was ich brauche, ist eine exe-Datei, die sich (egal wie, auch wenn ich sie direkt im Explorer anklicke) ohne ein ein zusätzliches Fenster ausführen lässt.
-
dann erstell doch ein winapi programm
#include <windows.h> int WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { // hier dein code return 0; }
-
O.K., wenn ich das jetzt richtig verstehe, ist das dann eine Windows-Anwendung, die ohne Fenster läuft, weil ich schließlich gar keins aufmache. Also genau das, was ich suche.
Wie schonmal erwähnt, bin ich leider nicht so der C++-Gott, sorry. Vielleicht könntest du mir jetzt noch kurz erklären, wie ich das mit meinem Programm zusammenbringe. Mein Originalprogramm sieht bis jetzt folgendermaßen aus
#include <fstream> #include <iostream> #include <string> #include <cstdlib> using namespace std; char Channel; int zaehler=0; int index=0; void main(int argc, char *argv[]) { int Start = atoi(argv[3]); int Ende = atoi(argv[4]); char zieldatei[1000]; strcpy(zieldatei, argv[2]); strcat(zieldatei, "Datenkanal.bin"); char fertig[1000]; strcpy(fertig, argv[2]); strcat(fertig, "finished.xxx"); char fehler[1000]; strcpy(fehler, argv[2]); strcat(fehler, "failed.xxx"); // hier kommt jetzt der Rest vom Code, das lass ich mal lieber weg };
Wie bring ich das jetzt mit dem Aufruf der WinMain und den zugehörigen Parametern zusammen
?
Nochmal sorry, dass ich so blöd frage, aber ich hab im Moment nicht die Zeit, mich eingehend mit C++ zu beschäftigen. Ich hoffe, das wird demnächst besser.Vielen Dank auf jeden Fall schonmal soweit für die Hinweise.
-
naja du ersetzt main gegen winmain und die argumente die an winmain übergeben werden musst du halt vorher parsen.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/winmain.asp
http://www.cpp-tutor.de/mfc/mfc/kap2/_intern/winmain.htm
-
naja du ersetzt main gegen winmain und die argumente die an winmain übergeben werden musst du halt vorher parsen
Hab ich ja versucht, nur leider hab ich keine Ahnung, wie ich das vernünftig hinbringe. Gibt's vielleicht irgend einen Beispielcode, an dem ich mich orientieren kann??
-
Falls dir kein Beispiel einfällt, kannst du mir vielleicht sagen, ob ich es bis hierher richtig verstanden habe.
lpCmdLine enthält den String aus dem Programmaufruf, sprich meine Parameterliste. Ich muss die Liste jetzt nur irgendwie zerteilen und meine Parameter rauspicken. Ist das soweit richtig?
-
Nach deinem Beispiel meine ich natürlich die Variable lpszArgument
-
Dr. Doof schrieb:
lpCmdLine enthält den String aus dem Programmaufruf, sprich meine Parameterliste. Ich muss die Liste jetzt nur irgendwie zerteilen und meine Parameter rauspicken. Ist das soweit richtig?
jep
zerteilen
zb: mit http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt_strtok.2c_.wcstok.2c_._mbstok.asp
oder ein std::string
http://cplus.kompf.de/artikel/strings.html
oder oder oder
-
Na Gott sei Dank. Wir kommen der Sache schon näher
.
-
Es gibt doch auch __argv[] und __argc.
Zumindest bei mir
-
Es gibt doch auch __argv[] und __argc
Und wie erklär ich das der WinMain? Bei mir klappt's nur mit dem vollständigen Aufruf, so wie er weiter oben steht.
-
Hmmm, was mache ich falsch?
Die Lösung zum "zerhacken" des Eingabestrings habe ich hier aus dem Forum. Bei mir sieht das dann so aus:
#include <fstream> #include <sstream> #include <iostream> #include <string> #include <cstdlib> #include <windows.h> using namespace std; struct argument{ string Pfad; string Kanalname; string AnzWerte; string Zielpfad; }; int WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpstrArgument, int nSTyle) { stringstream wort; string getrennt; argument Argument; ofstream out("Argumente.txt"); wort << lpstrArgument; while(getline (wort, getrennt, ','));{ out<< getrennt << endl; //Argument.Pfad = getrennt; getline(wort, getrennt, ','); out<< getrennt << endl; //Argument.Kanalname = getrennt; getline(wort, getrennt, ','); out<< getrennt << endl; //Argument.AnzWerte = getrennt; getline(wort, getrennt, ','); //Argument.Zielpfad = getrennt; out<< getrennt << endl; } //und so weiter return 0; }
Für Testzecke lasse ich die Argumente in eine Textdatei schreiben (um zu prüfen, ob auch aklles richtig gelesen wird). Das Argument besteht aus mehreren Begriffen, die durch Komma getrennt sind. Komischwerweise erscheint aber immer nur der letzte Begriff (4 Mal hintereinander). Wieso findet mein Programm die ersten drei nicht? Eigentlich habe ich den Source Code nur aus einem Thread abgeschrieben und da hat es angeblich funktioniert.
Danke nochmal für die Hilfe.
Gruß, Jan
-
du überschreibst 'getrennt' ja auch jedesmal mit dem letzte wert:
... wort(lpstrArgument);
-
Aber hier http://www.c-plusplus.net/forum/viewtopic.php?t=66610&highlight=stringstream wird es doch genauso beschrieben, oder
?
Naja egal, hab's gerade mit strtok() hinbekommen. Sorry, dass du dich umsonst bemühen musstest. Trotzdem danke.
-
Dr. Doof schrieb:
while(getline (wort, getrennt, ','));{ out<< getrennt << endl;
Wahrscheinlich ist das Semikolon ";" vor der geschweiften Klammer "{" ein Syntaxfehler, und muss entfernt werden.
Dadurch wird die while-Schleife naemlich ohne Anweisungsblock ausgefuehrt. Der Block in geschweiften Klammern "{" ... "}" wird erst nach der Schleife ausgefuehrt.
-
Ups, stimmt! Du hast wahrscheinlich recht. Hab ich ganz übersehen.