Toon posts:

[BCB5] SaveKey (TRegister) werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag mensen.

Ik ben een programmaatje aan het schrijven. Dit programma schrijft een aantal waarden in het register en leest ze later weer uit. Werkt allemaal naar behoren.

Nu zou het alleen wel fijn zijn als ik alle waardes uit het register in een file kan zetten om ze op een andere pc weer te openen. Na een kleine speurtocht ben ik erachter gekomen dat dit met SaveKey en RestoreKey kan.

Ik gebruik deze op de volgende manier:

C++:
1
2
3
4
5
6
7
8
void savereg (void)
{
  TRegistry *Reg = new TRegistry();
  Reg->RootKey = HKEY_LOCAL_MACHINE;
  Reg->OpenKey("Software",false);
  Reg->SaveKey("Test",("c:\\Test"));
  delete Reg;
}


Als ik deze functie uitvoer schrijft hij een bestand "Test" in de root van mijn c schijf, de inhoud van het bestand is echter 0.0 bytes. Nu geeft de functie SaveKey ook een false terug, hetgeen betekent dat hij niets heeft opgeslagen.

Wat doe ik fout?

In de key "Test" staat een string van een paar karakters en een value van het type bool.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Deze functie maakt geen .reg bestandjes, als je dat zou verwachten, maar binaire extracties ervan. Je hebt als extra het SE_BACKUP_NAME privilege hebben. Die kan je via code aan en uitzetten met de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
type
TfnOpenProcessToken = function (ProcessHandle: THandle; DesiredAccess: WORD;  var TokenHandle: THandle): BOOL; stdcall;

TfnLookupPrivilegeValue = function (lpSystemName, lpName: PChar; var lpLuid: TLargeInteger): BOOL; stdcall;

TfnAdjustTokenPrivileges = function (TokenHandle: THandle; DisableAllPrivileges: BOOL;
  const NewState: TTokenPrivileges; BufferLength: DWORD; var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall;

function EnableNTPrivilege (const privilege : string; state : Integer) : Integer;
var
  hToken : THandle;
  aluid : TLargeInteger;
  cbPrevTP : DWORD;
  tp, fPrevTP : PTokenPrivileges;
  version : TOsVersionInfo;

  fnOpenProcessToken : TfnOpenProcessToken;
  fnLookupPrivilegeValue : TfnLookupPrivilegeValue;
  fnAdjustTokenPrivileges : TfnAdjustTokenPrivileges;
  advapiHandle : THandle;

begin
  result := 0;
  version.dwOSVersionInfoSize := sizeof (version);
  if GetVersionEx (version) and (version.dwPlatformId = VER_PLATFORM_WIN32_NT) then
  begin
    advapiHandle := LoadLibrary (advapi32);
    if advapiHandle <> 0 then
    try
      fnOpenProcessToken := GetProcAddress (advapiHandle, 'OpenProcessToken');
      fnLookupPrivilegeValue := GetProcAddress (advapiHandle, 'LookupPrivilegeValueA');
      fnAdjustTokenPrivileges := GetProcAddress (advapiHandle, 'AdjustTokenPrivileges');

      if Assigned (fnOpenProcessToken) and Assigned (fnLookupPrivilegeValue) and Assigned (fnAdjustTokenPrivileges) then
        if fnOpenProcessToken (GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
        try
          fnLookupPrivilegeValue (Nil, PChar (privilege), aluid);

          cbPrevTP := SizeOf (TTokenPrivileges) + sizeof (TLUIDAndAttributes);

          GetMem (tp, cbPrevTP);
          GetMem (fPrevTP, cbPrevTP);
          try

            tp^.PrivilegeCount := 1;
            tp^.Privileges [0].Luid := aLuid;
            tp^.Privileges [0].Attributes := state;

            if not fnAdjustTokenPrivileges (hToken, False, tp^, cbPrevTP, fPrevTP^, cbPrevTP) then
              RaiseLastOSError;

            result := fPrevTP^.Privileges [0].Attributes;

          finally
           FreeMem (fPrevTP);
           FreeMem (tp);
          end
        finally
          CloseHandle (hToken);
        end
    finally
      FreeLibrary (advapiHandle)
    end
  end
end;

.... call it like this...

        oldState := EnableNTPrivilege (SE_BACKUP_NAME, SE_PRIVILEGE_ENABLED);
        try
          reg.SaveKey ('VgiInfo', 'C:\_weg2\TheGrids.reg') ;
        finally
          EnableNTPrivilege (SE_BACKUP_NAME, oldState)
        end;


Of je pakt TExRegistry van http://www.wilsonc.demon.co.uk/delphi.htm. Deze kan .REG compatible bestandjes maken.

PS: Als je het foutbericht bij de windows error zoekt moet je eens kijken naar de functie SysErrorMessage.

Bron: Een Usenet Posting door Colin Wilson

We adore chaos because we like to restore order - M.C. Escher