Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2022, 20:37   #31
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

спасибо помогли!!!!

Последний раз редактировалось AppData; 07.05.2022 в 20:41.
AppData вне форума Ответить с цитированием
Старый 07.05.2022, 20:44   #32
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

У различных компиляторов свои заморочки в описаниях системных вызовов. У моего описания функций выглядят так
Код:
    function inet_addr(cp:pchar):cardinal;external winsockdll name 'inet_addr';
    function inet_ntoa(i : TInAddr):pchar;external winsockdll name 'inet_ntoa';
Если разбираться с описанием, то функция inet_addr во входном параметре требует число представляющее адрес в памяти по которому начинается массив символов представляющий строку и оканчивающийся #0. Как в моем описании так и в вашем, но у вас там эти данные дополнительно типизированы несколькими разными именами. От чего это не изменяет сами данные, но дополнительно создает контроль типов со стороны компилятора во время сборки. У вас есть нужное число, но компилятор из-за контроля типов не дает вам его передать функции. Поэтому появляются дополнительные преобразования типа PWideChar(Integer(PChar(str)) + 6).

Но все эти заморочки в любом случае сводятся к элементарным определениям языка Pascal. До них просто надо уметь докопаться и разрабатывать программы станет проще. В оболочке Delphi/Lazarus уже давно реализованы механизмы для быстрого нахождения любых описаний, но иногда приходится копаться очень долго пока разберетесь. В этом вся прелесть программирования.

По мимо уже упомянутых мной щелчков мыши с нажатой Ctrl и использования окна автоподстановки, стоит сказать еще про поиск в файлах. К нему приходится прибегать, когда не можете найти в каком конкретно модуле находится описание непонятной вам конструкции.

Как правило поиск в файлах стоит производить рекурсивно в каталоге <DelphiPath>\include\*.* или /usr/include/lazarus/*
macomics вне форума Ответить с цитированием
Старый 07.05.2022, 20:52   #33
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

Код:
var
  str: MarshaledAString;
  sin: IN_ADDR;
begin
  str := PAnsiChar(GetLocalIP);
  sin.S_addr := inet_addr(str);
  sin.S_un_b.s_b4 := AnsiChar(20);
  str := inet_ntoa(sin);
  Result := str;
end;
не работает (

почему то нули 0.0.0.20
AppData вне форума Ответить с цитированием
Старый 07.05.2022, 20:58   #34
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Кликаете правее номера строки содержащей str := PAnsiChar(GetLocalIP); и она становится красной.
Потом выбираете пункт Вид->Отладка->Локальные переменные (может отличаться в вашей версии).
Нажимаете зеленую стрелочку (запуск) и программа останавливается на выделенной красным строке.
Потом кнопкой F7 или F8 продолжаете пошаговое исполнение программы параллельно наблюдая за значениями в окне Локальные переменные. Так можно выяснить на каком этапе вы получили ошибку в данных.
macomics вне форума Ответить с цитированием
Старый 07.05.2022, 21:40   #35
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

Ошибок нет, просто он показывает 0.0.0.20
AppData вне форума Ответить с цитированием
Старый 07.05.2022, 22:07   #36
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
var
  str: MarshaledAString;
  sin: IN_ADDR;
begin
  str := '127.127.192.0';
  sin.S_addr := inet_addr(str);
  sin.S_un_b.s_b4 := AnsiChar(20);
  str := inet_ntoa(sin);
  Result := str;
end;
Так тоже 0.0.0.20?
Код:
var
  str: MarshaledAString;
  sin: IN_ADDR;
begin
  str := MarshaledAString(GetLocalIP);
  sin.S_addr := inet_addr(str);
  sin.S_un_b.s_b4 := AnsiChar(20);
  str := inet_ntoa(sin);
  Result := str;
end;
А так?

Последний раз редактировалось macomics; 07.05.2022 в 22:11.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 12:32   #37
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

macomics, когда вручную прописан, нормально работает а через
Код:
 str := MarshaledAString(GetLocalIP);
и через
Код:
str := PAnsiChar(GetLocalIP);
почему-то нули.. ((
AppData вне форума Ответить с цитированием
Старый 08.05.2022, 13:09   #38
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от AppData Посмотреть сообщение
Код:
{$EXTERNALSYM inet_addr}
function inet_addr(cp: MarshaledAString): u_long; stdcall; {PInAddr;}  { TInAddr }
но мне это не помогло
Найдите это определение и ткните в нем еще раз с нажатым Ctrl по inet_addr.
Вы должны перейти к строчке вида (она ниже по тексту):
Код:
function inet_addr; external <winsockdll> name <'inet_addr'>;
Элементы что я выделил <> могут отличаться от объявленных у вас, но мне интересна эта строчка.
Потом с нажатым Ctrl щелкайте по winsockdll. Мне интересно ее определение.
Возможно вы перейдете не к вышеприведенной строке экспорта, а к функции типа
Код:
function inet_addr(cb: MarshalledAString): u_long;
begin
...
end;l
Мне это тоже интересно.

Суть проблемы в том, что у вас Unicode символы занимающие по 2 байта (и второй байт в каждом символе равен #0 - конец строки) передаются как есть в функцию ожидающую ASCII символы занимающие 1 байт.
Решить это можно либо переопределив экспортируемую функцию в соответствии с ее прототипом из внешней справки: см. мой комментарий выше, где я приводил определение этих функций из моего компилятора; либо разобраться с именованием типов у вашего компилятора и передать функции строку в правильном формате без преобразования.
ADD: Еще стоит проверить результат выполнения функции GetLocalIP. Возможно она возвращает строку '0.0.0.0';

Последний раз редактировалось macomics; 08.05.2022 в 13:23.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 16:27   #39
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 248
По умолчанию

правильно я все понял?
Изображения
Тип файла: jpg 1.jpg (106.4 Кб, 1 просмотров)
Тип файла: jpg 2.jpg (101.0 Кб, 0 просмотров)
AppData вне форума Ответить с цитированием
Старый 08.05.2022, 17:03   #40
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

да. просто этих библиотек с интерфейсами API несколько в Windows. wsock32.dll, ws2.dll, ws2_32.dll
Все содержат приблизительно одинаковый набор функций, но есть и небольшие различия.
Хотя в основном они делают одно и тоже.

Для начала стоит пойти по пути наименьшего сопротивления. Сразу после слова implementation в модуле с вашей формой добавьте эти строчки:
Код:
const winsock32dll = 'wsock32.dll';
function inet_addr_ext(cp:pchar):cardinal;external winsock32dll name 'inet_addr';
function inet_ntoa_ext(i : IN_ADDR):pchar;external winsock32dll name 'inet_ntoa';
и в функции измените имена на новые
Код:
var
  str: PChar;
  sin: IN_ADDR;
begin
  str := GetLocalIP;
  sin.S_addr := inet_addr_ext(str);
  sin.S_un_b.s_b4 := #20;
  str := inet_ntoa_ext(sin);
  Result := str;
end;
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заменить последние цифры в IP на звездочки nibufep PHP 4 13.04.2015 14:48
Последние символы строки arshavin0230 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.10.2014 19:35
Дан двумерный массив. начиная с 1 строки сдвинуть все строки на 2 вниз, а последние 2 переместить на место первых двух строк. Proskurina Помощь студентам 5 03.03.2013 21:38
Найти степень числа N, у которой три последние цифры одинаковые. Vika_0_0 Паскаль, Turbo Pascal, PascalABC.NET 7 11.03.2012 10:24
Как вытащить последние 100 записей? vladtr SQL, базы данных 20 31.05.2010 09:30