05.04.2006 19:08:08Это ваша ошибка?! Ответов: 5
ААА
Уважаемые разработчики (или их начальники)!
Вызываю функцию CryptAcquireContext() с нужным набором параметров, dwFlags = 0. Ваша система просит вставить носитель для ключей, ставлю чистую дискету. Вы пишете, что носитель пустой и... ничего. На диалоге одна кнопка - Отмена, ОК нет. Нажимаю ее - вы возвращаете FALSE, а GetLastError() выдает "Действие отменено пользователем". Далее - все, моя программа ничего не делает, а надо бы вызвать ту же функцию с dwFlags = CRYPT_NEWKEYSET. Видимо, ваша гениальная задумка состояла в том, чтобы самим опознать, что же находится на дискете и среагировать нужным образом, как будто нажат ОК. И почему же вы не вывалились из CryptAcquireContext, выставив флаг ошибки NTE_BAD_KEYSET??? Или хотя бы выставили его при нажатии Отмены, как делали в 1 версии.
 
Ответы:
06.04.2006 12:37:20Василий
По порядку. Флаг 0 означает, что контейнер должен существовать. Он может быть уже доступен (и тогда CSP его подхватит) либо подключен после вызова AcquireContext. Для второго предназначено окошко ожидания. Если Вы поменяете дискету (или др. носитель) на тот, где контейнер есть - то в нашем окошке появится кнопка Ок. Если у Вас нет этого контейнера - то только Отмена. Иначе быть не может, т.к., если дискета НЕ вставлена ДО вызова AcquireContext, то тогда CSP сразу вернёт ошибку и открыть контейнер уже не получится. А это явно не правильно.
06.04.2006 12:50:01ААА
Замечательно!
Как мне получить контейнер на чистой дискете? Как его инициализировать?
06.04.2006 12:53:06Василий
Так Вы же умеете - dwFlags = CRYPT_NEWKEYSET и т.д.
06.04.2006 13:25:56ААА
Да, умею. Напишите, плз., какова последовательность действий пользователя с чистой (!) дискетой, при которой CryptAcquireContext вернет FALSE, а GetLastError, вызванная сразу после этого, NTE_BAD_KEYSET. Именно так, согласно описаниям CryptoAPI Windows должен реагировать криптопровайдер на неправильный (в том числе пустой) ключевой контейнер.
06.04.2006 16:53:53Василий
Например CryptAcquireContext с флажком CRYPT_SILENT.