Wie kann man ein Registryschlüssel speichern?

Zur Speicherung eines Registryschlüssels mittlels der Methode SaveKey müssen folgende Voraussetzungen erfüllt sein:

Das setzen der Rechte:

	TOKEN_PRIVILEGES tkp;
	HANDLE hToken;
	if (!OpenProcessToken (GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
		{
		ShowMessage ("OpenProcessToken geht nicht");
		return;
		}
	if(!LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges[0].Luid))
		{
		ShowMessage ("LookupPrivilegeValue geht nicht");
		return;
		}
	tkp.PrivilegeCount=1;
	tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES),NULL, NULL );
	if(GetLastError()!= ERROR_SUCCESS)
		{
		ShowMessage ("AdjustTokenPrivileges geht nicht");
		return;
		}

Den Schlüssel speichern:

TRegistry * reg = new TRegistry();
DeleteFile("test.sav"); //Eine bestehende Datei löschen!!!!
if (reg->SaveKey("Software\\Analyser","test.sav"))
	{
ShowMessage("Speicherung erfolgreich");
	}
else
	{
ShowMessage("Speicherung misslungen");
	}
delete reg; 

Zu beachten ist, dass SaveKey keine REG-Datei erzeugt. Vielmehr kann die erzeugte Datei dazu genutzt werden, Schlüssel in der Registrierung mit RestoreKey, ReplaceKey und LoadKey wieder herzustellen.
REG-Dateien werden von dem Editor der Registry (regedit) genutzt. Dieser verarbeitet REG-Dateien und die Dateiendung *.reg ist mit diesem Programm verbunden. Da nun der Editor mit der Registry an sich nichts zu tun hat, erzeugt SaveKey auch keine REG-Dateien

Und nun wie kommt man wieder ran

Zum einlesen des gespeicherten Schlüssel mittels RestoreKey müssen folgende Voraussetzungen erfüllt sein:

Das setzen der Rechte (Backup):

TOKEN_PRIVILEGES tkp;
HANDLE hToken;
if (!OpenProcessToken (GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
	{
	ShowMessage ("OpenProcessToken geht nicht");
	return;
	}
if(!LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges[0].Luid))
	{
	ShowMessage ("LookupPrivilegeValue geht nicht");
	return;
	}
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES),NULL, NULL );
if(GetLastError()!= ERROR_SUCCESS)
	{
	ShowMessage ("AdjustTokenPrivileges geht nicht");
	return;
	}

Das setzen der Rechte (Restore):

if (!OpenProcessToken (GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
	{
	ShowMessage ("OpenProcessToken geht nicht");
	return;
	}
if(!LookupPrivilegeValue(NULL,SE_RESTORE_NAME,&tkp.Privileges[0].Luid))
	{
	ShowMessage ("LookupPrivilegeValue geht nicht");
	return;
	}
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES),NULL, NULL );
if(GetLastError()!= ERROR_SUCCESS)
	{
	ShowMessage ("AdjustTokenPrivileges geht nicht");
	return;
	}

(Wer weiss, wie man das in einem Schritt macht -> bitte melden)

Eine Dateiauswahlbox anzeigen:

OpenDialog1->Title="Profil importieren";
OpenDialog1->FilterIndex=2;
OpenDialog1->FileName="";
if(!OpenDialog1->Execute())
	return;

Schlüssel öffnen, erzeugen und einlesen. Wobei der zu erzeugende Schlüssel der Dateiname ist. Aus diesem Grunde darf dieser auch nicht verändert werden.

TRegistry *reg = new TRegistry();
String htext=ExtractFileName(OpenDialog1->FileName);
reg->OpenKey("Software\\PocketFTP\\Profile\\",false);
reg->CreateKey(htext);
if (reg->RestoreKey(htext,OpenDialog1->FileName)==true)
	SetStatus("Import erfolgreich");
else
	SetStatus("Import misslungen");
delete reg;

Zur Übersicht