|
You last visited: Today at 04:19
Advertisement
Schon wieder ein Problem -.- Registry
Discussion on Schon wieder ein Problem -.- Registry within the General Coding forum part of the Coders Den category.
12/03/2009, 22:11
|
#1
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,906
Received Thanks: 25,409
|
Registryproblem+Nullen aus Chararray (zwischen Zeichen) filtern
Hi,
mich kennt ihr ja schon 
Mal wieder ein Problem, zu dem ich nach 3 Stunden googlen nichts gefunden habe (sagt mal gibts da ne versteckte Funktion um das zu finden, was man sucht oder was?)!
Ohne lange um den heißen Brei zu reden, mein Problem:
Ich wollte den Launcher nicht mehr vom Verzeichnis abhängig machen.
Da der Pfad eines Unterordners vom Spiel in der Registry steht, wollte ich damit den Pfad bekommen.
Der Schlüsselpfad ist richtig und auch die Typen etc.
Hier der Code:
PHP Code:
HKEY hKey = 0;
char buf[255] = {0};
DWORD dwType = 0;
DWORD dwBufSize = sizeof(buf);
if( RegOpenKey(HKEY_CURRENT_USER,_T("HKEY_CURRENT_USER\\Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS)
{
dwType = REG_SZ;
RegQueryValueEx(hKey,_T("(Standard)"),0, &dwType, (BYTE*)buf, &dwBufSize);
path = *buf;
}
else
{
CString str;
str.Format(L"Error: %i",GetLastError());
AfxMessageBox(L"Fehler beim Auslesen der Registry!/An Error occurred while reading the Registry!");
AfxMessageBox(L"Wende dich an MrSm!th bei epvpers/Contact MrSm!th on epvpers");
MessageBox(str,L"Error!",MB_OK);
So ähnlich habe ich es erst selbst formuliert.
Dann habe ich ein fertiges Beispiel genommen.
Ich habe mit und ohne Adminrechte ausgeführt.
Und trotzdem failt RegOpenKey!
Wenn ich das im VS Debugger lese, steht da etwas bei hKey, nämlich (0x00000000=unused???) und dann in rot "Der Ausdruck kann nicht ausgewertet werden!".
Ok, ist klar beim Wert 0.
Aber wie gesagt die Funktion failt und ich finde einfach keine andere Fehlerquelle, aber das muss doch gehen.
Selbst in der MSDN ist der HKEY nicht großartig anders initialisiert.
In der MessageBox wird Error:0 ausgegeben.
Eigentlich ist 0 doch der Wert, dass es klappt; hier gehts aber nicht -.-
Und selbst wenn ich in der Abfrage den Wert 0 abfragen würde, käme ja immernoch der Crash vom Launcher, der auch kommt, wenn ich die Abfrage ganz weglasse.
Mal wieder Danke im Voraus.
|
|
|
12/03/2009, 22:32
|
#2
|
elite*gold: 0
Join Date: Mar 2009
Posts: 443
Received Thanks: 597
|
Code:
if( RegOpenKey(HKEY_CURRENT_USER,_T("Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS)
statt:
Code:
if( RegOpenKey(HKEY_CURRENT_USER,_T("HKEY_CURRENT_USER\\Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS)
|
|
|
12/03/2009, 23:00
|
#3
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,906
Received Thanks: 25,409
|
Quote:
Originally Posted by Shadowz75
Code:
if( RegOpenKey(HKEY_CURRENT_USER,_T("Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS)
statt:
Code:
if( RegOpenKey(HKEY_CURRENT_USER,_T("HKEY_CURRENT_USER\\Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS)
|
hupps sry, das habe ich glatt vergessen!
So wie du es geposted hast, hatte ich es vorher!
Nur es gab das gleiche Problem.
Also habe ich es mal damit probiert, aber gleiches Ergebnis.
Habe nur vergessen es wieder rückgängig zu machen.
edit: ah moment.
Ich hatte da \\Software... vorher stehen.
Und nicht Software...
Man das sollte auch in die größten Programmierfails 
aber eine Execption gibts immernoch.
In thrdcore oder so.
Mal sehen ob die Pramameter richtig übergeben werden.
Danke trotzdem, ich kannte die Lösung zwar schon indirekt und dachte damit klappts nicht, aber dein Post hat mich dazu gebracht, es doch nochmal zu testen^^
edit2:
Jetzt kommt gar nix dabei raus.
Das heißt anscheinend wird in den char* buf nix geschrieben(zumindest zeigt der Debugger 0 an).
Deshalb wirds auch nix mit den anderen strings und am Ende kommt wohl deswegen ein String aus Japanischen/Chinesischen/Koreanischen Zeichen.
Also neue Frage:
Warum wird buf nicht beschrieben???
PHP Code:
HKEY hKey = 0;
char buf[255] = {0};
DWORD dwType = 0;
DWORD dwBufSize = sizeof(buf);
if( RegOpenKey(HKEY_CURRENT_USER,_T("Software\\Ahnlab\\HShield"),&hKey) == ERROR_SUCCESS) { dwType = REG_SZ; RegQueryValueEx(hKey,_T(""),0, &dwType, (LPBYTE)buf, &dwBufSize); path = *buf; RegCloseKey(hKey); } else { CString str; str.Format(L"Error: %i",GetLastError()); AfxMessageBox(L"Fehler beim Auslesen der Registry!/An Error occurred while reading the Registry!"); AfxMessageBox(L"Wende dich an MrSm!th bei epvpers/Contact MrSm!th on epvpers"); MessageBox(str,L"Error!",MB_OK); RegCloseKey(hKey); }
std::string str1 = "S4Client.exe\""; ClittleS4launcherDlg tmp; tmp.FindDir(); size_t pos = path.find("HShield",0); path = path.substr(0,path.length()-7); path = path+str1; std::string param1 = " -rc:eu -lac:eng -auth_server_ip:217.110.102.94"; std::string param2 = " -rc:eu -lac:ger -auth_server_ip:217.110.102.94"; path = "\""+path+param1; if(!CreateProcess(NULL,(LPWSTR)&path,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { CString str; str.Format( L"Error: %i", ::GetLastError()); MessageBox( str, L"Error!", MB_OK ); MessageBox(L"Contact MrSm!th!",MB_OK); }
|
|
|
12/05/2009, 22:01
|
#4
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,906
Received Thanks: 25,409
|
Ok, habe es nun hingekriegt.
"(Standard)" wird nur in der Registry angezeigt, in C++ muss es "" sein.
Jetzt gehts.
Nur wird leider der Pfad mit 0en Zurückgegeben also:
buf[0] = F
buf[1] = 0
buf[2] = :
buf[3] = 0
usw.
Wie kriege ich die da raus? Das ist nämlich das Problem, warum der Pfad nicht richtig verwendet werden kann.
Schon nach F ist der buf angeblich zuende für den Rechner.
Habe schon versucht, die 0en zu löschen und die anderen Buchstaben aufrücken zu lassen.
Mit meinen Ideen (die 0 löschen, und den wert vom nächsten in diesen setzen; nächsten auf 0 setzen) hats nicht geklappt (hat sonst jemand eine Idee?), also probierte ich ohne Erfolg einfach alle nicht 0 Werte in ein zweites Array zu kopieren (code unten) hat nicht geklappt.
Es wurde gar nichts kopiert komischerweise, obwohl die Bedingung zutraf und man sogar in den if Teil kam.
Komischerweise hat das zweite Array auch trotz initialisierung mit 0 ganz komische Werte.
Code:
PHP Code:
HKEY hKey = 0;
char buf[255]; for(int i=0;i<256;i++) buf[i] = 0; int pos = 0; int pos2 = 0;
DWORD dwType = 0;
DWORD dwBufSize = 255;
if( RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\Ahnlab\\HShield"),0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) { dwType = REG_SZ; if(RegQueryValueEx(hKey,_T(""),NULL, &dwType,(LPBYTE)buf, &dwBufSize)==ERROR_SUCCESS) {
//hier beginnt der Teil zum kopieren
int itmp =0; int itmp2 = 0; char temp[255]; for(int i=0;i<256;i++) temp[i] =0; while(itmp <255) { if(buf[itmp]!=0) { temp[itmp2] = buf[itmp]; itmp2++; } itmp++; } //Ende
std::string str = temp; std::string search_word = "HShield", replace_word = "S4Client.exe\""; size_t pos = 0, length = search_word.length(); while ((pos = str.find(search_word, pos)) != std::string::npos) str.replace(pos, length, replace_word); path = str; RegCloseKey(hKey); } else { CString str; str.Format(L"Error: %i",GetLastError()); AfxMessageBox(str); RegCloseKey(hKey); OnOK(); } } else { CString str; str.Format(L"Error: %i",GetLastError()); AfxMessageBox(L"Fehler beim Auslesen der Registry!/An Error occurred while reading the Registry!"); AfxMessageBox(L"Wende dich an MrSm!th bei epvpers/Contact MrSm!th on epvpers"); MessageBox(str,L"Error!",MB_OK); }
Der Teil zwischen den Kommentaren ist der Teil, der kopiert.
Ist da irgendwo ein Fehler? Ich sehe keinen.
Oder gibts dafür eine fertige Funktion/könnt ihr mir sagen, wie man es besser schreiben könnte?
Oder am besten sogar gleich, wie man am besten Pfad aus der Registry ausliest?
Google hat bei keinem der drei Möglichkeiten etwas ausgespuckt =/
Danke im Voraus
edit:
Vielen Dank 
super geholfen.
naja, für die, die das selbe Problem haben, poste ich mal den Code
#title edited to find it easier by google
PHP Code:
unsigned char temp[255] = {""}; unsigned long size = sizeof(temp); HKEY hKey; RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Ahnlab\\HShield"), &hKey); RegQueryValueEx(hKey, _T(""), NULL, NULL, temp, &size); RegCloseKey(hKey);
// Kopierteil beginnt (0en zwischen den Zeichen werden herausgefiltert) char buf[255]; int i =0; int i2 = 0; while(i <256) { buf[i2] = temp[i]; i2++; i = i+2; }
//ende std::string str = buf; //voller String wird bei mir angezeigt
|
|
|
 |
Similar Threads
|
Crossfire Problem schon wieder -.-!!!!!!
07/12/2010 - CrossFire - 21 Replies
Hi jungs,
Ich hatte schon ein Thread aber hab den schließen lassen, weil ich dachte ich hab das Problem gelöst, was ja der fall nicht ist^^.
Wie schon oben steht habe ich ein problem. Also wenn ich crossfire öffne und spiele so 10 minuten geht einfach mein Monitor aus einfach so. Und muss mein PC vom Schalter ausmachen und anmachen.
Wer hilft kriegt THX.
Mit freundlichen Grüßen
|
schon wieder problem mit d2nt bbird
05/27/2010 - Diablo 2 - 6 Replies
yo, bot läuft nun seit 3:00 uhr und es sieht atm folgendermassen aus (2bots)
nr 1
runs restarts chickens
30 19 1
nr
33 27 2
|
Schon wieder ein Problem
04/15/2010 - Metin2 Private Server - 15 Replies
Moin also ich hab ein problem auf meinem hamachi pserver es können alle leute drauf zocken bis auf einem woran liegt es er hat die mc.txt in meine hamachi ip geändert er ist in hamachi drin er kriegt immer nach char auswahl kick
|
Sorry aber ich hab schon wieder ein Problem
02/27/2010 - Metin2 Private Server - 4 Replies
Schei** ich nerv schon wieder
ich hab schon gegooglet aber nix gefunden
Ich versuch dauernd mir Fliezilla auf meinen Server zuzugreifen
aber da kommt dann immer nur
Fehler: Zeitüberschreitung der Verbindung
Fehler: Herstellen der Verbindung zum Server fehlgeschlagen
Hoffe ihr könnt mir helfen
MfG Nixodas
|
Schon wieder problem mit Longjuyt2 -.-
09/03/2009 - Metin2 Private Server - 8 Replies
also ich bins mal weder :D
vllt geh ich euch schon auf die nerven, aber ich habe mal wieder eine frage.
und zwar:
ich spile Longjuyt2 mit der deutschen exe.
Ich klicke wie immer auf die exe zum starten, wie jedes mal wenn ich spielen will.
aber dann: das spiel startet einfaach nich -.-
|
All times are GMT +2. The time now is 04:19.
|
|