檢視原始碼 win32reg (stdlib v6.2)

提供對 Windows 登錄檔的存取。

此模組提供對 Windows 登錄檔的讀取和寫入存取。它本質上是一個圍繞 Win32 API 呼叫的埠驅動程式,用於存取登錄檔。

登錄檔是一個階層式資料庫,用於儲存 Windows 中各種系統和軟體資訊。它包含安裝資料,並由安裝程式和系統程式更新。Erlang 安裝程式會透過新增 Erlang 需要的資料來更新登錄檔。

登錄檔包含機碼和值。機碼就像檔案系統中的目錄一樣,它們形成一個階層。值就像檔案一樣,它們有名稱和值,還有一個類型。

機碼的路徑是從左到右,子機碼在右邊,機碼之間用反斜線分隔。(請記住,反斜線在 Erlang 字串中必須加倍。)大小寫會被保留,但不重要。

例如,"\\hkey_local_machine\\software\\Ericsson\\Erlang\\5.0" 是最新 Erlang 版本的安裝資料的機碼。

Windows 登錄檔中有六個進入點,即頂層機碼。它們可以在此模組中縮寫如下

Abbreviation     Registry key
============     ============
hkcr             HKEY_CLASSES_ROOT
current_user     HKEY_CURRENT_USER
hkcu             HKEY_CURRENT_USER
local_machine    HKEY_LOCAL_MACHINE
hklm             HKEY_LOCAL_MACHINE
users            HKEY_USERS
hku              HKEY_USERS
current_config   HKEY_CURRENT_CONFIG
hkcc             HKEY_CURRENT_CONFIG
dyn_data         HKEY_DYN_DATA
hkdd             HKEY_DYN_DATA

上面的機碼可以寫成 "\\hklm\\software\\ericsson\\erlang\\5.0"

此模組使用目前機碼。它的運作方式很像目前目錄。從目前機碼中,可以擷取值、列出子機碼等等。

在一個機碼下,可以儲存任意數量的命名值。它們有名稱、類型和資料。

win32reg 支援儲存以下類型

  • REG_DWORD,這是一個整數
  • REG_SZ,這是一個字串
  • REG_BINARY,這是一個二進位

其他類型可以讀取,並以二進位形式傳回。

還有一個「預設」值,其名稱為空字串。它使用原子 default 而不是名稱來讀寫。

一些登錄檔值以包含環境變數參照的字串形式儲存,例如 %SystemRoot%WindowsSystemRoot 是一個環境變數,將被其值取代。提供函式 expand/1,以便可以用它們的值展開以 % 包圍的環境變數。

有關 Windows 登錄檔的更多資訊,請參閱 Win32 程式設計人員參考。

另請參閱

erl_posix_msg、Windows 95 登錄檔 (O'Reilly 的書籍)、Win32 程式設計人員參考 (來自 Microsoft)

摘要

函式

將目前機碼變更為另一個機碼。運作方式類似於 cd。機碼可以指定為相對路徑或絕對路徑,以 \ 開頭。

建立一個機碼,或只是變更到它,如果它已經存在。運作方式類似於 mkdircd 的組合。呼叫 Win32 API 函式 RegCreateKeyEx()

關閉登錄檔。之後,RegHandle 無法使用。

傳回目前機碼的路徑。這相當於 pwd

刪除目前機碼,如果它有效。呼叫 Win32 API 函式 RegDeleteKey()。請注意,此呼叫不會變更目前機碼 (與 change_key_create/2 不同)。這表示在呼叫之後,目前機碼是無效的。

刪除目前機碼上的命名值。原子 default 用於預設值。

展開包含百分比字元之間環境變數的字串。兩個 % 之間的任何內容都被視為環境變數,並被該值取代。兩個連續的 % 被一個 % 取代。

透過呼叫 file:format_error/1,將 POSIX 錯誤代碼轉換為字串。

開啟登錄檔以進行讀取或寫入。目前機碼是根目錄 (HKEY_CLASSES_ROOT)。模式清單中的旗標 read 可以省略。

將命名 (或預設) 值設定為 value。呼叫 Win32 API 函式 RegSetValueEx()。值可以是三種類型,並使用對應的登錄檔類型。支援的類型如下

傳回目前機碼的子機碼清單。呼叫 Win32 API 函式 EnumRegKeysEx()

擷取目前機碼上的命名值 (或預設值)。類型為 REG_SZ 的登錄檔值以字串形式傳回。類型為 REG_DWORD 的值以整數形式傳回。所有其他類型都以二進位形式傳回。

擷取目前機碼上所有值的清單。這些值的類型與登錄檔類型相對應,請參閱 value/2。呼叫 Win32 API 函式 EnumRegValuesEx()

類型

-type name() :: string() | default.
-opaque reg_handle()

open/1 傳回。

-type value() :: string() | integer() | binary().

函式

連結到此函式

change_key(RegHandle, Key)

檢視原始碼
-spec change_key(RegHandle, Key) -> ReturnValue
                    when
                        RegHandle :: reg_handle(),
                        Key :: string(),
                        ReturnValue :: ok | {error, ErrorId :: atom()}.

將目前機碼變更為另一個機碼。運作方式類似於 cd。機碼可以指定為相對路徑或絕對路徑,以 \ 開頭。

連結到此函式

change_key_create(RegHandle, Key)

檢視原始碼
-spec change_key_create(RegHandle, Key) -> ReturnValue
                           when
                               RegHandle :: reg_handle(),
                               Key :: string(),
                               ReturnValue :: ok | {error, ErrorId :: atom()}.

建立一個機碼,或只是變更到它,如果它已經存在。運作方式類似於 mkdircd 的組合。呼叫 Win32 API 函式 RegCreateKeyEx()

登錄檔必須已在寫入模式下開啟。

-spec close(RegHandle) -> ok when RegHandle :: reg_handle().

關閉登錄檔。之後,RegHandle 無法使用。

連結到此函式

current_key(RegHandle)

檢視原始碼
-spec current_key(RegHandle) -> ReturnValue
                     when RegHandle :: reg_handle(), ReturnValue :: {ok, string()}.

傳回目前機碼的路徑。這相當於 pwd

請注意,目前機碼儲存在驅動程式中,並且可能是無效的 (例如,如果機碼已被移除)。

-spec delete_key(RegHandle) -> ReturnValue
                    when RegHandle :: reg_handle(), ReturnValue :: ok | {error, ErrorId :: atom()}.

刪除目前機碼,如果它有效。呼叫 Win32 API 函式 RegDeleteKey()。請注意,此呼叫不會變更目前機碼 (與 change_key_create/2 不同)。這表示在呼叫之後,目前機碼是無效的。

連結到此函式

delete_value(RegHandle, Name)

檢視原始碼
-spec delete_value(RegHandle, Name) -> ReturnValue
                      when
                          RegHandle :: reg_handle(),
                          Name :: name(),
                          ReturnValue :: ok | {error, ErrorId :: atom()}.

刪除目前機碼上的命名值。原子 default 用於預設值。

登錄檔必須已在寫入模式下開啟。

-spec expand(String) -> ExpandedString when String :: string(), ExpandedString :: string().

展開包含百分比字元之間環境變數的字串。兩個 % 之間的任何內容都被視為環境變數,並被該值取代。兩個連續的 % 被一個 % 取代。

不在環境中的變數名稱會導致錯誤。

-spec format_error(ErrorId) -> ErrorString when ErrorId :: atom(), ErrorString :: string().

透過呼叫 file:format_error/1,將 POSIX 錯誤代碼轉換為字串。

-spec open(OpenModeList) -> ReturnValue
              when
                  OpenModeList :: [OpenMode],
                  OpenMode :: read | write,
                  ReturnValue :: {ok, RegHandle} | {error, ErrorId :: enotsup},
                  RegHandle :: reg_handle().

開啟登錄檔以進行讀取或寫入。目前機碼是根目錄 (HKEY_CLASSES_ROOT)。模式清單中的旗標 read 可以省略。

open 之後,使用帶有絕對路徑的 change_key/2

連結到此函式

set_value(RegHandle, Name, Value)

檢視原始碼
-spec set_value(RegHandle, Name, Value) -> ReturnValue
                   when
                       RegHandle :: reg_handle(),
                       Name :: name(),
                       Value :: value(),
                       ReturnValue :: ok | {error, ErrorId :: atom()}.

將命名 (或預設) 值設定為 value。呼叫 Win32 API 函式 RegSetValueEx()。值可以是三種類型,並使用對應的登錄檔類型。支援的類型如下

  • REG_DWORD 用於整數
  • REG_SZ 用於字串
  • REG_BINARY 用於二進位

其他類型無法新增或變更。

登錄檔必須已在寫入模式下開啟。

-spec sub_keys(RegHandle) -> ReturnValue
                  when
                      RegHandle :: reg_handle(),
                      ReturnValue :: {ok, [SubKey]} | {error, ErrorId :: atom()},
                      SubKey :: string().

傳回目前機碼的子機碼清單。呼叫 Win32 API 函式 EnumRegKeysEx()

避免在根機碼上呼叫此函式,因為它可能會很慢。

連結到此函式

value(RegHandle, Name)

檢視原始碼
-spec value(RegHandle, Name) -> ReturnValue
               when
                   RegHandle :: reg_handle(),
                   Name :: name(),
                   ReturnValue :: {ok, Value :: value()} | {error, ErrorId :: atom()}.

擷取目前機碼上的命名值 (或預設值)。類型為 REG_SZ 的登錄檔值以字串形式傳回。類型為 REG_DWORD 的值以整數形式傳回。所有其他類型都以二進位形式傳回。

-spec values(RegHandle) -> ReturnValue
                when
                    RegHandle :: reg_handle(),
                    ReturnValue :: {ok, [ValuePair]} | {error, ErrorId :: atom()},
                    ValuePair :: {Name :: name(), Value :: value()}.

擷取目前機碼上所有值的清單。這些值的類型與登錄檔類型相對應,請參閱 value/2。呼叫 Win32 API 函式 EnumRegValuesEx()