0

我正在执行 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,这可能是其他项目的潜在问题。

4

0 回答 0