CryptEnumProviderTypesW 函数 (wincrypt.h)

重要 此 API 已弃用。 新的和现有的软件应开始使用 加密下一代 API。 Microsoft 可能会在将来的版本中删除此 API。
 
CryptEnumProviderTypes 函数检索计算机上支持的第一种或下一种类型的加密服务提供程序 (CSP) 。 在循环中使用,此函数按顺序检索计算机上可用的所有 CSP 类型。

提供程序类型包括PROV_RSA_FULL、PROV_RSA_SCHANNEL和PROV_DSS。

语法

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

参数

[in] dwIndex

要枚举的下一个提供程序类型的索引。

[in] pdwReserved

保留以供将来使用,必须为 NULL

[in] dwFlags

保留以供将来使用,必须为零。

[out] pdwProvType

指定枚举提供程序类型的 DWORD 值的地址。

[out] szTypeName

指向从枚举提供程序类型接收数据的缓冲区的指针。 这是一个包含终止 NULL 字符的字符串。 某些提供程序类型没有显示名称,在本例中不返回名称, 且返回的由typeName 指向的值为零。

此参数可以为 NULL ,以获取名称的大小,以便进行内存分配。 有关详细信息,请参阅 检索未知长度的数据

[in, out] pcbTypeName

指向 DWORD 值的指针,该值指定 pszTypeName 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时, DWORD 值包含缓冲区中存储或要存储的字节数。 某些提供程序类型没有显示名称,在本例中不返回名称, 且返回的由typeName 指向的值为零。

注意 处理缓冲区中返回的数据时,应用程序必须使用返回的数据的实际大小。 实际大小可以略小于输入时指定的缓冲区的大小。 (输入时,缓冲区大小通常指定得足够大,以确保最大输出数据适合 buffer。) 输出时,此参数指向的变量将更新,以反映复制到缓冲区的数据的实际大小。
 

返回值

如果函数成功,则返回值为非零 (TRUE) 。

如果函数失败,则返回值为零 (FALSE) 。 有关扩展的错误信息,请调用 GetLastError

NTE 开头的错误代码由使用的特定 CSP 生成。 下面是一些可能的错误代码。

返回代码 说明
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 标头将 CryptEnumProviderTypes 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 wincrypt.h
Library Advapi32.lib
DLL Advapi32.dll

另请参阅

CryptEnumProviders

服务提供程序函数