Schleifen, Checkboxen und Programmcode ausführen



  • Hallo zusammen,

    ich habe folgendes Szenario zu lösen.

    Ich habe in einem Programm 10 Checkboxen. Wenn eine Checkbox aktiviert ist, soll ein bestimmter Ordner erstellt werden und dann auch ein Programmaufruf gemacht werden, in der Art etwa dieser, wobei szSaveFileName durch eine Variable ersetzt werden muss:

    // Save registry subkey.  If the registry is remote, files will 
            // be saved on the remote machine 
            rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
    

    Das heißt auch, wenn ein User mehrere Checkboxen aktiviert, müssen dann auch dementsprechend Unterordner angelegt werden und der jeweils zu exportierende Regkey muss dann in den passenden Unterordner kopiert werden.

    Kann mir vielleicht jemand Anregungen zum Thema geben oder mir gegebenfalls helfen?

    Danke für Eure Antworten!



  • Kann mir denn hier vielleicht jemand eine Hilfestellung zu kommen lassen?

    Das wäre echt super!



  • Mahlzeit!

    Also ich würde...

    1. mir einen Button anlegen
    2. die Eventbehandlung der Checkboxen soweit beschränken, das du nur ein Flag setzt, ob die jeweilige Checkbox angewählt wurde....
    3. in der Eventbehandlung des Buttons diese Flags auswerten und dann den jeweiligen Ordner erstellen...

    4. (falls ich das richtig verstanden habe was du machen willst)

    muh



  • Hallo MuhKuh_DD!

    Also ich habe bis jetzt folgendes mit Hilfe des Forums realisert!

    Das ist der Code ( Global hinterlegt ) zum speicher nvon Registry Keys und deren SubKeys.

    LONG SaveRegistrySubKey( 
        HKEY hKey,              // handle of key to save 
        LPTSTR szSubKey,        // pointer to subkey name to save 
        LPTSTR szSaveFileName   // pointer to save path/filename 
        ) 
    { 
        HKEY hKeyToSave;    // Handle of subkey to save 
        LONG rc;            // result code from RegXxx 
        DWORD dwDisposition; 
    
        if((rc=RegCreateKeyEx(hKey, 
                              szSubKey, // Name of subkey to open 
                              0, 
                              NULL, 
                              REG_OPTION_BACKUP_RESTORE, // in winnt.h 
                              KEY_QUERY_VALUE, // minimal access 
                              NULL, 
                              &hKeyToSave, 
                              &dwDisposition) 
                              ) == ERROR_SUCCESS) 
        { 
            // Save registry subkey.  If the registry is remote, files will 
            // be saved on the remote machine 
            rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL); 
    
            // close registry key we just tried to save 
            RegCloseKey(hKeyToSave); 
        } 
    
        // return the last registry result code 
        return rc; 
    }  
    
    DWORD SaveReg(HKEY hKey) 
    { 
       TOKEN_PRIVILEGES tp; 
       HANDLE hToken; 
       LUID luid; 
       LONG rc;     // contains error value returned by Regxxx() 
    
       DWORD dwSubKeyIndex=0;   // index into key 
       char szSubKey[_MAX_FNAME]; // this should be dynamic. 
                                // _MAX_FNAME is good because this 
                                // is what we happen to save the 
                                // subkey as 
       DWORD dwSubKeyLength=_MAX_FNAME; // length of SubKey buffer 
    
        if(!OpenProcessToken(GetCurrentProcess(), 
                            TOKEN_ADJUST_PRIVILEGES, 
                            &hToken )) 
        { 
            AfxMessageBox("OpenProcessToken"); 
            return GetLastError(); 
        } 
    if(!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &luid)) 
    
        { 
            AfxMessageBox("LookupPrivilegeValue"); 
            return GetLastError(); 
        } 
    
        tp.PrivilegeCount           = 1; 
        tp.Privileges[0].Luid       = luid; 
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), 
                                    NULL, NULL ); 
    
        if (GetLastError() != ERROR_SUCCESS) 
        { 
            AfxMessageBox("AdjustTokenPrivileges"); 
            return GetLastError(); 
        } 
    
        while((rc=RegEnumKeyEx( 
                            hKey, 
                            dwSubKeyIndex, 
                            szSubKey, 
                            &dwSubKeyLength, 
                            NULL, 
                            NULL, 
                            NULL, 
                            NULL) 
                            ) != ERROR_NO_MORE_ITEMS) { // are we done? 
    
        if(rc == ERROR_SUCCESS) 
       { 
            LONG lRetVal; // return value from SaveRegistrySubKey 
    
            // save registry subkey szSubKey to filename szSubKey 
            if( (lRetVal=SaveRegistrySubKey(hKey, szSubKey, szSubKey) 
                ) != ERROR_SUCCESS) 
            { 
                AfxMessageBox("SaveRegistrySubKey"); 
                return (DWORD) lRetVal; 
            } 
    
            // increment index into the key 
           dwSubKeyIndex++; 
    
           // reset buffer size 
            dwSubKeyLength=_MAX_FNAME; 
    
            // Continue the festivities 
            continue; 
        } 
        else 
       { 
           // 
           // note: we need to watch for ERROR_MORE_DATA 
           // this indicates we need a bigger szSubKey buffer 
           // 
            AfxMessageBox("RegEnumKeyEx"); 
            return (DWORD) rc; 
       } 
    
        } // RegEnumKeyEx 
    
        // Revoke all privileges this process holds (including backup) 
        AdjustTokenPrivileges( hToken, TRUE, NULL, 0, NULL, NULL); 
    
        // close handle to process token 
        CloseHandle(hToken); 
    
        return 0; 
    
    }
    

    Das ganze Rufe ich über folgenden Code auf:

    void CRegistryneuDlg::OnButton1() 
    {
    
    UpdateData(TRUE);
    if (m_check1 == TRUE) 
    
    { 
    
    //	CreateDirectory("C:\\ISDNAPL",NULL);
    
    	HKEY hkey; 
    
        DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0, KEY_ALL_ACCESS, &hkey); 
    
        SaveReg(hkey); 
    
        RegCloseKey(hkey);  
    
    }
    
    else
    
    MessageBox("Es wurde kein Key exportiert!", "Reg Export"); 
    
    }
    

    Wenn ich also den Button anklicke und die Checkbox ist nicht aktiviert kommt eine Msgbox mit dem Hinweis "Es wurde kein Key exportiert!". Wenn aber die Checkbox aktiviert ist, dann wird der RegKey und deren SubKeys auch exportiert, allerdings in das Hauptverzeichnis des Programmes. Es sollte aber so sein, das ( da noch mehrere Checkboxen folgen ) für jede aktivierte Checkbox ein Ordner angelegt wird, wo dann auch der entsprechende RegKey und seine SubKeys drin abgelegt werden. Das ganze muss ich sehr wahrscheinlich mit einer Schleife lösen die um folgende Funktion programmiert wird:

    // Save registry subkey.  If the registry is remote, files will 
            // be saved on the remote machine 
            rc=RegSaveKey(hKeyToSave, szSaveFileName, NULL);
    

    Da in diesem Aufruf durch die Variable "szSaveFileName" das hinterlegen der RegKeys beeinflusst wird.

    Und darin liegt halt mein Problem.

    - Welche Schleife soll ich verwenden?
    - Wie soll ich das ganze angehen?

    Danke für Eure weitere Mithilfe!


Anmelden zum Antworten