Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как решить ошибку 87 при использовании `IcmpSendEcho` в Delphi на Windows 10

Delphi , ОС и Железо , Windows

Как решить ошибку 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, которая может быть несовместима с новыми версиями операционной системы.

Возможные решения

По комментариям к вопросу, было предложено несколько возможных решений:

  1. Увеличить размер буфера ответа, так как если он слишком мал, это может привести к ошибке ERROR_INVALID_PARAMETER.
  2. Использовать функцию getaddrinfo вместо gethostbyname.
  3. Проверить возвращаемое значение из функции TranslateStringToIpAddress на ошибки перед вызовом IcmpSendEcho.
  4. Установить параметр dwTimeout в значение, отличное от нуля.

Подтвержденное решение

На основе комментариев пользователя @FredS, подтвержденное решение заключается в изменении последнего параметра функции IcmpSendEcho на значение, отличное от нуля. В примере кода это будет выглядеть так:

dwReplies := IcmpSendEcho(
    m_cache.hPingHandle, address, nil, 0, nil, @abyReplyBuffer, ICMP_ECHO_BUFFER, 10);

Таким образом, установка параметра 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:43:57/0.0053091049194336/1