Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:58

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



.exe Datei starten

Discussion on .exe Datei starten within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Guron's Avatar
 
elite*gold: 12
Join Date: Feb 2014
Posts: 875
Received Thanks: 272
.exe Datei starten

Hallo!

Ich lerne seit gestern C++ und wollte beim starten des Programms eine .exe starten lassen. Nur leider funktioniert das nicht so gut. Entweder wird das Verzeichnis mitsamt exe als CMD geöffnet oder die Whitespaces im filename machen mir ein Strich durch die Rechnung. Bei einem CreateProcess bekomme ich meine geschriebene Meldung mit der Errorzahl 2. Kann mir BITTE jemand helfen? Ich sitze seit 2-3 Stunden daran ein pimmeliges Programm zu öffnen.

Snippets kann ich nicht zeigen, weil anscheinend alles falsch war.
Guron is offline  
Old 05/20/2017, 21:42   #2
 
Beni's Avatar
 
elite*gold: 0
The Black Market: 171/0/0
Join Date: Jul 2009
Posts: 3,268
Received Thanks: 785
Schick uns doch trotzdem ein Snippet, damit wir wenigstens eine Idee bekommen. Die Errormeldung nochmal 1:1 hier rein kopiert (zusammen mit dem Code) dürfte einiges helfen.

Hast du schon mal nach dem Error gegoogelt? (Wie man z.B whitespaces in Filenames escaped?)
Beni is offline  
Old 05/20/2017, 21:53   #3

 
elite*gold: 150
Join Date: Apr 2007
Posts: 2,372
Received Thanks: 6,628
Errorcode 2 = ERROR_FILE_NOT_FOUND The system cannot find the file specified.

Heisst es gibt sehr wahrscheinlich fehler beim ersten Parameter.

Versuch mal den kompletten Pfad zur exe zu übergeben zb c:\ordner\hey.exe
wurstbrot123 is offline  
Old 05/20/2017, 22:02   #4
 
Guron's Avatar
 
elite*gold: 12
Join Date: Feb 2014
Posts: 875
Received Thanks: 272
Quote:
Originally Posted by Beni View Post
Schick uns doch trotzdem ein Snippet, damit wir wenigstens eine Idee bekommen. Die Errormeldung nochmal 1:1 hier rein kopiert (zusammen mit dem Code) dürfte einiges helfen.

Hast du schon mal nach dem Error gegoogelt? (Wie man z.B whitespaces in Filenames escaped?)
Wie ich whitespaces escape versteh' ich noch nicht so ganz. Finde das teilweise aber auch etwas komisch mit den \


Hier mein Code:
Code:
	
	// additional information
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	// set the size of the structures
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	// start the program up
	CreateProcess((LPCWSTR) "C:\\Program Files(x86)\\Steam\\steamapps\\common\\Shakes & Fidget\\Shakes and Fidget.exe",   // the path
		NULL,        // Command line
		NULL,           // Process handle not inheritable
		NULL,           // Thread handle not inheritable
		FALSE,          // Set handle inheritance to FALSE
		0,              // No creation flags
		NULL,           // Use parent's environment block
		NULL,           // Use parent's starting directory 
		&si,            // Pointer to STARTUPINFO structure
		&pi             // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
	);
	// Close process and thread handles. 
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
	while (true); 

    return 0;
Quote:
Originally Posted by wurstbrot123 View Post
Errorcode 2 = ERROR_FILE_NOT_FOUND The system cannot find the file specified.

Heisst es gibt sehr wahrscheinlich fehler beim ersten Parameter.

Versuch mal den kompletten Pfad zur exe zu übergeben zb c:\ordner\hey.exe
Hab ich gemacht, nur gibt es Probleme mit der Verlinkung, dem whitespace und dem backslash. Code steht oben. Errormeldung:

Hier wird bei C:\ das Backslash mit einem " ersetzt und ich weiß beim besten Willen nicht wieso.

Edit:
Wenn ich die exe starte passiert einfach gar nichts. Code wurde editiert.
Guron is offline  
Old 05/20/2017, 22:14   #5
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Die Leerzeichen musst du meines Wissens auch nicht escapen. Nur die Backslashes.
Das Escape-Zeichen ist der Backslash. Damit in C:\Program... der Backslash nicht versucht das P zu escapen, musst du den Backslash escapen. Etwa so C:\\Program.... Und das eben für alle Backslashes.
florian0 is offline  
Old 05/21/2017, 17:32   #6
 
Guron's Avatar
 
elite*gold: 12
Join Date: Feb 2014
Posts: 875
Received Thanks: 272
Ein Kollege hat mir geholfen. Tatsächlich musste ich, wie florian0 bereits gesagt hat, die Whitespaces nicht escapen. Bei system musste ich das komischerweise schon und auch hat sich abundzu einfach mal ein " eingeschlichen. Wieso und warum weiß ich immer noch nicht. Statt dem typ LPCWSTR muss ich einfach L angeben. Siehte code:

Code:
// start the program up
	CreateProcess(L"C:\\Program Files (x86)\\Steam\\steamapps\\common\\Shakes & Fidget\\Shakes and Fidget.exe",   // the path
		NULL,        // Command line
		NULL,           // Process handle not inheritable
		NULL,           // Thread handle not inheritable
		FALSE,          // Set handle inheritance to FALSE
		0,              // No creation flags
		NULL,           // Use parent's environment block
		NULL,           // Use parent's starting directory 
		&si,            // Pointer to STARTUPINFO structure
		&pi             // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
	);
Danke trotzdem für eure Hilfe!
Guron is offline  
Old 05/21/2017, 20:08   #7
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Die WinAPI existiert in zwei Ausführungen, eine für ASCII (A) und eine für Wide-Characters (W). Jenachdem für welche WinAPI dein Projekt kompiliert wird, wählt die Windows.h (und alle unter-dateien dieser) die passenden Funktionen für A oder W aus.

Wird ein Projekt für ASCII kompiliert, wird CreateProcess zur CreateProcessA und der erste Parameter ist dann vom Typ LPCSTR (aka. "const char*"). Für Wide-Characters wird CreateProcessW verwendet und hier kommt dann der LPCWSTR (aka. "const wchar_t*") zum Einsatz.
Das macht auch Sinn, denn bei ASCII sind schließlich die Zeichen durch ein einziges Byte beschrieben, während Wide-Characters pro Zeichen zwei Byte verwendet.

Wird dein Projekt für Wide-Characters kompiliert, dann werden nicht automatisch alle Zeichenketten zu Wide-Characters. Denn ASCII-Zeichenketten sind ja ebenso erlaubt, funktionieren nur meist nicht mehr ohne Umwege mit der WinAPI. Daher bleiben alle Zeichenketten ASCII und du als Entwickler musst definieren, welche Zeichenketten nun zu Wide-Characters werden müssen.

Das tust du mit dem vorangestellten L. Naturlich hat das einige Nachteile, schließlich ist dein Projekt jetzt fest auf Wide-Characters (oder ASCII) entwickelt und kann nicht so ohne weiteres anders kompiliert werden. Wie viel Sinn es macht, ein Projekt zwischen ASCII und Wide-Characters wechseln zu lassen, sei mal da hingestellt, aber Microsoft hat dafür einen Ausweg gefunden.

Mit dem Makro "TEXT" entscheidet die WinAPI für dich, ob nun ein L vor deinen String kommt, oder nicht.

Code:
MessageBox(0, TEXT("Titel"), TEXT("Hallo Welt!"), MB_OK);

Zum Escaping
Generell müssen bei Windows Whitespaces immer extra gequotet werden. Unzählbar viele Programme, auch von Microsoft selbst, weisen zum Teil fatale Schwachstellen auf, nur weil an dieser stelle geschlampt wurde.

Das Problem hierbei ist, dass der Interpreter für den Aufruf des Programms so ausgelegt ist, dass nach dem ersten "echten" Whitespace der Pfad zum Programm abgeschlossen ist und danach die Parameter kommen.

Das hier klappt noch.
Code:
C:\test.exe arg1 arg2 arg3
Das hier gibt schon Probleme
Code:
C:\mein test.exe arg1 arg2 arg3
Der Interpreter liest hier "Programm ist C:\mein mit den Parametern test.exe arg1 arg2 arg3"

Gelöst wird das in der Regel so:
Code:
"C:\mein test.exe" arg1 arg2 arg3
(Ob man Whitespaces auch escapen kann, weiß ich nicht. Unter Linux gehts jedenfalls, unter Windows bekomm ichs gar nich hin. Vielleicht gibts da en Trick ...). Jedenfalls ist das die Lösung, die alle verwenden wenn sie Leerzeichen im Pfad haben oder erwarten.


CreateProcess stellt hier ein Ausnahme da, denn: Hier wird der Name zur ausführbaren Datei explizit angegeben, getrennt von den Parametern. Hier liegt es damit an der WinAPI, das "Beste" draus zu machen.
florian0 is offline  
Thanks
2 Users
Old 05/22/2017, 10:40   #8
 
Guron's Avatar
 
elite*gold: 12
Join Date: Feb 2014
Posts: 875
Received Thanks: 272
Quote:
Originally Posted by florian0 View Post
Die WinAPI existiert in zwei Ausführungen, eine für ASCII (A) und eine für Wide-Characters (W). Jenachdem für welche WinAPI dein Projekt kompiliert wird, wählt die Windows.h (und alle unter-dateien dieser) die passenden Funktionen für A oder W aus.

Wird ein Projekt für ASCII kompiliert, wird CreateProcess zur CreateProcessA und der erste Parameter ist dann vom Typ LPCSTR (aka. "const char*"). Für Wide-Characters wird CreateProcessW verwendet und hier kommt dann der LPCWSTR (aka. "const wchar_t*") zum Einsatz.
Das macht auch Sinn, denn bei ASCII sind schließlich die Zeichen durch ein einziges Byte beschrieben, während Wide-Characters pro Zeichen zwei Byte verwendet.

Wird dein Projekt für Wide-Characters kompiliert, dann werden nicht automatisch alle Zeichenketten zu Wide-Characters. Denn ASCII-Zeichenketten sind ja ebenso erlaubt, funktionieren nur meist nicht mehr ohne Umwege mit der WinAPI. Daher bleiben alle Zeichenketten ASCII und du als Entwickler musst definieren, welche Zeichenketten nun zu Wide-Characters werden müssen.

Das tust du mit dem vorangestellten L. Naturlich hat das einige Nachteile, schließlich ist dein Projekt jetzt fest auf Wide-Characters (oder ASCII) entwickelt und kann nicht so ohne weiteres anders kompiliert werden. Wie viel Sinn es macht, ein Projekt zwischen ASCII und Wide-Characters wechseln zu lassen, sei mal da hingestellt, aber Microsoft hat dafür einen Ausweg gefunden.

Mit dem Makro "TEXT" entscheidet die WinAPI für dich, ob nun ein L vor deinen String kommt, oder nicht.

Code:
MessageBox(0, TEXT("Titel"), TEXT("Hallo Welt!"), MB_OK);

Zum Escaping
Generell müssen bei Windows Whitespaces immer extra gequotet werden. Unzählbar viele Programme, auch von Microsoft selbst, weisen zum Teil fatale Schwachstellen auf, nur weil an dieser stelle geschlampt wurde.

Das Problem hierbei ist, dass der Interpreter für den Aufruf des Programms so ausgelegt ist, dass nach dem ersten "echten" Whitespace der Pfad zum Programm abgeschlossen ist und danach die Parameter kommen.

Das hier klappt noch.
Code:
C:\test.exe arg1 arg2 arg3
Das hier gibt schon Probleme
Code:
C:\mein test.exe arg1 arg2 arg3
Der Interpreter liest hier "Programm ist C:\mein mit den Parametern test.exe arg1 arg2 arg3"

Gelöst wird das in der Regel so:
Code:
"C:\mein test.exe" arg1 arg2 arg3
(Ob man Whitespaces auch escapen kann, weiß ich nicht. Unter Linux gehts jedenfalls, unter Windows bekomm ichs gar nich hin. Vielleicht gibts da en Trick ...). Jedenfalls ist das die Lösung, die alle verwenden wenn sie Leerzeichen im Pfad haben oder erwarten.


CreateProcess stellt hier ein Ausnahme da, denn: Hier wird der Name zur ausführbaren Datei explizit angegeben, getrennt von den Parametern. Hier liegt es damit an der WinAPI, das "Beste" draus zu machen.
ich liebe dich
Guron is offline  
Old 05/22/2017, 14:49   #9
Trade Restricted
 
elite*gold: LOCKED
Join Date: Oct 2016
Posts: 321
Received Thanks: 79
btw for compatibility in URL path, try to use more
PHP Code:
path = @"C:\.." 
instead of using c:\\
Underfisk is offline  
Old 05/22/2017, 15:01   #10


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,104
Received Thanks: 681
Quote:
Originally Posted by Underfisk View Post
btw for compatibility in URL path, try to use more
PHP Code:
path = @"C:\.." 
instead of using c:\\
That is not C or C++ standard, but works for C#. It may also work for C++ / CLI, I don't know, but when compiling regular C++ or C, that won't work.
With best regards
Jeoni
Jeoni is offline  
Old 05/23/2017, 09:05   #11
Trade Restricted
 
elite*gold: LOCKED
Join Date: Oct 2016
Posts: 321
Received Thanks: 79
@ there's problably an equivalent so and its quite best practise instead of his absolute path
Underfisk is offline  
Old 05/23/2017, 10:51   #12
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,465
Are verbatim strings really supported by MSVC? I cant remember ever using them ...
(Maybe if using their raped C++ extension called Visual C++ ...)

, this would be your way to go.
florian0 is offline  
Reply


Similar Threads Similar Threads
[EXE]EXE PROGRAMMER[EXE] READ INSIDE
08/10/2013 - Facebook - 0 Replies
Guys can you put virustotal to your thread with exe file to avoid saying "IT'S A VIRUS" just post virustotal UNDERSTAND!?
Debian 6 Root Datei.exe mit oberfläche starten?
07/14/2013 - Unix/Linux - 1 Replies
hab schon alles im internet abgesucht nichts gefunden
i want do "sura.exe mac.dll serverip.cfg and metin2client.exe" one exe of combine?
05/24/2012 - Metin2 Private Server - 0 Replies
i have dyndns server so local server i want do "sura.exe mac.dll serverip.cfg and metin2client.exe" one exe of combine How do I do this.Really this a lot important for me waiting for your help please help
[Longjut2] Problem mit Exe! [China EXe+DE eXE]
09/22/2009 - Metin2 Private Server - 20 Replies
Hi leute, spiele Longjuyt2 ! hab ein problem spiele mit einer DE exe... ich kann aber nicht durch portale gehen weil sich metin dann aufhängt! noch dazu hab ich eine Frage bezüglich steine+6 ! die kann man ja nur mit der china exe einfügen oder? woher bekomm ich die china exe? und woher bekomm ich ne neue DE exe!!
AccServer.exe, MsgServer.exe, NPCServer.exe
07/17/2009 - EO PServer Hosting - 7 Replies
Im now trying to connect to my server, but when I try to run AccServer.exe, MsgServer.exe, and NPCServer.exe theres an error. When I run AccServer.exe, it says server start.... kernel init ok. Then its will close. Then when I try to run MsgServer.exe an error message will pop up with Êý¾Ý¿âÁ¬½Óʧ°Ü! then I click ok, then it the following messages appear



All times are GMT +2. The time now is 16:58.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.