| ||||
| ||||
Вопрос (WIN98+Delphi4): функция CryptAcquireContext создаёт новый контейнер для провайдера по умолчанию при вызове CryptAcquireContext(@hProv, cont, nil, PROV_RSA_FULL, CRYPT_NEWKEYSET),т.е. когда в качестве указателя на имя криптопровайдера указывается nil. Если в качестве указателя на имя криптопровайдера указывается переменная pszProvider, которой присваевается значение nil: CryptAcquireContext(@hProv, cont, pszProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET), то новый контейнер создаётся, но последующий вызов функции CryptReleaseContext(hProv, 0) даёт ошибку ERROR_INVALID_PARAMETER (при указании в качестве указателя на имя криптопровайдера значения nil ошибки нет) PS.Аналогичная ошибка при использовании конкретного провайдера: pszProvider:=’Crypto-Pro Cryptographic Service Provider’; HCRYPTPROV = cardinal; ... hProv: HCRYPTPROV; pszProvider :PAnsiChar; ... pszProvider:=nil; if CryptAcquireContext(@hProv, cont, pszProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET) then begin ... end; if not CryptReleaseContext(hProv, 0) then begin case int64(GetLastError) of ERROR_BUSY: err := ’ERROR_BUSY’; ERROR_INVALID_HANDLE: err := ’ERROR_INVALID_HANDLE’; ERROR_INVALID_PARAMETER: err := ’ERROR_INVALID_PARAMETER’; NTE_BAD_FLAGS: err := ’NTE_BAD_FLAGS’; NTE_BAD_UID: err := ’NTE_BAD_UID’; else err := ’Unknown error’; end; MessageDlg(’Не удалось освободить контекст: ’ + err, mtError, [mbOK], 0); end; | ||||
Ответы: | ||||
| ||||
Но... PROV_RSA_FULL = 1, а для нашего CSP ("Crypto-Pro Cryptographic Service Provider") значение типа должно быть 2. | ||||