Как решить ошибку 87 при использовании IcmpSendEcho в Delphi на Windows 10
Вопрос, поставленный в этом запросе, касается работы с функцией IcmpSendEcho в среде Delphi для операционных систем семейства Windows, в частности, возникновения ошибки 87 на Windows 10. Эта ошибка соответствует коду ERROR_INVALID_PARAMETER, что означает, что один из параметров, переданных функции, некорректен.
Объяснение проблемы
Функция IcmpSendEcho используется для отправки эхо-запросов (ping) в сети. В коде на языке Delphi для Windows XP данная функция работает корректно, но на Windows 10 возникает ошибка с кодом 87. Несмотря на тщательный анализ документации по функции, явных признаков неправильной работы кода не обнаружено.
Анализ кода
Рассмотрим пример кода, который вызывает функцию IcmpSendEcho:
function Ping(strIpAddress : String) : Boolean;
var
address: IpAddress;
dwReplies: DWORD;
{$IFDEF DBG} dwErrorCode: DWORD; {$ENDIF}
abyReplyBuffer: array[1..ICMP_ECHO_BUFFER] of BYTE;
begin
// ...
TranslateStringToIpAddress(strIpAddress, address);
dwReplies := IcmpSendEcho(
m_cache.hPingHandle, address, nil, 0, nil, @abyReplyBuffer, ICMP_ECHO_BUFFER, 0);
// ...
end;
Здесь видно, что буфер ответа abyReplyBuffer имеет размер ICMP_ECHO_BUFFER, который в данном случае равен 128 байтам. Также в функции TranslateStringToIpAddress используется устаревшая функция gethostbyname, которая может быть несовместима с новыми версиями операционной системы.
Возможные решения
По комментариям к вопросу, было предложено несколько возможных решений:
Увеличить размер буфера ответа, так как если он слишком мал, это может привести к ошибке ERROR_INVALID_PARAMETER.
Использовать функцию getaddrinfo вместо gethostbyname.
Проверить возвращаемое значение из функции TranslateStringToIpAddress на ошибки перед вызовом IcmpSendEcho.
Установить параметр dwTimeout в значение, отличное от нуля.
Подтвержденное решение
На основе комментариев пользователя @FredS, подтвержденное решение заключается в изменении последнего параметра функции IcmpSendEcho на значение, отличное от нуля. В примере кода это будет выглядеть так:
Таким образом, установка параметра dwTimeout в значение, например, 10, позволяет функции IcmpSendEcho работать корректно на Windows 10. Это изменение не отражено в документации MSDN, что может указывать на изменения в реализации функции в Windows 10.
Заключение
Для устранения ошибки 87 при использовании IcmpSendEcho в Delphi на Windows 10, необходимо убедиться, что параметр dwTimeout установлен в значение, отличное от нуля. Это простое изменение может решить проблему, и теперь ваше приложение будет работать корректно на новых версиях операционной системы.
Вопрос касается устранения ошибки 87 при использовании функции `IcmpSendEcho` в Delphi для Windows 10, связанной с некорректным параметром, который может быть вызван несоответствием размера буфера или устаревшими функциями для преобразования IP-адресов,
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.