CryptEnumProviderTypesA 函式 (wincrypt.h)

重要 此 API 已被取代。 新的和現有的軟體應該開始使用 密碼編譯新一代 API。 Microsoft 可能會在未來的版本中移除此 API。
 
CryptEnumProviderTypes 函式會擷取計算機上支援的第一種或下一種類型的密碼編譯服務提供者) (CSP。 在迴圈中使用,此函式會依序擷取計算機上所有可用的 CSP 類型。

提供者類型包括PROV_RSA_FULL、PROV_RSA_SCHANNEL和PROV_DSS。

語法

BOOL CryptEnumProviderTypesA(
  [in]      DWORD dwIndex,
  [in]      DWORD *pdwReserved,
  [in]      DWORD dwFlags,
  [out]     DWORD *pdwProvType,
  [out]     LPSTR szTypeName,
  [in, out] DWORD *pcbTypeName
);

參數

[in] dwIndex

要列舉之下一個提供者類型的索引。

[in] pdwReserved

保留供日後使用,且必須為 NULL

[in] dwFlags

保留供日後使用,且必須為零。

[out] pdwProvType

指定列舉提供者類型的 DWORD 值位址。

[out] szTypeName

從列舉提供者類型接收數據的緩衝區指標。 這是包含終止 NULL 字元的字串。 某些提供者類型沒有顯示名稱,在此情況下不會傳回任何名稱,而 由其指向的傳 回值是零。

此參數可以是 NULL ,可取得記憶體配置用途的名稱大小。 如需詳細資訊,請參閱 擷取未知長度的數據

[in, out] pcbTypeName

DWORD 值的指標,指定 pszTypeName 參數所指向緩衝區的大小,以位元組為單位。 當函式傳回時, DWORD 值會包含儲存或儲存在緩衝區中的位元元組數目。 某些提供者類型沒有顯示名稱,在此情況下不會傳回任何名稱,而 由其指向的傳 回值是零。

注意 處理緩衝區中傳回的數據時,應用程式必須使用傳回的數據實際大小。 實際大小可能會稍微小於輸入中指定的緩衝區大小。 (輸入時,通常會指定足夠的緩衝區大小,以確保最大的可能輸出數據符合 buffer。) On 輸出中,此參數所指向的變數會更新,以反映複製到緩衝區的實際數據大小。
 

傳回值

如果函式成功,傳回值為非零 (TRUE) 。

如果函式失敗,傳回值為零, (FALSE) 。 如需擴充的錯誤資訊,請呼叫 GetLastError

NTE 開頭的錯誤碼是由所使用的特定 CSP 所產生。 接下來有一些可能的錯誤碼。

傳回碼 Description
ERROR_NO_MORE_ITEMS
沒有其他要列舉的專案。
ERROR_NOT_ENOUGH_MEMORY
操作系統記憶體不足。
NTE_BAD_FLAGS
dwFlags 參數具有無法辨識的值。
NTE_FAIL
類型註冊發生錯誤。

備註

此函式會列舉計算機上可用的提供者類型。 您可以使用 CryptEnumProviders 列舉任何特定提供者類型的提供者。

範例

下列範例顯示迴圈,其中列出所有可用的密碼編譯服務提供者類型。

#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#pragma comment(lib, "advapi32.lib")

void main()
{
    
    // Copyright (C) Microsoft.  All rights reserved.
    // Declare and initialize variables.

    DWORD       dwIndex;
    DWORD       dwType;
    DWORD       cbName;
    LPTSTR      pszName;

    //--------------------------------------------------------------
    //   Print header lines for provider types.

    printf("Listing Available Provider Types:\n");
    printf("Provider type\tProvider Type Name\n");
    printf("_____________\t_____________________________________\n");

    // Loop through enumerating provider types.
    dwIndex = 0;
    while(CryptEnumProviderTypes(
           dwIndex,
           NULL,
           0,
           &dwType,
           NULL,
           &cbName
           ))
    {

        //-----------------------------------------------------------
        //  cbName returns the length of the name of the next
        //  provider type. Allocate memory in a buffer to retrieve
        //  that name.
        if (!(pszName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cbName)))
        {
           printf("ERROR - LocalAlloc failed.\n");
           exit(1);
        }
        //-----------------------------------------------------------
        //  Get the provider type name.

        if (CryptEnumProviderTypes(
               dwIndex++,
               NULL,
               NULL,
               &dwType,   
               pszName,
               &cbName))     
        {
            printf ("     %4.0d\t%s\n",dwType, pszName);
        }
        else
        {
            printf("ERROR - CryptEnumProviderTypes\n");
            exit(1);
        }
        LocalFree(pszName);
    } // End of while loop.
}

如需使用 CryptEnumProviderTypes 函 式的另一個範例,請參閱 範例 C 程式:列舉 CSP 提供者和提供者類型

注意

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

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限桌面應用程式]
目標平台 Windows
標頭 wincrypt.h
程式庫 Advapi32.lib
Dll Advapi32.dll

另請參閱

CryptEnumProviders

服務提供者函式