Announcement

Collapse
No announcement yet.

Reg..SaveKey Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Reg..SaveKey Problem

    lesen, setzen etc kein problem, aber: <br>
    Der Key wird gefunden<br>
    Die Datei wird angelegt<br>
    und ist leer!

    kennt jemand das problem

    <PRE>
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    var
    Reg: TRegistry;
    begin
    Reg:=TRegistry.Create;
    try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.KeyExists('\Software\Borland\Delphi\7.0\Selbst definierte Farben') then ShowMessage('Key ok');
    // cave savekey öffnet mit Reg.Access:=KEY_ALL_ACCESS;
    if Reg.SaveKey('\Software\Borland\Delphi\7.0\Selbst definierte Farben','E:\Entwicklung\Projekte\RegTest\d7RegT.re g') then ShowMessage('done');
    finally
    Reg.Free;
    end;
    end;

    </PRE>

    danke,bernhard

  • #2
    Hallo,<br>gibt es unter dem Schlüssel "Selbst definierte Farben" überhaupt Werte?<br> Michae

    Comment


    • #3
      hallo michael <br>

      in jeder delphi-Version 16, denn das sind die Farben, die im deinem Color-Dialog erscheinen. Wenn keine definiert sind, steht da von ColorA bis BlahFasel = FFFFFFF<br>

      ich habe diese section gewählt, weil man beim testen darin den wenigsten schaden anrichtet ;-)<br>

      gruss, bernhar

      Comment


      • #4
        Hallo,<br>also, ich habe das mit Erfolg getestet:<br>Der Schlüssel heisst "Selbstdefinierte Farben"! In der Hilfe steht auch, dass bei FAT Dateisystemen die Dateierweiterung NICHT mitangegeben werden darf!<PRE>
        procedure TForm1.Button1Click(Sender: TObject);
        var
        Reg: TRegistry;
        begin
        Reg:=TRegistry.Create;
        try
        Reg.RootKey := HKEY_CURRENT_USER;
        if Reg.KeyExists('\Software\Borland\Delphi\5.0\Selbst definierte Farben') then ShowMessage('Key ok');
        // cave savekey öffnet mit Reg.Access:=KEY_ALL_ACCESS;
        if Reg.SaveKey('\Software\Borland\Delphi\5.0\Selbstde finierte Farben\','c:\test') then ShowMessage('done');
        finally
        Reg.Free;
        end;
        end;
        </PRE>
        <br>cu Michae

        Comment


        • #5
          Das Probelm lässt sich lokalisieren, aber nicht lösen !

          <PRE>
          procedure TForm1.SpeedButton2Click(Sender: TObject);
          var
          Reg: TRegistry;
          SaveKey : HKEY;
          FAccess: LongWord;
          begin
          Reg:= TRegistry.Create;
          try
          Reg.RootKey := HKEY_CURRENT_USER;
          if Reg.KeyExists('\Software\Borland') then ShowMessage('Key ok');
          // API
          FAccess:= KEY_ALL_ACCESS;
          // Wie bekomme ich jetzt das Recht SE_BACKUP_NAME zugetielt ?
          RegOpenKeyEx(HKEY_CURRENT_USER, pAnsiChar('\Software\Borland'),0,FAcess,SaveKey);
          // Hier ist das Problem: SaveKey = 0
          RegSaveKey(SaveKey,pChar('E:\Entwicklung\Projekte\ RegistryPro\d7RegT.reg'),nil);
          RegCloseKey(SaveKey);

          finally
          Reg.Free;
          end;
          end;
          </PRE>

          Vielleicht kann ein C-Spezialist helfen?

          gruss
          bernhar

          Comment


          • #6
            Der Versuch schlägt auch auf der API-Ebene fehl, weil ein Zugriffsrecht fehlt.

            Wie kann ich SE_BACKUP_NAME oder REG_OPTION_BACKUP_RESTORE in den Privileges setzen.

            Delphi kennt die beiden Konstanten nicht.
            <PRE>
            OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_ PRIVILEGES,hToken);
            fbGetComputerName(sComp);
            LookupPrivilegeValue(pChar(sComp),REG_OPTION_BACKU P_RESTORE , luid))
            //REG_OPTION_BACKUP_RESTORE, SE_BACKUP_NAME nicht bekannt - kennt jemand die absoluten Werte?
            tp.PrivilegeCount := 1;
            tp.Privileges[0].Luid := luid;
            tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
            AdjustTokenPrivileges(hToken, FALSE, tp, sizeof(TOKEN_PRIVILEGES),nil,k);

            </PRE>

            kann mir jemand sagen, ob der ansatz zumindest stimmt

            gruss
            bernhar

            Comment


            • #7
              Hallo,<br>
              Private Const REG_OPTION_BACKUP_RESTORE = 4<br>
              Habe aber noch was anderes gefunden:<br><PRE>
              function SetPrivilege(Privilege: PChar; EnablePrivilege: Boolean;
              out PreviousState: Boolean): DWORD;
              var
              Token: THandle;
              NewState: TTokenPrivileges;
              Luid: TLargeInteger;
              PrevState: TTokenPrivileges;
              Return: DWORD;
              begin
              PreviousState := True;
              if (GetVersion() > $80000000) then
              // Win9x
              Result := ERROR_SUCCESS
              else
              begin
              // WinNT
              if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
              Result := GetLastError()
              else
              try
              if not LookupPrivilegeValue(nil, Privilege, Luid) then
              Result := GetLastError()
              else
              begin
              NewState.PrivilegeCount := 1;
              NewState.Privileges[0].Luid := Luid;
              if EnablePrivilege then
              NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
              else
              NewState.Privileges[0].Attributes := 0;
              if not AdjustTokenPrivileges(Token, False, NewState,
              SizeOf(TTokenPrivileges), PrevState, Return) then
              Result := GetLastError()
              else
              begin
              Result := ERROR_SUCCESS;
              PreviousState :=
              (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
              end;
              end;
              finally
              CloseHandle(Token);
              end;
              end;
              end;

              function RegSaveKeyToFile(Key: HKEY; const SubKey, FileName: string): DWORD;
              const
              SE_BACKUP_NAME = 'SeBackupPrivilege';
              var
              PreviousState: Boolean;
              KeyHandle: HKEY;
              begin
              Result := SetPrivilege(SE_BACKUP_NAME, True, PreviousState);
              if (Result = ERROR_SUCCESS) then
              try
              KeyHandle := 0;
              Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
              if (Result = ERROR_SUCCESS) then
              try
              // FIXME: Short Filename on Win9x!
              Result := RegSaveKey(KeyHandle, PChar(FileName), nil);
              finally
              RegCloseKey(KeyHandle);
              end;
              finally
              if (not PreviousState) then
              SetPrivilege(SE_BACKUP_NAME, PreviousState, PreviousState);
              end;
              end;

              function RegLoadKeyFromFile(Key: HKEY; const SubKey, Filename: string): DWORD;
              const
              SE_BACKUP_NAME = 'SeBackupPrivilege';
              SE_RESTORE_NAME = 'SeRestorePrivilege';
              var
              PrevBackup: Boolean;
              PrevRestore: Boolean;
              KeyHandle: HKEY;
              ShortName: array [0..MAX_PATH] of Char;
              begin
              Result := SetPrivilege(SE_BACKUP_NAME, True, PrevBackup);
              if (Result = ERROR_SUCCESS) then
              try
              Result := SetPrivilege(SE_RESTORE_NAME, True, PrevRestore);
              if (Result = ERROR_SUCCESS) then
              try
              if (GetVersion() > $80000000) then
              begin // Win9x (FIXME: Test it! - and see RegReplaceKey)
              if (GetShortPathName(PChar(Filename), ShortName, MAX_PATH) = 0) then
              Result := GetLastError()
              else
              Result := RegLoadKey(Key, PChar(SubKey), ShortName);
              end
              else
              begin // WinNT (FIXME: Load RegRestoreKey dynamically!)
              KeyHandle := 0;
              Result := RegOpenKeyEx(Key, PChar(SubKey), 0, MAXIMUM_ALLOWED, KeyHandle);
              if (Result = ERROR_SUCCESS) then
              try
              Result := RegRestoreKey(KeyHandle, PChar(Filename), 0);
              finally
              RegCloseKey(KeyHandle);
              end;
              end;
              finally
              if (not PrevRestore) then
              SetPrivilege(SE_RESTORE_NAME, PrevRestore, PrevRestore);
              end;
              finally
              if (not PrevBackup) then
              SetPrivilege(SE_BACKUP_NAME, PrevBackup, PrevBackup);
              end;
              end;
              procedure TForm1.Button1Click(Sender: TObject);
              const
              Key = HKEY(HKEY_LOCAL_MACHINE);
              SubKey = 'SOFTWARE\Borland\Locales';
              var
              Filename: string;
              ErrorCode: DWORD;
              begin
              SetLength(Filename, MAX_PATH + 1);
              SetLength(Filename, GetTempPath(MAX_PATH, PChar(Filename)));
              Filename := Filename + 'Locales.dat';
              ErrorCode := RegSaveKeyToFile(Key, SubKey, Filename);
              if (ErrorCode <> ERROR_SUCCESS) then
              ShowMessage('Save: ' + SysErrorMessage(ErrorCode))
              else
              begin
              ErrorCode := RegLoadKeyFromFile(Key, SubKey, Filename);
              if (ErrorCode <> ERROR_SUCCESS) then
              ShowMessage('Load: ' + SysErrorMessage(ErrorCode))
              else
              ShowMessage(IntToStr(42));
              end;
              //DeleteFile(Filename);
              end;
              Quelle: http://www.luckie-online.de/Delphi/Sonstiges/Reg_Load_Save_Key.html
              </PRE><br>Michae

              Comment


              • #8
                Danke <br>
                Mann, ich war schon sowas von genervt!<br>
                Dann mach ich mich mal ans probieren.<br>
                gruss bernhar

                Comment


                • #9
                  Es funktioniert einwandfrei.<br>
                  Allerdings habe ich das letzte Sicherheits-Update von XP nochnicht auf die Entwicklungs-Maschine eingespielt. Wer weiss...?<br>
                  42 ist ja auch klasse, das erinnert mich dann gleich immer an die PARTY (buch3?)<br>
                  es fällt immer wieder auf, dass an einigen enden delphi klemmt. naja, muss man wohl mit leben.<br>
                  ich hatte auch schon gegoogelt, aber leider nicht so erfolgreich. Also: nochmal vielen Dank<br>
                  gruss,bernhar

                  Comment


                  • #10
                    Hi Bernhard,<br>es fängt immer einfach an...<br>Um mit das mit einem Buchtitel von Herrn Kosch zu beschreiben: "Delphi 2.0 Lösungen", wobei ich bei Delphi6 bin und immer noch nach einigen Lösungen suche... :-)<br>Michae

                    Comment

                    Working...
                    X