Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?

psychomik (Anonym) / 11 Antworten / Baumansicht Nickles

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.

bei Antwort benachrichtigen
count.negative psychomik (Anonym) „Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?“
Optionen

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.

bei Antwort benachrichtigen
psychomik (Anonym) count.negative „Probiers mal mit:WinExec C: PROGRAMM xxx.EXE , SW_SHOW pass aber auf, daß Du...“
Optionen

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.

bei Antwort benachrichtigen
count.negative psychomik (Anonym) „Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?“
Optionen

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

bei Antwort benachrichtigen
psychomik (Anonym) Nachtrag zu: „Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?“
Optionen

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?

bei Antwort benachrichtigen
count.negative psychomik (Anonym) „Also irgendetwas funzt da immer noch nicht. Das Win-Formular wird einfach...“
Optionen

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?

bei Antwort benachrichtigen
psychomik (Anonym) count.negative „Frage 1:Klar müssen die Pfade gleich sein, ich war einfach nur zu faul das...“
Optionen

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?

bei Antwort benachrichtigen
count.negative psychomik (Anonym) „ich habe das mit mit einer char -Variablen gemacht.zu Deiner Frage: ehrlich...“
Optionen

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.

bei Antwort benachrichtigen
tojo (Anonym) count.negative „Sorry,das ist ein delete pi Du mußt Dich in C immer noch drum kümmern, daß...“
Optionen

Hi,

also ich habe CBuilder gelernt mit dem Buch 'CBuilder in 21 Tagen'.
Das ist ganz gut geeignet für Anfänger.

mfg tojo

bei Antwort benachrichtigen
psychomik (Anonym) Nachtrag zu: „Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?“
Optionen

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);
}
}
}

bei Antwort benachrichtigen
count.negative psychomik (Anonym) „Es funzt leider immer noch nicht. Hier ist mein Quellcode. Kannst ja mal nach...“
Optionen

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

bei Antwort benachrichtigen
Rotti psychomik (Anonym) „Spiele aus einer Borland C++ (Windows-)Anwendung starten. Wie?“
Optionen

probiers mal mit "ShellExecute"
davon weiss ich zwar im monent nicht die genaue sysntax, aber sie steht in der hilfe ;-)
mfg, Rotti

bei Antwort benachrichtigen