Guardant API + Автозащита - Приложение закрывается по ошибке
Добрый вечер!
Столкнулся с такой проблемой:
Есть сервис защищенный автозащитой, в котором с периодичностью в 2 минуты опрашивается ключ используя Guardant API.
Спустя некоторое время, сервис завершает свою работу как раз в момент очередного опроса ключа.
Пытался варьировать время опроса в программе, время опроса автозашиты. Ничего не помогает.
Логика работы приложения:
в момент запуска сервиса выполняю
if (GrdStartup(GrdFMR_Local) <> GrdE_OK) then exit;
В теле процедуры периодического опроса ключа делаю следующее:
try
try
dwPub := 0;//ключи доступа
dwPriv := 0;
hnd := GrdCreateHandle(@abyGrd, GrdCHM_MultiThread, nil);
if (hnd = nil) then exit;
if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_NProg, ProgNum, dwID, 0, 0, 0, 0, GrdFMM_ALL, GrdFMI_ALL) <> GrdE_OK) then exit;
nRet := GrdFind(hnd, GrdF_First, @dwID, @GrdFindInfo);
if nRet <> GrdE_OK then exit;
while (nRet = GrdE_OK) do begin
idsLen := Length(id_list);
SetLength(id_list, idsLen + 1);
id_list[idsLen] := dwID;
nRet := GrdFind(hnd, GrdF_Next, @dwID, @GrdFindInfo);
end;
if (nRet <> GrdE_AllDonglesFound) then exit;
if (GrdSetAccessCodes(hnd, dwPub, dwPriv, 0, 0) <> GrdE_OK) then exit;
for id in id_list do
try
if (GrdSetFindMode(hnd, GrdFMR_Local, GrdFM_ID, 0, id, 0, 0, 0, 0, GrdFMM_Sign, GrdFMI_USB) <> GrdE_OK) then exit;
ZeroMemory(@buf, SizeOf(buf));
if (GrdLogin(hnd, $FFFFFFFF, GrdLM_PerHandle) <> GrdE_OK) then exit;
//блокировку ключа добавил с надеждой на решение проблемы
if (GrdLock(hnd, 2000, 10000, GrdLM_All) <> GrdE_OK) then exit;
if (GrdHashEx(hnd, 3, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then exit;
if (GrdPI_Read(hnd, 3, 0, 32, @ownerBuf[0], 0, nil) <> GrdE_OK) then exit;
SetString(bs, ownerBuf, 32);
bs := LowerCase(Trim(bs));
tLen := Length(table);
SetLength(table, tLen + 1);
table[tLen].Owner := bs;
for i := 4 to 15 do begin
if (GrdHashEx(hnd, i, 32, @buf[0], GrdSC_All, 32, @buf[0], 0, nil, 32767, nil, nil) <> GrdE_OK) then
continue;
if (GrdPI_Read(hnd, i, 0, 32, @buf[0], 0, nil) = GrdE_OK) then begin
// другой код...
end;
end;
GrdUnlock(hnd);
GrdLogout(hnd, GrdLM_PerHandle);
except
on E:Exception do begin
WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
end;
end;
Result := table;
except
on E:Exception do begin
WriteLog('Ошибка! При опросе ключа возникла ошибка: '+E.Message);
end;
end;
finally
if (hnd <> nil) then
GrdCloseHandle(hnd);
end;
В журнале Windows никаких подробностей нет. Просто "Служба неожиданно завершена...".
Ключ программирую вручную из своей программы.
Программу защищаю с такими параметрами:
/V /PACK /CPA /IMPLICIT_LINKING_SUPPORT /ATR=2 /UN=0x2A /USB_DONGLE_CONTROL /Q /IMPORT_HOOK=10:2 /T=5 /RIP_CODE=10 /SILENT
Подскажите, как решить проблему?