共用方式為


RegQueryValueExA 函式 (winreg.h)

擷取與開啟登錄機碼相關聯之指定值名稱的類型和數據。

警告

如果查詢的值是字串(REG_SZ、REG_MULTI_SZ和REG_EXPAND_SZ),則傳回的值不保證會以 null 終止。 如果您想要確保傳回的字串值以 null 終止,請使用 RegGetValue 函式。 如需詳細資訊,請於下方的備註中取得。

語法

LSTATUS RegQueryValueExA(
  [in]                HKEY    hKey,
  [in, optional]      LPCSTR  lpValueName,
                      LPDWORD lpReserved,
  [out, optional]     LPDWORD lpType,
  [out, optional]     LPBYTE  lpData,
  [in, out, optional] LPDWORD lpcbData
);

參數

[in] hKey

開啟登錄機碼的句柄。 金鑰必須使用KEY_QUERY_VALUE訪問許可權開啟。 如需詳細資訊,請參閱 登入機碼安全性和存取權限

此句柄是由 RegCreateKeyExRegCreateKeyTransactedRegOpenKeyExRegOpenKeyTransacted 函式所傳回。 它也可以是下列其中一個 預先定義的索引鍵

HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_PERFORMANCE_DATA
HKEY_PERFORMANCE_NLSTEXT
HKEY_PERFORMANCE_TEXT
HKEY_USERS

[in, optional] lpValueName

登錄值的名稱。

如果 lpValueNameNULL 或空字串 “”,則函式會擷取索引鍵未命名或預設值的類型和數據,如果有的話。

如果 lpValueName 指定不在登錄中的值,函式會傳回ERROR_FILE_NOT_FOUND。

索引鍵不會自動有未命名或預設值。 未命名的值可以是任何類型。 如需詳細資訊,請參閱登錄專案大小限制。

lpReserved

此參數是保留的,而且必須 NULL

[out, optional] lpType

接收程式代碼的變數指標,指出儲存在指定值中的數據類型。 如需可能的型別代碼清單,請參閱 登錄實值型別。 如果不需要類型程式代碼,lpType 參數可以 NULL

[out, optional] lpData

接收值數據之緩衝區的指標。 如果不需要數據,此參數可以 NULL

[in, out, optional] lpcbData

變數的指標,指定 lpData 參數所指向的緩衝區大小,以位元組為單位。 當函式傳回時,此變數會包含複製到 lpData的數據大小。

只有當 lpData 為 NULL時,才能 l l 參數 NULL。

如果數據具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ類型,則此大小會包含任何終止 null 字元或字元,除非數據沒有儲存。 如需詳細資訊,請參閱。

如果 lpData 參數所指定的緩衝區不夠大,無法保存數據,函式會傳回ERROR_MORE_DATA,並將所需的緩衝區大小儲存在 l所指向的變數中。 在此情況下,未定義 lpData 緩衝區的內容。

如果 lpData 為 NULL,且 l lusbData 為非NULL,則函式會傳回ERROR_SUCCESS,並以位元組為單位儲存 l所指向之變數中的數據大小。 這可讓應用程式判斷為值數據配置緩衝區的最佳方式。

如果 hKey 指定 HKEY_PERFORMANCE_DATA,且 lpData 緩衝區不夠大,無法包含所有傳回的數據,RegQueryValueEx 會傳回 ERROR_MORE_DATA,而且未定義透過 lhsData 參數傳回的值。 這是因為效能數據的大小可能會從一個呼叫變更為下一個。 在此情況下,您必須增加緩衝區大小,並再次呼叫 RegQueryValueEx,再傳遞 lwindowsData 參數中的更新緩衝區大小。 重複此動作,直到函式成功為止。 您必須維護個別的變數來追蹤緩衝區大小,因為 l 傳回的值是無法預測的。

如果 lpValueName 登錄值不存在,RegQueryValueEx 會傳回ERROR_FILE_NOT_FOUND,而且未定義透過 l l 參數傳回的值。

傳回值

如果函式成功,則傳回值會ERROR_SUCCESS。

如果函式失敗,傳回值是 系統錯誤碼

如果 lpData 緩衝區太小而無法接收數據,函式會傳回ERROR_MORE_DATA。

如果 lpValueName 登錄值不存在,函式會傳回ERROR_FILE_NOT_FOUND。

言論

應用程式通常會呼叫 RegEnumValue 來判斷值名稱,然後 RegQueryValueEx 擷取名稱的數據。

如果數據具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ類型,則字元串可能尚未以適當的終止 null 字元儲存。 因此,即使函式傳回ERROR_SUCCESS,應用程式也應該確保字串在使用之前已正確終止;否則,它可能會覆寫緩衝區。 (請注意,REG_MULTI_SZ字串應該有兩個終止 null 個字元。應用程式可確保字串已正確終止的其中一種方式,就是使用 RegGetValue,以視需要新增終止 null 字元。

如果數據具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ型別,而且會使用此函式的 ANSI 版本(無論是明確呼叫 RegQueryValueExA,或是在包含 Windows.h 檔案之前未定義 UNICODE,此函式會將預存的 Unicode 字符串轉換為 ANSI 字串,然後再將它複製到 lpData所指向的緩衝區。

呼叫 RegQueryValueEx 函式時,hKey 設定為 HKEY_PERFORMANCE_DATA 句柄和指定物件的值字串時,傳回的數據結構有時會有未查詢的物件。 不要感到驚訝:這是一般行為。 呼叫 RegQueryValueEx 函式時,您應該一律預期會逐步執行傳回的數據結構來尋找要求的物件。

請注意,會重新導向存取特定登錄機碼的作業。 如需詳細資訊,請參閱登錄 登錄虛擬化32 位和 64 位應用程式資料

例子

請確定您每次呼叫此函式時,都會重新初始化 lーData 參數所指向的值。 當您在迴圈中呼叫此函式時,這非常重要,如下列程式代碼範例所示。

#include <windows.h>
#include <malloc.h>
#include <stdio.h>

#define TOTALBYTES    8192
#define BYTEINCREMENT 4096

void main()
{
    DWORD BufferSize = TOTALBYTES;
    DWORD cbData;
    DWORD dwRet;

    PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
    cbData = BufferSize;

    printf("\nRetrieving the data...");

    dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                             TEXT("Global"),
                             NULL,
                             NULL,
                             (LPBYTE) PerfData,
                             &cbData );
    while( dwRet == ERROR_MORE_DATA )
    {
        // Get a buffer that is big enough.

        BufferSize += BYTEINCREMENT;
        PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
        cbData = BufferSize;

        printf(".");
        dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                         TEXT("Global"),
                         NULL,
                         NULL,
                         (LPBYTE) PerfData,
                         &cbData );
    }
    if( dwRet == ERROR_SUCCESS )
        printf("\n\nFinal buffer size is %d\n", BufferSize);
    else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
}

注意

winreg.h 標頭會將 RegQueryValueEx 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的 慣例。

要求

要求 價值
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
支援的最低伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平臺 窗戶
標頭 winreg.h (包括 Windows.h)
連結庫 Advapi32.lib
DLL Advapi32.dll

另請參閱

ExpandEnvironmentStrings

RegCreateKeyEx

RegEnumKeyEx

RegEnumValue

RegGetValue

RegOpenKeyEx

RegQueryInfoKey

登錄函式

登錄概觀