01.09.2004 15:53:35ошибка ERROR_INVALID_PARAMETER при вызове CryptReleaseContext в Дельфи Ответов: 1
Владимир
Вопрос (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;
 
Ответы:
14.09.2004 16:29:20Василий
Но...
PROV_RSA_FULL = 1, а для нашего CSP ("Crypto-Pro Cryptographic Service Provider") значение типа должно быть 2.