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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2022, 17:46   #41
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

и снова откат назад
Изображения
Тип файла: jpg Безымянный.jpg (92.3 Кб, 0 просмотров)
AppData вне форума Ответить с цитированием
Старый 08.05.2022, 18:09   #42
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

У вас в настройках проекта установлено, что по умолчанию будут использоваться Unicode строки.
Значит с описанием все в порядке. Просто GetLocalIP выдает вам строку в формате Unicode.
Вам же нужна строка в формате ASCII. И опять 2 варианта:
* Первый вариант - строку полученную от GetLocalIP перевести в формат ASCII используя функцию WideCharToMultiByte (это короткий вариант)
* Второй вариант - использовать WinSock напрямую: gethostname, gethostbyname(длинный вариант)
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 18:14   #43
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

Код:
MultiByteToWideChar(20880, GetLocalIP);
WideCharToMultiByte(1251, GetLocalIP);
не получается

Код:
int MultiByteToWideChar(


  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cchMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

  );
что то я переискал но не нашел, внятного примера

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

Цитата:
Сообщение от AppData Посмотреть сообщение
что то я переискал но не нашел, внятного примера
Код:
ISDSC_STATUS DiscpUnicodeToAnsiSize(
    IN __in PWCHAR UnicodeString,
    OUT ULONG *AnsiSizeInBytes
    )
/*++
Routine Description:
    This routine will return the length needed to represent the unicode
    string as ANSI
Arguments:
    UnicodeString is the unicode string whose ansi length is returned
    *AnsiSizeInBytes is number of bytes needed to represent unicode
        string as ANSI
Return Value:
    ERROR_SUCCESS or error code
--*/
{
    _try
    {
        *AnsiSizeInBytes = WideCharToMultiByte(CP_ACP,
                                               0,
                                               UnicodeString,
                                               -1,
                                               NULL,
                                               0, NULL, NULL);
    } _except(EXCEPTION_EXECUTE_HANDLER) {
        return(ERROR_NOACCESS);
    }
    return((*AnsiSizeInBytes == 0) ? GetLastError() : ERROR_SUCCESS);
}
В самом конце страницы описания WideCharToMultiByte ссылку на которую я прислал.
Код:
AnsiSizeInBytes := WideCharToMultiByte(CP_ACP, 0, GetLocalIP, -1, str, 255, NULL, NULL);
Как раз перевод в 1251
ADD: Я же вам писал про использование автоподстановки. Набрали слово Wide нажали Ctrl+пробел и вот вам подсказка с описанием функции, которая возможно даже поможет с перечислением необходимых ей параметров.

Последний раз редактировалось macomics; 08.05.2022 в 21:55.
macomics вне форума Ответить с цитированием
Старый 08.05.2022, 22:01   #45
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

и все же не понимаю как в моем коде это работает
Изображения
Тип файла: jpg Безымянный.jpg (58.1 Кб, 19 просмотров)

Последний раз редактировалось AppData; 08.05.2022 в 23:34.
AppData вне форума Ответить с цитированием
Старый 09.05.2022, 00:06   #46
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Хорошо. Последний вариант. Не получается использовать функции написанные за вас - реализуйте самостоятельно.
Код:
var
  i, j, l: Integer;
  a, b, c, d, s: String;
begin
  Result := '0.0.0.0';
  s := GetLocalIP;
  l := Length(s);
  i := 1;
  while (i < l) and (Byte(ord(s[i]) - $30) < 10) do inc(i);
  if (i > 1) and (i < l) then begin
    a := copy(s, 1, i - 1);
    j := i + 1;
    while (j < l) and (Byte(ord(s[j]) - $30) < 10) do inc(j);
    if (j - i > 1) and (j < l) then begin
      b := copy(s, i + 1, j - i - 1);
      i := j + 1;
      while (i < l) and (Byte(ord(s[i]) - $30) < 10) do inc(i);
      if (i - j > 1) and (i < l) then begin
        c := copy(s, j + 1, i - j - 1);
//      d := copy(s, i + 1);
        Result := a + '.' + b + '.' + c + '.20';
      end;
    end;
  end;
end;

Последний раз редактировалось macomics; 09.05.2022 в 00:18.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 01:05   #47
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

macomics, вы чудо!
последний вопрос. что здесь я делаю не так?!
Изображения
Тип файла: jpg Безымянный.jpg (61.1 Кб, 17 просмотров)
AppData вне форума Ответить с цитированием
Старый 09.05.2022, 01:15   #48
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тоже самое что и при использовании inet_addr, которая возвращала '0.0.0.20'. Вам надо ASCII строку перевести в Unicode.

ADD: Вы еще часто с таким столкнетесь. Большинство сетевых функций работают с ASCII/ANSI строками (строками из символов длиной 1 байт). Но ваш проект предполагает, что все строки в вашей программе Unicode и все компоненты и элементы интерфейса оперируют со строками состоящими из символов длиной 2 байта. Вам надо создать функцию преобразования Unicode->ASCII и функцию преобразования ASCII->Unicode в общем виде и тогда сможете решать подобные проблемы возникающие в будущем.
Кстати насчет Unicode. Порядок следования байтов в сетевых функциях обратный тому порядку в котором сохранены Unicode строки в памяти. Поэтому для передачи строк такого вида еще нужна функция преобразования порядка байтов внутри символа Unicode строки (это еще одна возможная проблема с которой вам придется столкнуться в будущем).

Последний раз редактировалось macomics; 09.05.2022 в 01:23.
macomics вне форума Ответить с цитированием
Старый 09.05.2022, 01:17   #49
AppData
Форумчанин
 
Регистрация: 20.09.2013
Сообщений: 246
По умолчанию

вот это я попал
AppData вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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