VS2015中的CryptDestroyKey访问冲突异常

时间:2017-05-19 14:32:19

标签: c++ visual-studio-2010 visual-studio-2015 cryptography wincrypt

我正在开发一个C ++项目中的任务,用VS2010从构建中升级一些组件到用VS2015构建,并注意到一个我在网上找不到任何讨论的奇怪行为。简化代码如下:

#include "stdafx.h"

int main()
{
    HCRYPTPROV hCryptProv = NULL;    
    LPCTSTR UserName = L"MyKeyContainer"; 
    HCRYPTKEY hKey = NULL;

    bool result = CryptAcquireContext(&hCryptProv, UserName, NULL, PROV_RSA_FULL, 0);

    result = CryptGenKey(hCryptProv, CALG_RC4, 25 << 16, &hKey); // this line is meant to produce an invalid hKey.
    result = CryptDestroyKey(hKey);

    result = CryptReleaseContext(hCryptProv, 0);
    return 0;
}

和预编译的标题:

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <Wincrypt.h>

如果我尝试使用VS2010构建并运行此代码段,CryptGenKey将返回错误结果且hKey值为0。 将hKey传递给CryptDestroyKey会返回false,但不会抛出异常。

如果我尝试使用VS2015构建并运行此代码段,则CryptGenKey会返回错误结果且hKey值为0。 将hKey传递给CryptDestroyKey会引发访问冲突异常。

有人可以解释这个实现背后的原因以及为什么Windows在更新的VS版本中不会处理0?如果他们不自己管理0,这可能是其他项目的潜在问题。

0 个答案:

没有答案