Diablo-Launcher
-
Hallo,
die meißten von euch kennen wohl Blizzards Klassiker Diablo 2.
Also ich habe Diablo bei mir mehrmals installiert, um es auch mehrfach parallel auszuführen. Von Hand klappt das auch alles Prima.Nun wollt ich mir einen kleinen Loader schreiben bei dem ich auswählen kann wie oft und in welchem Modus es gestartet werden soll.
Also ob im normalen Vollbildmodus oder im Fenstermodus.Der Parameter "-skiptobnet" sorgt nur dafür das die Introvideos übersprungen werden und "-w" ist für den Fenstermodus.
Mein Problem:
Egal was ich auswähle, es wird nie mehr als eine Instanz von Diablo gestartet. Sprich: Es kommt nie zu einem zweiten RunApplication.Hier der Code:
void __fastcall TForm1::btn_normalClick(TObject *Sender) { if (rd_1->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-skiptobnet"); } if (rd_2->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-skiptobnet"); } if (rd_3->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-skiptobnet"); } if (rd_4->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_D\\game_D.exe", "-skiptobnet"); } if (rd_5->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_D\\game_D.exe", "-skiptobnet"); RunApplication("E:\\D2installationen\\diablo_F\\game_F.exe", "-skiptobnet"); } } //--------------------------------------------------------------------------- void __fastcall TForm1::btn_windowClick(TObject *Sender) { if (rd_1->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-w -skiptobnet"); } if (rd_2->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-w -skiptobnet"); } if (rd_3->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-w -skiptobnet"); } if (rd_4->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_D\\game_D.exe", "-w -skiptobnet"); } if (rd_5->Checked==1) { RunApplication("E:\\D2installationen\\diablo_A\\game_A.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_B\\game_B.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_C\\game_C.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_D\\game_D.exe", "-w -skiptobnet"); RunApplication("E:\\D2installationen\\diablo_F\\game_F.exe", "-w -skiptobnet"); } }Die RunApplication Funktion hab ich aus der FAQ
-
Wie, du hast es mehrfach installiert?
Es gibt doch (z.B. Download von einer der Diablo2-Foren) eine DLL, die man einfach austauschen muß, damit man D2 mehrfach starten kann. Mache ich auch so.Bzgl. RunApplication:
Heißen die Exe-Dateien wirklich Game_A, Game_B, Game_C etc?
-
Nein die heißen normal alle einfach nur game.exe.
Ich habe die aber umbenannt, da ich dachte das mein Programm damit vl. Probleme hat.Ich hab die Mehrfachinstallation nach einer Anleitung aus einem bekannten Diabloforum durchgeführt und wie gesagt von Hand kann ich es ohne Probleme 5x starten egal ob die exen alle nur game.exe oder game_A bis game_F heißen.
Ich habe das ganze auch schon in einer anderen Programmiersprache probiert ebenfalls ohne Erfolg.

-
Wozu muss man denn so ein game 5x starten?

-
Hallo,
grundsätzlich würde ich das Prog erstma kürzen. Viell. die Anzahl (die der Nutzer ja angegeben hat) der zu startenden *.exe-Dateien in einer Schleife nutzen und den RunApplication-Aufruf dann über eine Laufvariable ändern...
Man könnte sich viell auch den 2. Button sparen. Wenn man in der Schleife abfragt, ob -w genutzt werden soll (muss der Nutzer natürlich vorher angeben), könnte man es dann bei Bedarf in den RunApplication-Aufruf einfügen...Aber warum das Prog bloß 1x gestartet wird- kA! Ich kenn' mich noch nich so gut aus - was sind rd_X für Objekte? Viell fragst Du besser mit
if (rd_X->Checked == true)ab...!?!
-
Unwissend - 5fach-Start? schrieb:
Wozu muss man denn so ein game 5x starten?

Dann kannst du z.B. Gegenstände sehr leicht zwischen deinen verschiedenen Charaktären tauschen. Ansonsten musst du immer jemanden anhauen und dem musst du auch noch vertrauen können das er dich nicht bestiehlt.
Wenn du mehr Beispiele willst sag bescheid.
-
Ob ein und dasselbe Diablo oder 5 verschiedene Installationen, du solltest gleich Code schreiben der ein bisschen genereller ist.
z.B. nen Dropdown mit Werten von 1 bis 10 und dann sowas wie...
(halber pseudocode)
installation[0] = "E:\\D2installationen\\diablo_A\\game.exe"; installation[1] = "E:\\D2installationen\\diablo_B\\game.exe"; Button::OnClick(...){ for(int i=0; i < dropdownwert;i++){ paramater = getMode(i) + getAnotherMode(i); RunApplication(installation[i], paramater); } }
-
OK danke für denn Tipp.
Ich konnte mir schon denken, dass mein Code nicht der feinste ist.
Ich programmiere noch nicht all zu lang.@Kolumbus: rd_x sind RadioButtons.
-
Der ursprüngliche Code sollte so auch funktionieren wie er da steht, auch wenn er nicht elegant ist.
In RunApplication wird ja wohl ShellExecute aufgerufen. Welchen Rückgabewert erhälst du dort beim 2. Versuch?
Teste doch einmal, ob du ein anderes Programm mehrmals starten kannst (z. B. Notepad).
-
@GreyHound: Ja, so ungefähr meinte ich das...

@peggel: Was ist nun aus
if (rd_X->Checked == true)geworden? hat's geholfen?
Hab grad nochmal in die Hilfe vom BDS2006 geschaut, Checked ist eine bool -Eigenschaft der Klasse TRadioButton. Ich denke die sollte man dann auch mit true / false prüfen, auch wenn's mit 1 und 0 ebenfalls geht / gehen müsste!
Fincki schrieb:
Der ursprüngliche Code sollte so auch funktionieren wie er da steht, auch wenn er nicht elegant ist.
Hat ja auch keiner bezweifelt, oder?

Edit: Fakt ist, der Code führt nicht zum gewünschten Ergebnis - also sucht man nach Lösungen und gibt noch Tips am Rande!