Registry Windows XP



  • Tag zusammen
    Mein Programm erstellt bei einem Buttonklick einen Registry Eintrag. Es tut sich selber in den Autostart(Software\Microsoft\Windows\CurrentVersion\Run). Mein Programm tut wenn ich es starte aber auch schauen ob dort dieser Eintrag schon vorhanden ist. Unter Vista funktioniert das alles ohne Probleme. Unter Xp erkennt er den Eintrag wenn er zufor vom Programm erstellt wurde nicht. Wenn ich ihn aber selber Eintrage dann erkennt er ihn.

    Erstellen des Eintrags:

    wchar_t buf[256]; 
    GetModuleFileName(NULL, buf, 255);
    HKEY hKey; 			RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0);
    BYTE *cString = (BYTE *) buf;
    RegSetValueEx(hKey,L"Bibel-Box",0,REG_SZ,cString,257);
    RegCloseKey(hKey);
    

    Auslesen ob der Eintrag schon vorhanden ist:

    int bibel1 = 0;
    std::string bibel = std::string("Bibel-Box",30);
    
    char bibelbox[50];
    
    HKEY hKey; 
    			RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0);
    int i=0; 
    int iLastError=0; 
    do 
    { 
            wchar_t cValueName[50]; 
    	DWORD dwValueName = 256; 
    	DWORD ValueType = 0; 
    	BYTE cValueData[256] = "\0"; 
    	DWORD dwValueData = 256; 
    	iLastError  
    RegEnumValue(hKey,i,cValueName,&dwValueName,0,&ValueType,cValueData,&dwValueData); 
    ++i; 
    WideCharToMultiByte(CP_ACP,0,cValueName,-1, bibelbox,sizeof(bibelbox),NULL,NULL);
    std::string stringw = std::string(bibelbox,30 );
    if(stringw.size() == 30)
    {
    	for(size_t i = 0;i < stringw.size();i++)
    	{
    		if(i == 29)
    		{
    			bibel1 = 0;
    		}
    		if(stringw.at(i) == bibel.at(i))
    		    {
    			bibel1 += 1;
    			if(bibel1>9)
    			{
    			        iLastError =ERROR_NO_MORE_ITEMS;
    				checked = true;
    			}
    		}
    	}
     }
    }while(iLastError!=ERROR_NO_MORE_ITEMS);
    RegCloseKey(hKey);
    

    Ich weis, dass ist alles noch nicht besonders schön, aber es soll erstmal tun.

    MFG



  • Die richtigen Rechte, etc. wirst du ja sicher haben oder?
    Wenn du den Eintrag mit deinem Programm gesetzt hast und dann von Hand in der Registry nachsiehst ist er auch nicht da?



  • Doch er ist da. Er wird beim nächsten Programmstart unter XP nur nicht erkannt.



  • Hab mich in deinen Code noch nich so reingeguckt, aber hast du das Beispiel schonmal durchgearbeitet? Und warum wertest du die Rückgabewerte von RegCreateKeyEx und RegEnumValue nicht aus?



  • So hab mal weiter in deinem Code geschaut. RegEnumValue rufst du nur mit dem Index 0 auf, zumindest in dem Code den man sehen kann. Wer sagt aber das dein Wert an Stelle 0 steht?
    In der Hilfe steth auch

    dwIndex [in]

    The index of the value to be retrieved. This parameter should be zero for the first call to the RegEnumValue function and then be incremented for subsequent calls.

    Because values are not ordered, any new value will have an arbitrary index. This means that the function may return values in any order.



  • Auch dein vergleich der Zeichenketten sieht sehr exotisch aus.



  • oneill5000 schrieb:

    So hab mal weiter in deinem Code geschaut. RegEnumValue rufst du nur mit dem Index 0 auf, zumindest in dem Code den man sehen kann. Wer sagt aber das dein Wert an Stelle 0 steht?
    In der Hilfe steth auch

    dwIndex [in]

    The index of the value to be retrieved. This parameter should be zero for the first call to the RegEnumValue function and then be incremented for subsequent calls.

    Because values are not ordered, any new value will have an arbitrary index. This means that the function may return values in any order.

    Ich übergebe doch als Index i und i wird bei jedem Schleifendurchgang um 1 erhöht(++i). Das geht solange bis RegEnumValue ERROR_NO_MORE_ITEMS zurückgibt.
    Unter Vista funktioniert es ja auch ohne Probleme.

    oneill5000 schrieb:

    Auch dein vergleich der Zeichenketten sieht sehr exotisch aus.

    Jo des stimmt. Des wird auch noch geändert.

    MFG


  • Mod

    Dieser Code setzt voraus, dass Dein Programm als Admin läuft. Unter Vista läuft es weil Dein Programm virtualisiert wird. Du hast mit Sicherheit kein Manifest gesetzt. HKLM und KEY_ALL_ACCESS hast Du nur als Admin, oder unter Vista wenn Dein Programm elevated läuft.



  • Fatal Error appears schrieb:

    Ich übergebe doch als Index i und i wird bei jedem Schleifendurchgang um 1 erhöht(++i). Das geht solange bis RegEnumValue ERROR_NO_MORE_ITEMS zurückgibt.
    MFG

    Sorry, du hast natürlich recht. Sowas übersieht man wenn man nebenbei noch arbeiten muss 😉



  • Martin Richter schrieb:

    Dieser Code setzt voraus, dass Dein Programm als Admin läuft. Unter Vista läuft es weil Dein Programm virtualisiert wird. Du hast mit Sicherheit kein Manifest gesetzt. HKLM und KEY_ALL_ACCESS hast Du nur als Admin, oder unter Vista wenn Dein Programm elevated läuft.

    Hat da jemand einen Link oder ein Beispiel?

    MFG


  • Mod

    Bitte was für ein Beispiel. Bzgl. Manifest und Vista findest Du genug Futter hier im Forum oder auf meinem Blog:
    http://blog.m-ri.de/index.php/tag/manifest/

    Werde Dir erstmal klar was Virtualisierung bedeutet unter Vista, und dann wundere Dich was wo in der Registry steht 😉



  • Martin Richter schrieb:

    Bitte was für ein Beispiel. Bzgl. Manifest und Vista findest Du genug Futter hier im Forum oder auf meinem Blog:
    http://blog.m-ri.de/index.php/tag/manifest/

    Werde Dir erstmal klar was Virtualisierung bedeutet unter Vista, und dann wundere Dich was wo in der Registry steht 😉

    Ich hab jetzt das Manifest so abgeändert, dass als level 'requireAdministrator' da steht. Aber unter Xp erkennt er den zufor geschriebenen Eintrag immer noch nicht..

    Manifest:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
          </requestedPrivileges>
        </security>
      </trustInfo>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    

    Mfg



  • Bist du (vollwärtiger) Administrator auf deinem XP Rechner?



  • Ja ich bin der einzigste Benutzer und ich bin Administrator.



  • Hast du denn das Beispiel vom MSDN schonmal ausprobiert, von wo ich dir den link geschickt habe? Den änderst du dann einfach noch ein wenig nach deinen Bedürfnissen ab und dann funktionierts auch.



  • Vielen Dank jetzt funkts^^



  • UNd was hast jetzt gemacht? Das Beispiel mit verwendet?



  • oneill5000 schrieb:

    UNd was hast jetzt gemacht? Das Beispiel mit verwendet?

    Meinen Code komplett gelöscht und nochmal neu nach deinem Beispiel geschrieben.:)


Anmelden zum Antworten