Я работаю над задачей в проекте 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 не будет обрабатывать 0 в более современной версии VS? Это может быть потенциальной проблемой для других проектов, если они сами не управляют нулем.
Задача ещё не решена.
Других решений пока нет …