Функция GrdLock блокирует выполнение операций с ключом для всех остальных хэндлов/приложений, работающих с этим же ключом на уровне драйвера. Функция используется в случаях, когда нужно выполнить пакет каких-либо операций, требующих синхронизации. Например обновление какой-либо ячейки памяти или для операций со счетчиками.
При выполнении блокирования ключа сначала проверяется, не заблокирован ли он из другого потока или приложения. Эта проверка также осуществляется данной функцией. В том случае, если ключ уже заблокирован, функция ожидает разблокирования ключа в течении таймаута dwTimeoutWaitForUnlock. Если в течении этого таймаута ключ остается заблокированным другим приложением, возвращается ошибка GrdE_DongleBusy.
При блокировании операций с ключом задается время dwTimeoutAutoUnlock, на которое выполняется блокировка. Пои истечении этого времени драйвер автоматически разблокирует ключ. Этот таймаут задается разработчиком приложения в зависимости от потребностей. Более длинные операции, такие как считывание и запись больших объемов данных из памяти ключа требуют больше времени, следовательно и таймаут в таких случаях нужно делать больше. Также можно не ограничивать интервал автоматического разблокирования ключа (dwTimeoutAutoUnlock = 0xFFFFFFFF). В таком случае блокировка может быть снята только функцией GrdUnlock. Это потенциально опасно тем, что при зависании приложения потребуется перезагрузка ОС для разблокирования ключа.
Операции Login, Check and Find заблокированы быть не могут.
На терминал-сервере работа с электронным ключом в разных сессиях идет через один драйвер ключа и соответственно блокировки должны работать так же.
Внимание!
Пара функций GrdLock и GrdUnlock не рассчитана на вызов из разных потоков. В этом случае, при вызове GrdUnlock из другого потока ключ не будет разблокирован (здесь можно провести аналогию с работой с критическими секциями).