Schon wieder ein Problem -.- Registry

12/03/2009 22:11 MrSm!th#1
Hi,
mich kennt ihr ja schon :facepalm:
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 Shadowz75#2
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 MrSm!th#3
Quote:
Originally Posted by Shadowz75 View Post
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 :facepalm:
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.FormatL"Error: %i", ::GetLastError());
             
MessageBoxstrL"Error!"MB_OK );
             
MessageBox(L"Contact MrSm!th!",MB_OK);
        } 
12/05/2009 22:01 MrSm!th#4
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 0length search_word.length();
        while ((
pos str.find(search_wordpos)) != std::string::npos)
        
str.replace(poslengthreplace_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 :facepalm:
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(""), NULLNULLtemp, &size);
    
RegCloseKey(hKey);

// Kopierteil beginnt (0en zwischen den Zeichen werden herausgefiltert)
    
char buf[255];
    
int i =0;
    
int i2 0;
    while(
<256)
    {
        
buf[i2] = temp[i];
        
i2++;
        
i+2;
    }

//ende
    
std::string str buf//voller String wird bei mir angezeigt