windows - Skal jeg opsige en tom REG\_SZ-værdi med en 0-byte?

Indlæg af Hanne Mølgaard Plasc

Problem



så vidt jeg kender strenge (REG\_SZ), der er oprettet i Windows-registreringsdatabasen, skal termineres med en 0-byte.
Men hvad sker der, hvis du vil oprette programmatisk en registreringsværdi uden indhold?


a) altid opsige med 0-byte (betyder ikke noget om registreringsværdien har indhold eller ej)


b) Afslut kun med 0-Byte, hvis der er indhold


Tak!

Bedste reference


Du skal altid opsige værdien med et nul tegn . Hvis der ikke er noget indhold, bliver værdien den ene null karakter og intet andet.


Bemærk, at et tegn er enten en eller to byte lang, afhængigt af om du bruger ANSI- eller Unicode-API'erne.


Opdatering: Dokumentationen for RegSetValueEx angiver den sidste parameter: [9]



  Størrelsen af ​​de oplysninger, der peges på af lpData-parameteren, i
  byte. Hvis dataene er af typen REG\_SZ, REG\_EXPAND\_SZ eller REG\_MULTI\_SZ,
  cbData skal indeholde størrelsen af ​​det afsluttende null tegn eller
  tegn.



Registret værdi typer referencer siger også: [10]



  Strengværdier

  
  Hvis data har REG\_SZ-, REG\_MULTI\_SZ- eller REG\_EXPAND\_SZ-typen,
  Strengen er muligvis ikke blevet gemt med den korrekte terminerende null
  tegn. Derfor, når du læser en streng fra registreringsdatabasen, er du
  skal sikre, at strengen er korrekt afbrudt, før den bruges
  Ellers kan det overskrive en buffer. (Bemærk at REG\_MULTI\_SZ strenge
  bør have to afsluttende null tegn.)

  
  Når du skriver en streng til registreringsdatabasen, skal du angive længden af
  strengen, herunder den afsluttende null karakter (\ 0). En fælles
  Fejl er at bruge strlen-funktionen til at bestemme længden af
  streng, men at glemme, at strlen kun returnerer antallet af
  tegn i strengen, ikke inklusive den afsluttende null.
  Derfor bør længden af ​​strengen beregnes som følger:
  strlen (streng) + 1



Nu er alt dette ikke så klart, som det kunne være, men det er velkendt, at en nullterminator i Unicode-strenge faktisk er to byte (som alle andre Unicode-tegn i BMP).

Andre referencer 1


Det er ikke klart, hvad du mener med 'intet indhold'. Registry værdier har altid indhold, hvis de overhovedet eksisterer.


Hvis du vil have en forespørgsel om, at værdien skal mislykkes, skal du ikke lave den med REG\_SZ. I stedet skal du bare lave det.


Hvis du vil have en forespørgsel om værdien for at returnere en tom streng, skal du oprette som REG\_SZ med en null byte (hvis ANSI) eller to null bytes (hvis UNICODE).

Andre referencer 2


Mens reglen er at bruge a) - fra min erfaring vil både a) og b) faktisk fungere.


Ved at bruge et værktøj som RegScanner kan du søge efter alle REG\_SZ poster med en længde 'fra 0 bytes til 1 bytes'. [11]


Når du gør dette, vil du faktisk se, at mest poster er af 1 byte længde (dvs. de er tomme strenge, afsluttet med en null).


På min pc er der 75322 'tomme' REG\_SZ indgange i alt, og af disse er 74860 indgange 1-byte.


462 af posterne er imidlertid 0 byte i størrelse, hvilket betyder at de ikke er ikke nullterminerede, de er bare ... .. som i helt tomme.


De fleste af disse '0 byte' poster hører til nogle få programmer.


For det første er der nogle tredjepartsprogrammer, der faktisk har oprettet REG\_SZ poster (med navne), det er bare, at de slet ikke indeholder noget.


ACD Systems - ACDSee Pro 5 , 169 poster:


    [HKLMSOFTWAREClasses.***OpenWithProgids]
    "ACDSee Pro 5.***"=""


Disk Soft - Daemon Værktøjer , 20 indgange:


    [HKLMSOFTWAREWow6432NodeDisc SoftDAEMON Tools ProFileTypesSave.***]
    "Type"=""


PSP Audioware - PSP MultiInstaller , 105 poster:


    [HKCUSoftwarePSP-audiowarePSP\_*]
    "CurrBank"=""
    "CurrDir"=""
    "CurrPreset"=""


Men i Windows 7 (i det mindste SP1) er der også et par ikke-nullterminerede REG\_SZ strenge, men disse er de normale (standard) tomme.


Microsoft - Windows 7 SP1 AppEvents \ Schemes , 67 indgange:


    [HKCUAppEventsSchemesApps.**.None]
    @=""


Og også de .Current , som er tomme, har disse:


    [HKCUAppEventsSchemesApps.**.Current]
    @=""


Alle disse ikke-nulstillede REG\_SZ registreringsindstillinger synes at fungere .. .. selvom det ikke er så nemt at faktisk test dette, er de tomme og alle .. .. men i det mindste er der ingen fejlmeddelelser fra Windows eller nogen af ​​programmerne, når de krydser disse registreringsdatabaser.