Problem mit Patcher
-
Warkiller102 schrieb:
mhh also wirds nicht so einfach wie bei php/java, dass man einfach die jeweiligen wörter, o.a. in ein array bringt und diesen dann per Array[0], Array[1],... abrufen kann?
Doch doch, nur muss dafür eben auch die entsprechende Datenstruktur zur Verfügung stehen

Settings.szPatchURList deklariert alsTCHAR szPatchURL[MAXARRSIZE];, also als eine feste Anzahl 'char's, also Zeichen. Um ein statisches Array von Strings zu deklarieren, eignet sich z.B.std::string patch_urls[100];. Da ist die Array-Größe aber nicht veränderbar, also kann man auch den C++-Typ 'vector' nehmen:std::vector<std::string> patch_urls. Mitpatch_urls.push_back( "Hallo" );kannst du einen String hinzufügen,patch_urls.size()gibt dir die Anzahl zurück und mitpatch_urls[10]greifst du auf's zehnte Element zu. Also alles ganz einfach, nur musst du die Datenstruktur von 'Settings' anpassen oder deine Strings in einer anderen Datenstruktur speichern, jedenfalls nicht in einem char-Array
WarKiller102 schrieb:
mhh kannst mir erklären bzw ein beispiel für einen wrapper geben? kann mir darunter noch nicht viel vorstellen.
Wenn der Patcher nur einzelne Dateien patcht, wäre es evtl eine Möglichkeit, einen Skript oder ein kleines Programm zu schreiben, dass den Patcher für jede einzelne Datei aufruft.
WarKiller102 schrieb:
Badestrand schrieb:
edit2: Btw ist das Ding eher in C geschrieben

nunja ich hab echt nicht viel ahnung von c/c++ deshalb weiß/wusste ich es nicht genau
Hab mich geirrt, ist aber eher C-Stil; macht ja aber nix

Wegen dem 'throw': Du musst dir den String dann halt zusammenbasteln oder was anderes werfen. Zwei Möglichkeiten:
int patch_site = ...; if ( ! bla ) { std::stringstream msg; msg << "Invalid key in NeonCube.ini: " << patch_site; throw std::string( msg.str() ); } .. catch ( const std::string& err ) { MessageBox( ..., err.c_str(), ... ); }oder
class InvalidKeyException : public std::exception // Erbt von der Standard-exception-Klasse { public: InvalidKeyException( const unsigned int nr ) { std::stringstream ss; ss << "Invalid key in NeonCube.ini: " << nr; ss >> m_err; } std::string what() const { return m_err; } private: std::string m_err; }; int patch_site = ...; if ( ! bla ) throw InvalidKeyException( patch_site ); .. catch ( const InvalidKeyException& err ) { MessageBox( ..., err.what(), ... ); }
-
Badestrand schrieb:
Doch doch, nur muss dafür eben auch die entsprechende Datenstruktur zur Verfügung stehen

Settings.szPatchURList deklariert alsTCHAR szPatchURL[MAXARRSIZE];, also als eine feste Anzahl 'char's, also Zeichen. Um ein statisches Array von Strings zu deklarieren, eignet sich z.B.std::string patch_urls[100];. Da ist die Array-Größe aber nicht veränderbar, also kann man auch den C++-Typ 'vector' nehmen:std::vector<std::string> patch_urls. Mitpatch_urls.push_back( "Hallo" );kannst du einen String hinzufügen,patch_urls.size()gibt dir die Anzahl zurück und mitpatch_urls[10]greifst du auf's zehnte Element zu. Also alles ganz einfach, nur musst du die Datenstruktur von 'Settings' anpassen oder deine Strings in einer anderen Datenstruktur speichern, jedenfalls nicht in einem char-Array
also demzufolge müsste ich suchen wo er "szPatchURL" mit den daten aus der .ini datei deklariert und diese dann auf sowas ähnliches umändern das er daraus ein "richtiges" array macht oder seh ich das jetzt falsch und müsste dann komplett alles ändern?
*hinzufüg*
er deklariert das ja auch bei dem:if(GetPrivateProfileString("server", "...", NULL, settings.sz..., sizeof(settings.sz...) / sizeof(settings.sz...[0]), INIFILE) <= 0)oder ist das nur zum prüfen da, bzw der msgbox danach?
Badestrand schrieb:
Wegen dem 'throw': Du musst dir den String dann halt zusammenbasteln oder was anderes werfen. Zwei Möglichkeiten:
nunja es wird ja derzeit so gemacht:
try { if(GetPrivateProfileString("server", "grf_number", NULL, settings.szGRFNumber, sizeof(settings.szGRFNumber) / sizeof(settings.szGRFNumber[0]), INIFILE) <= 0) throw "Invalid key in NeonCube.ini: grf_number"; if(GetPrivateProfileString("server", "patch_site1", NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) throw "Invalid key in NeonCube.ini: patch_site"; } catch(LPCSTR message) { MessageBoxA(NULL, message, "Error", MB_OK | MB_ICONERROR); AddErrorLog("%s\n", message); return -1; }ich hab das jetzt mal bei mir so gemacht und funktioniert auch, jedoch sobald der wert aber richtig ist bringt er mir dann am ende nur eine leere msgbox.
try { if(GetPrivateProfileString("server", "grf_number", NULL, settings.szGRFNumber, sizeof(settings.szGRFNumber) / sizeof(settings.szGRFNumber[0]), INIFILE) <= 0) throw "Invalid key in NeonCube.ini: grf_number"; int GRFNumbers = 1; std::stringstream str; if(GetPrivateProfileString("server", "patch_site1", NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) str << "Invalid key in NeonCube.ini: patch_site" << GRFNumbers; throw std::string ( str.str() ); } catch(const std::string& message) { MessageBox(NULL, message.c_str(), "Error", MB_OK | MB_ICONERROR); AddErrorLog("%s\n", message); return -1; }
-
Warkiller102 schrieb:
also demzufolge müsste ich suchen wo er "szPatchURL" mit den daten aus der .ini datei deklariert und diese dann auf sowas ähnliches umändern das er daraus ein "richtiges" array macht oder seh ich das jetzt falsch und müsste dann komplett alles ändern?
Ich hab grad mal geguckt, ist nicht viel was du ändern musst - nur in der main.h die Datenstruktur inisettings anpassen; und diese Struktur wird nur in der main.cpp benutzt, als dateiglobale Variable.
Warkiller102 schrieb:
er deklariert das ja auch bei dem:
if(GetPrivateProfileString("server", "...", NULL, settings.sz..., sizeof(settings.sz...) / sizeof(settings.sz...[0]), INIFILE) <= 0)oder ist das nur zum prüfen da, bzw der msgbox danach?
Huh? Versteh ich nicht und da wird nix deklariert
Er verwendet es da, klar, den Aufruf zu GetPrivateProfileString musst du anpassen, bzw du musst wahrscheinlich auch die Struktur der Ini-Datei ändern, wenn da mehrere Pfade statt nur einem drin sein soll.Warkiller102 schrieb:
if(GetPrivateProfileString("server", "patch_site1", NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) str << "Invalid key in NeonCube.ini: patch_site" << GRFNumbers; throw std::string ( str.str() );Prinzipiell richtig, nur werden Blöcke mit {} gekennzeichnet, nicht mit Einrückungen
Konkret: Nach dem if müssen geschweifte Klammern die zwei eingerückten Zeilen umgeben. Ohne geschweifte Klammern wird nur der erste Ausdruck nach dem if ausgeführt, dass throw dann so oder so. Aber wieso hast du noch das "patch_site" in dem String drin?
-
Badestrand schrieb:
Ich hab grad mal geguckt, ist nicht viel was du ändern musst - nur in der main.h die Datenstruktur inisettings anpassen; und diese Struktur wird nur in der main.cpp benutzt, als dateiglobale Variable.
also bei der main.h müsste ich das "TCHAR szPatchURL[MAXARRAYSIZE];" zu "std::vectorstd::string szPatchURL;" umschreiben oder?
Badestrand schrieb:
Warkiller102 schrieb:
er deklariert das ja auch bei dem:
if(GetPrivateProfileString("server", "...", NULL, settings.sz..., sizeof(settings.sz...) / sizeof(settings.sz...[0]), INIFILE) <= 0)oder ist das nur zum prüfen da, bzw der msgbox danach?
Huh? Versteh ich nicht und da wird nix deklariert
Er verwendet es da, klar, den Aufruf zu GetPrivateProfileString musst du anpassen, bzw du musst wahrscheinlich auch die Struktur der Ini-Datei ändern, wenn da mehrere Pfade statt nur einem drin sein soll.nunja ich meinte irgendwo muss er ja den inhalt von der .ini datei in die variable bringen oder?^^
achja die .ini datei sieht ungefähr so aus:[server] patch_site1 = www.example.de patch_site2 = www.example2.deBadestrand schrieb:
Warkiller102 schrieb:
if(GetPrivateProfileString("server", "patch_site1", NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) str << "Invalid key in NeonCube.ini: patch_site" << GRFNumbers; throw std::string ( str.str() );Prinzipiell richtig, nur werden Blöcke mit {} gekennzeichnet, nicht mit Einrückungen
Konkret: Nach dem if müssen geschweifte Klammern die zwei eingerückten Zeilen umgeben. Ohne geschweifte Klammern wird nur der erste Ausdruck nach dem if ausgeführt, dass throw dann so oder so. Aber wieso hast du noch das "patch_site" in dem String drin?ok jetzt funktionierts^^ bin ich dank der vb/php lehrer so gewöhnt das man alles was nach dem if kommt auch ohne {} schreiben kann, obwohl ichs sonst auch nich mache
^^und vielen dank das du mir so sehr hilfst, würde sonst immer noch am anfang sitzen^^
-
Warkiller102 schrieb:
also bei der main.h müsste ich das "TCHAR szPatchURL[MAXARRAYSIZE];" zu "std::vectorstd::string szPatchURL;" umschreiben oder?
Richtig, aber das einfachste ist, du arbeitest dann erstmal nur mit Multibyte (also in den Projektoptionen irgendwo einstellen), sonst musst du std::wstring nehmen.
Warkiller102 schrieb:
nunja ich meinte irgendwo muss er ja den inhalt von der .ini datei in die variable bringen oder?^^
achja die .ini datei sieht ungefähr so aus:[server] patch_site1 = www.example.de patch_site2 = www.example2.deAchso, ja, klar! Gut, ich würde der Einfachheit noch ein oder zwei kleine Hilfsfunktionen reinbringen, um das Einlesen zu vereinfachen, etwa so:
// Ungetestet: string getPatchFile( const string& section, const unsigned int nr, const string& ini_path ) { stringstream key; key << "patch_site" << nr; char ret[1000]; GetPrivateProfileString( section, key.str().c_str(), "", ret, 1000, ini_path.c_str() ); return string( ret ); } // Und dann, zum auslesen: string path = "a"; // Damit beim ersten mal die Bedingung der for-Schleife erfüllt ist. Etwas unschön.. :D for ( unsigned int nr=1; path.size()>0; nr++ ) { path = getPatchFile( "server", nr, INIFILE ); if ( path.size() > 0 ) settings.urls.push_back( path ); // Zur Liste hinzufügen }Warkiller102 schrieb:
und vielen dank das du mir so sehr hilfst, würde sonst immer noch am anfang sitzen^^
Nicht der Rede wert
Ist auch immer wieder interessant zu sehen, an was andere so arbeiten.
-
Badestrand schrieb:
Achso, ja, klar! Gut, ich würde der Einfachheit noch ein oder zwei kleine Hilfsfunktionen reinbringen, um das Einlesen zu vereinfachen, etwa so:
// Ungetestet: string getPatchFile( const string& section, const unsigned int nr, const string& ini_path ) { stringstream key; key << "patch_site" << nr; char ret[1000]; GetPrivateProfileString( section, key.str().c_str(), "", ret, 1000, ini_path.c_str() ); return string( ret ); } // Und dann, zum auslesen: string path = "a"; // Damit beim ersten mal die Bedingung der for-Schleife erfüllt ist. Etwas unschön.. :D for ( unsigned int nr=1; path.size()>0; nr++ ) { path = getPatchFile( "server", nr, INIFILE ); if ( path.size() > 0 ) settings.urls.push_back( path ); // Zur Liste hinzufügen }mhh gut aber wie bind ich das nun in das schon vorhande ein, auch das mit dem "TCHAR ...;" bringt mir dann nur fehler wenn ich es in "std::vector...;" schreibe?

hab nun auch noch ein anderes (aber eher kleines problem^^)
und zwar hier:if(GetPrivateProfileString(\"server\", \"grf_number\", NULL, settings.szGRFNumber, sizeof(settings.szGRFNumber) / sizeof(settings.szGRFNumber[0]), INIFILE) <= 0) throw \"Invalid key in NeonCube.ini: grf_number\"; int GRFNumbers = 1; std::stringstream grfnumb; std::stringstream numb; std::stringstream str; grfnumb << GRFNumbers; while(grfnumb.str() >= settings.szGRFNumber) { str << \"patch_site\" << GRFNumbers; if(GetPrivateProfileString(\"server\", str.str().c_str(), NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) { numb << \"Invalid key in NeonCube.ini: patch_site\" << GRFNumbers; throw std::string ( numb.str() ); } ++GRFNumbers; grfnumb << GRFNumbers; }hier ist mein problem die while schleife, da es ja char und strings sind behandelt er die zahlen nicht als zahlen und bekommt irgendwie nicht mit wenn ich ihm sag er soll sie solange durchführen bis grfnumb = settings.GRFNumber ist, wie kann ich das beheben?
mhh soll ich vieleicht mal die ganzen dateien hochstellen die (wie ich glaube) für den hauptteil verantwortlich sind?
-
Warkiller102 schrieb:
mhh gut aber wie bind ich das nun in das schon vorhande ein, auch das mit dem "TCHAR ...;" bringt mir dann nur fehler wenn ich es in "std::vector...;" schreibe?

Also ich hab's bei mir mal ausprobiert, ich bekomme nur 4 Fehler, alle in der Art
error C2039: 'szPatchURL': Ist kein Element von 'inisetting'.
Drei der Fehler sind in der Zeile mit GetProfileString, wo halt die Patch-URLs aus der Ini-Datei gelesen werden. Da kannst du das einsetzen, was ich im Post eins drüber vorgeschlagen hab. Also die Funktion "getPatchFile" muss halt irgendwo drüber, da der std-Namensraum nicht mit using benutzt wird, musst du in "getPatchFile" halt auch noch ein paar mal "std::" einbauen
Warkiller102 schrieb:
hab nun auch noch ein anderes (aber eher kleines problem^^)
und zwar hier:if(GetPrivateProfileString(\"server\", \"grf_number\", NULL, settings.szGRFNumber, sizeof(settings.szGRFNumber) / sizeof(settings.szGRFNumber[0]), INIFILE) <= 0) throw \"Invalid key in NeonCube.ini: grf_number\"; int GRFNumbers = 1; std::stringstream grfnumb; std::stringstream numb; std::stringstream str; grfnumb << GRFNumbers; while(grfnumb.str() >= settings.szGRFNumber) { str << \"patch_site\" << GRFNumbers; if(GetPrivateProfileString(\"server\", str.str().c_str(), NULL, settings.szPatchURL, sizeof(settings.szPatchURL) / sizeof(settings.szPatchURL[0]), INIFILE) <= 0) { numb << \"Invalid key in NeonCube.ini: patch_site\" << GRFNumbers; throw std::string ( numb.str() ); } ++GRFNumbers; grfnumb << GRFNumbers; }hier ist mein problem die while schleife, da es ja char und strings sind behandelt er die zahlen nicht als zahlen und bekommt irgendwie nicht mit wenn ich ihm sag er soll sie solange durchführen bis grfnumb = settings.GRFNumber ist, wie kann ich das beheben?
Ich verstehe nicht genau, was die Schleife machen soll - wenn du mir die Soll-Funktionalität erklärst, fällt uns bestimmt was gutes ein.
Warkiller102 schrieb:
mhh soll ich vieleicht mal die ganzen dateien hochstellen die (wie ich glaube) für den hauptteil verantwortlich sind?
Ja, das wäre nicht schlecht, die Zeile mit
GetPrivateProfileString(\"server\", \"grf_number\",...)finde ich im Original-Code nicht und weiß ja generell nicht, auf welchem Stand dein Code grad ist.
-
nunja die schleife soll dann dafür dasein, das man "unendliche" viele einträge machen kann, die er dann halt jeweils in die szPatchURL bringt, bzw checkt ob das richtig ist oder nicht^^ aber sollte man wohl eher dann machen wenn das mit dem array richtig klappt oder?^^
habs mal hier: http://bdw-server.servebbs.com/Cplusplus/Patcher.rar hochgeladen
(zum richtig testen müssteste dir nurnoch 2 exen und eine .grf (einfach irgendeine datei nehmen und umbenennen zu ner .grf) machen, am besten vorher nochma in "neoncube/neoncube.ini" gucken^^)
-
Warkiller102 schrieb:
nunja die schleife soll dann dafür dasein, das man "unendliche" viele einträge machen kann, die er dann halt jeweils in die szPatchURL bringt, bzw checkt ob das richtig ist oder nicht^^ aber sollte man wohl eher dann machen wenn das mit dem array richtig klappt oder?^^
Ja, besser erstmal das Array in Schwung bringen
Wofür steht eigentlich das GRF? Und so ganz versteh ich die Schleife immer noch nicht, wer macht denn Einträge? Und jedesmal wird geschaut, ob "patch_sitexy" schon in der Ini-Datei eingetragen ist? Eventuell könntest du in der Ini-Section [server] auch einfach die Anzahl der URLs speichern, irgendwie "patch_site_count=xy" oder so?Warkiller102 schrieb:
habs mal hier: http://bdw-server.servebbs.com/Cplusplus/Patcher.rar hochgeladen
(zum richtig testen müssteste dir nurnoch 2 exen und eine .grf (einfach irgendeine datei nehmen und umbenennen zu ner .grf) machen, am besten vorher nochma in "neoncube/neoncube.ini" gucken^^)Die Seite geht bei mir irgendwie nicht

-
Badestrand schrieb:
Ja, besser erstmal das Array in Schwung bringen
Wofür steht eigentlich das GRF? Und so ganz versteh ich die Schleife immer noch nicht, wer macht denn Einträge? Und jedesmal wird geschaut, ob "patch_sitexy" schon in der Ini-Datei eingetragen ist? Eventuell könntest du in der Ini-Section [server] auch einfach die Anzahl der URLs speichern, irgendwie "patch_site_count=xy" oder so?GRF ist sowas wie ein "rar" verzeichnis also nen container für dateien^^
die anzahl ist ja gespeichert in der GRFNumbers, die heißt in der .ini "grf_number"^^und ja er soll halt prüfen ob ein wert vorliegt und wenn ja dann soll er weitermachen oder halt den throw wert ausgeben^^
Badestrand schrieb:
Die Seite geht bei mir irgendwie nicht

lag am provider, bzw internet das war seit heut früh irgendwie down, ebenfalls der server dürft jetzt aber wieder gehen^^
-
grüße
hast du/hat schon jemand vielleicht einen anderen/neuen lösungsvorschlag? komm allein irgendwie nicht weiter.mfg
Warkiller102
-
Ich guck morgen irgendwann nochmal in den Code, wenn ich Zeit finde

-
Haste schon Zeit gefunden?^^
Oder hat vielleicht noch jemand anders eine Idee?
MfG
Warkiller102
-
grüße
hab den patcher nochma neu hochgeladen, mir ist aufgefallen das da einige dateien nich mit drin waren.hier nochma der link: http://bdw-server.servebbs.com/Cplusplus/Patcher.rar
hat aber vieleicht schon jemand eine idee?
mfg
Warkiller102