Правильная логика проверки наличия ключа
Ниже приведен кусок кода который следит за наличием ключа в слоте. Написано в соответствии с рекомендациями ваших собаководов. =) Однако бывает баг следующего генеза - если достать ключ, а затем снова вставить(не каждый раз, нужно повторять до потери пульса.). В итоге, в данном процессе ключ определится, вся информация считается. Однако Ключ после этого не доступен в других процессах. В частности guardant - диагностика просто навсегда зависает в поиске ключа(любой другой процесс пытающийся повторить поиск - заканчивает так же плачевно, т.е. не заканчивается никогда). Если застрелить чекер с нижеуказанным кодом - все сразу оживает. Я чтото делаю не так, или всетаки лыжи не едут?
if (GrdStartup(GrdFMR_Local) == GrdE_OK)
{
HANDLE hGrd = GrdCreateHandle(NULL, GrdCHM_MultiThread, NULL);
if (hGrd)
{
//TODO: protect access codes
if (GrdSetAccessCodes(hGrd, ***, ***, 0, 0) == GrdE_OK)
{
if (GrdSetFindMode(hGrd, GrdFMR_Local, GrdFM_NProg, 1, 0, 0, 0, 0, 0, 0, GrdFMI_USB) == GrdE_OK)
{
while (!abort.Check())
{
DWORD keyId = 0;
TGrdFindInfo fi;
int r = GrdFind(hGrd, GrdF_First, &keyId, &fi);
if (r != GrdE_OK && r != GrdE_DongleNotFound && r != GrdE_AllDonglesFound)
break;
if (r == GrdE_OK)
{
if (GrdLogin(hGrd, 0, 0) != GrdE_OK)
break;
if (GrdRead(hGrd, UAM_WORKER_ID, 4, &workerInfo.m_id, NULL) == GrdE_OK)
{
while (!abort.Wait(GUARDANT_KEY_RECHECK_TIMEOUT))
{
if (GrdCheck(hGrd) != GrdE_OK)
break;
}
m_logout();
}
GrdLogout(hGrd, 0);
}
else
abort.Wait(GUARDANT_KEY_RECHECK_TIMEOUT);
}
}
}
GrdCloseHandle(hGrd);
}
GrdCleanup();
}