Ich bin totaler Anfänger in Sachen C++. Jetzt wollte ich mir ein kleines Programm basteln bei dem ich zwischen mehreren Spielen (mit Hilfe von TRadioButtons) wählen kann. Dann habe ich noch einen OK-Button eingebaut, der (nach Klick) das ausgewählte Spiel startet und sich das Mini-Programm selbst beendet. Jetzt würde ich gerne von euch den zugehörigen Source Code wissen. Hoffentlich kann mir jemand helfen. Es wäre nett wenn Ihr mir auch eine Website gebt wo ich was über Windows-Programmierung lernen kann.
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Probiers mal mit:
WinExec ("C:\\PROGRAMM\\xxx.EXE", SW_SHOW);
pass aber auf, daß Du ZWEI Backslash's benutzt als Pfadtrenner.
Das braucht man so in C. Die Konstante SW_SHOW bedeutet einfach im normalen Fenster starten (siehe Onlinehilfe) Da gibts auch noch SW_SHOWMAXIMIZED oder SW_HIDE
Frag einfach nochmal wenns nicht klappt.
Danke erstmal für die Antwort aber da gibt es leider ein Problem:
Bei den meisten Spielen die ich auf diesem Weg starten will stürzen mit einer Fehlermeldung ab.
Bei Age of Empires2 z.B: "Das Grafiksystem konnte nicht initialisiert werden. Stellen sie sicher dass
Grafikkarte und Treibersoftware mit DirectDraw kompatibel sind."
oder bei Anno1602: "dieser Vorgang wird aufgrund eines ungültigen Fehlers abgebrochen"
Das Spiel MicroMachinesV3 funktioniert aber problemlos.
Wäre nett wenn Du (oder jemand anders) nochmal antwortet.
ok,
dann brauchst Du wahrscheinlich die krasse Methode.
Nimm die Funktion CreateProcess (siehe online Hilfe).
Ich denke (kann mich auch irren) es liegt daran, daß die Spiele nicht im richtigen Verzeichnis sind, wenn sie gestartet werden. Also wie wenn Du im DOS Modus c:/blabbla/valasd/asdwe/xx.exe machst ist es auch was anderes als wenn Du vorher mit cd blabbla/sdfsf/sdf/asdf in das Verzeichnis wechselst und dann xx.exe aufrufst.
So, hier ein Beispielcode:
bool b;
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
b = CreateProcess (NULL,
"C:\\Programme\\Microsoft Office\\Office\\Excel.exe",
NULL,
NULL,
true,
0,
0,
"C:\\sadfas\\asdfasdf\\asdf", &si,
&pi);
if (!b)
{
delete &si;
delete π
PostQuitMessage(0);
exit(0);
}
Damit funzt zumindest bei mir das Starten von Applikationen.
Rühr Dich wieder falls nichts geht.
count
Also irgendetwas funzt da immer noch nicht. Das Win-Formular wird einfach geschlossen und das Spiel startet diesmal garnicht. Eins versteh ich nicht so ganz: Du hast einmal den Pfad von MS Office angegeben und weiter unten c:sadf... da muss doch sicherlich der gleiche Pfad hin, oder???Hier ist der veränderte SourceCode:
bool b;
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
b = CreateProcess (NULL,
"C:\Spiele\Rollcage\Direct3D\Rollcage.exe", NULL, die Backslashs (oder auch nicht)
NULL,
true,
0,
0,
"C:\Spiele\Rollcage\Direct3D\Rollcage.exe",
&si,
&pi);
if (!b)
{
delete &si;
delete ... PostQuitMessage(0); irgendwie falsch sein muss(ich schätze mal
exit(0); delete &pi ???)
}
Achso noch ne Frage: anstelle des Pfades kann ich auch eine String-Variable einfügen mit dem richtigen Pfad?
Frage 1:
Klar müssen die Pfade gleich sein, ich war einfach nur zu faul das gleiche reinzuschreiben.
Frage 2:
GMX verschluckt die Backslashzeichen. Außerdem brauchst Du in C immer zwei davon, sonst denkt das System es ist eine Formatangabe
Frage 3:
Klar, ne Variable kannst Du immer benutzen. Wenn Du mit dem CBuilder arbeitest String. Kann aber sein das ein char* erwartet wird. Dann gibts nen einfachen Trick:
String s;
function blabla (s.c_str());
Das .c_str() macht aus Deinem String einen Ansi kompatiblen char*
Du kannst mir aber auch mal Deinen Code schicken unter
mailto:count.negative@gmx.de
Wie lange proggelst Du denn schon mit dem C++ Builder?
ich habe das mit mit einer char*-Variablen gemacht.
zu Deiner Frage: ehrlich gesagt erst ca. 2Wochen->deshalb hab ich auch sogut wie keine Ahnung. Wenn es jetzt immer noch nicht funzt melde ich mich nochmal. Eine Frage hast Du mir nicht beantwortet:
In deinem Code stehen die Zeilen
delete &si;
delete (kleines Viereck);
Was muss bei dem kleinen Viereck hin?
Sorry,
das ist ein "delete &pi"
Du mußt Dich in C immer noch drum kümmern, daß der Speicher den Du reserviert hast (mit memset) wieder freigibst.
Das ist eine sehr große Fehlerquelle in C. Deshalb probier mal folgenes: Wenn Du den freien Speicher anschaust, machst Word auf und wieder zu, sind plötzlich einige KB (oder sogar MB) weg.
Leider gibts zum CBuilder keine guten Bücher, sonst könnte ich Dir eins empfehlen.
Hi,
also ich habe CBuilder gelernt mit dem Buch 'CBuilder in 21 Tagen'.
Das ist ganz gut geeignet für Anfänger.
mfg tojo
Es funzt leider immer noch nicht. Hier ist mein Quellcode. Kannst ja mal nach dem Fehler gucken. Die Backslashs werden bestimmt wieder verschwunden sein, ich habe beim Pfad aber immer 2 genommen.
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
char *pfad;
if (RadioButton1->Checked==true)
pfad="C:\\Spiele\\Age of Empires II\\empires2.exe";
if (RadioButton2->Checked==true)
pfad="C:\\Spiele\\ANNO1602\\1602.exe";
if (RadioButton3->Checked==true)
pfad="C:\\Spiele\\Core Design\\Tomb Raider III\\tomb3.exe";
if (RadioButton4->Checked==true)
pfad="C:\\Spiele\\Dark Reign\\splash\\Splash.exe";
if (RadioButton5->Checked==true)
pfad="C:\\Spiele\\Doom2\\Doom2.exe";
if (RadioButton6->Checked==true)
pfad="C:\\Spiele\\MMV3\\intro.exe";
if (RadioButton7->Checked==true)
pfad="C:\\Spiele\\Monkey2_deu\\mi2sound.bat";
if (RadioButton8->Checked==true)
pfad="C:\\Spiele\\PoC\\pocgerm.exe";
if (RadioButton9->Checked==true)
pfad="C:\\Spiele\\Rollcage\\Direct3D\\Rollcage.exe";
if (pfad!="")
{
bool b;
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
b = CreateProcess (NULL,
pfad,
NULL,
NULL,
true,
0,
0,
pfad,
&si,
&pi);
if (!b)
{
delete &si;
delete π
//PostQuitMessage(0);
//exit(0);
}
}
}
Du darfst bei der zweiten Pfadangabe NICHT den EXE Filenamen mit angeben. Wenn Du den weglässt, dann funzt es (zumindest bei mir, aber da gehts auch wenn ich NULL reinschreibe)
b = CreateProcess (NULL,
pfad,
NULL,
NULL,
true,
0,
0,
pfad, // hier nicht vollen Pfad mit EXE Datei, sondern nur den Pfad
&si, // reinschreiben! Also "C:\\SPIELE\\ANNO1602\\"
&pi);
Am besten Du führst zwei Variablen ein:
char *filename="1602.EXE";
char *pfad="C:\\SPIELE\\ANNO1602\\";
Ich weiß, es ist ein langer weg und viel rumprobiererei, aber C und vor allem die Windows API's sind nicht gerade für ihre Einfachheit bekannt. Da war die WinExec Funktion echt schneller...
Bin jetzt zwei Wochen nicht da, hoffentlich klappts jetzt.
Wenn nicht kann hier bestimm noch Jemand anderes helfen, frag mal Thomas Wölfer, der ist auch C++ Freak.
count
probiers mal mit "ShellExecute"
davon weiss ich zwar im monent nicht die genaue sysntax, aber sie steht in der hilfe ;-)
mfg, Rotti