13 Windows Registry
(require file/resource) | package: base |
procedure
(get-resource section entry [ value-box file #:type type]) → (or/c #f string? bytes? exact-integer? #t) section : string? entry : string?
value-box : (or/c #f (box/c (or/c string? bytes? exact-integer?))) = #f file : (or/c #f path-string?) = #f
type : (or/c 'string 'string/utf-16 'bytes 'bytes* 'integer) = derived-from-value-box
The resource value is keyed on the combination of section and entry. The result is #f if no value is found for the specified section and entry. If value-box is a box, then the result is #t if a value is found, and the box is filled with the value; when value-box is #f, the result is the found value.
Registry values of any format can be extracted. A combination of the type argument and the type of the resource determines how the resource is initially converted to a Racket value:
A REG_SZ registry value’s bytes are first converted to a string by a nul-terminated UTF-16 interpretation (not including the terminator in the string)—
unless type is 'bytes*, in which case the bytes are kept as-is in a byte string. A REG_DWORD registry value’s bytes are first interpreted as a 32-bit signed integer, and then the integer is converted to a string with number->string.
Any other kind of register value’s bytes are kept as a byte string.
That initial conversion produces either a string or a byte string. The requested type might then trigger an additional transformation:
'string: a string is kept as-is, but a byte string are converted to a string using bytes->string/utf-8. Note that a UTF-8 conversion is not appropriate for some resource types, such as REG_EXPAND_SZ; use 'string/utf-16, instead.
'string/utf-16: a string is kept as-is, but a byte string is converted to a string by a nul-terminated UTF-16 interpretation (omitting the nul terminator from the string).
'bytes: a byte string is kept as-is, but a string is converted using string->bytes/utf-8. Note that this conversion does not produce the original bytes for a REG_SZ resource; use 'bytes*, instead, since that avoids the initial conversion to a string.
'bytes*: the same as 'bytes, but 'bytes* affects the initial conversion for a REG_SZ resource.
'integer: a string is converted to a number using string->number, and a byte string is converted by composing bytes->string/utf-8 with string->number.
If value-box is a box, then the default type is derived from the initial box content: 'string, 'bytes, or 'integer. Otherwise, the default type is 'string.
Resources from ".ini" files are always strings, and are converted like REG_SZ registry values.
To get the “default” value for a registry entry, use a trailing backslash. For example, the following expression gets a command line for starting a browser:
(get-resource "HKEY_CLASSES_ROOT" "htmlfile\\shell\\open\\command\\")
Changed in version 8.0.0.10 of package base: Added 'sting/utf-16 and 'bytes* options for type.
procedure
(write-resource section entry value [ file #:type type #:create-key? create-key?]) → boolean? section : string? entry : string? value : (or/c string? bytes? exact-integer?) file : (or/c path-string? #f) = #f
type :
(or/c 'string 'expand-string 'bytes 'dword 'bytes/string 'bytes/expand-string) = 'string create-key? : any/c = #f
The resource value is keyed on the combination of section and entry. If create-key? is false when writing to the registry, the resource entry must already exist, otherwise the write fails. If writing to the registry fails (due to a permissions issue or when the entry does not exist and create-key? is false), then (build-path (find-system-path 'home-dir) "mred.ini") is written to instead. The result is #f if the ".ini" write fails or #t if either the registry write or the ".ini" write succeeds.
The type argument determines both the format of the value written to the registry and its conversion of the to bytes:
'string: writes as REG_SZ, where a string value is converted to UTF-16 bytes adding a nul terminator. A byte string value is converted first with bytes->string/utf-8, and an integer value is first converted with number->string, and then the result in each case is treated like a string. Note that 'string is unlikely to be a useful conversion for a byte string value; use 'bytes/string, instead.
'expand-string: like 'string, but written as REG_EXPAND_SZ. Note that 'expand-string is unlikely to be a useful conversion for a byte string value; use 'bytes/expand-string, instead.
'bytes: REG_BINARY, where a byte string value is written as-is, a string value is converted to bytes by string->bytes/utf-8, and an integer value is converted to bytes by composing number->string with string->bytes/utf-8.
'bytes/string: writes as REG_SZ, where a byte string value is written as-is (unlike 'string, so the byte string must be a UTF-16 encoding with a nul terminator), a string value is converted to UTF-16 bytes adding a nul terminator, and an integer value is converted to a string with number->string and then to UTF-16 bytes adding a nul terminator.
'bytes/expand-string: like 'bytes/string, but writes as REG_EXPAND_SZ.
'dword: writes as REG_DWORD, where an integer value is converted to 32-bit signed integer bytes, a string value is converted with string->number and then the same as an integer, and a byte string value is converted by composing bytes->string/utf-8 with string->number and then the same as an integer.
When writing to an ".ini" file, the format is always a string, independent of type.
Changed in version 8.0.0.10 of package base: Added 'expand-string, 'bytes/string, and 'bytes/expand-string options for type.