Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.12.2013, 21:46
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
Вопрос PWideChar обрезает строку

Доброго времени суток. Я пытаюсь обработать через PWideChar строку, которая больше, чем 2048 символов. И она обрезается. Пример:
Код:
'-Xms256m -Xmx512m...многотекста...libraries\org\apache\commons\commons-lang3\3.1\commons-lan'#$0600
Строка обрезается ровно после 2048 символа, я проверил. Почему так происходит и что делать? Почему так происходит и что делать?

Последний раз редактировалось serega6531, 02.12.2013 в 21:48.
Ответить с цитированием
  #2  
Старый 02.12.2013, 23:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от serega6531
Доброго времени суток. Я пытаюсь обработать через PWideChar строку, которая больше, чем 2048 символов. И она обрезается. Пример:
Код:
'-Xms256m -Xmx512m...многотекста...libraries\org\apache\commons\commons-lang3\3.1\commons-lan'#$0600
Строка обрезается ровно после 2048 символа, я проверил. Почему так происходит и что делать? Почему так происходит и что делать?
Не вижу причин чтобы обрезалось. Покажи в каком исходном коде это обрезание происходит.
Ответить с цитированием
  #3  
Старый 03.12.2013, 04:34
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от serega6531
Строка обрезается ровно после 2048 символа, я проверил.
Если это командная строка, похоже на системное ограничение длины командной строки. Выход один -- прятать параметры в файл параметров, а в командной строке передавать только его имя.
__________________
Не стоит путать форумы с богадельнями. © Bargest

Последний раз редактировалось Freeman, 03.12.2013 в 04:36.
Ответить с цитированием
  #4  
Старый 03.12.2013, 07:38
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Нет, в файл нельзя. Код:
Код:
procedure ExecuteMinecraft(MinecraftData: TMinecraftData);
var
  lpDirectory, lpFile, lpParameters: PWideChar;
  si:TStartupInfo;
  pi:TProcessInformation;
begin
  with MinecraftData do
  begin
    lpDirectory := PWideChar(MinePath);
    lpParameters := PWideChar(
                               //'-Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true ' +
                               '-Xms' + Xms + 'm ' +
                               '-Xmx' + Xmx + 'm ' +
                               '-Djava.library.path="' + NativesPath + '" ' +
                               '-cp "' + CP + '" ' +
                               'net.minecraft.client.main.Main ' + LogonInfo
                              {
                               'net.minecraft.launchwrapper.Launch' + LogonInfo +
                               ' --tweakClass cpw.mods.fml.common.launcher.FMLTweaker'
                              }
                              );
    lpFile := PWideChar(Java + '\javaw.exe');
  end;
  ShellExecuteW(0,nil,lpFile,lpParameters,lpDirectory,SW_SHOWNORMAL);
  //CreateProcessW(PWideChar('"' + MinecraftData.Java + '\javaw.exe"'),lpParameters, nil, nil, false, NORMAL_PRIORITY_CLASS,nil, nil, si, pi);

end;

procedure PlayMinecraft(servername:string;auth:TAuthManager);
var
  FileList: TStringList;
  I: Word;
  CP: string;
  MinecraftData: TMinecraftData;
begin
  FileList := TStringList.Create;
  CheckFolder(settings.MinecraftDir+'libraries\', '*.jar', FileList);
  CheckFolder(settings.MinecraftDir+'dists\' + servername + '\', '*.jar', FileList);
  CP := '';
  for I := 0 to FileList.Count - 1 do
  begin
    CP := CP + FileList.Strings[i] + ';';
  end;
  MinecraftData.Minepath := settings.MinecraftDir;
  MinecraftData.Java := getJavaPath();
  MinecraftData.Xms := settings.MinMem;
  MinecraftData.Xmx := settings.MaxMem;
  MinecraftData.NativesPath := settings.MinecraftDir + 'dists\' + servername + '\natives';
  MinecraftData.CP := CP;
  MinecraftData.LogonInfo := '--username ' + auth.getLogin() + ' ' +
                             '--session ' + auth.getParams() + ' ' +
                             '--version 1.6.4 ';
  ExecuteMinecraft(MinecraftData);
  FreeAndNil(FileList);
  ExitProcess(0);
end;
Как раз lpParameters и обрезается.
Ответить с цитированием
  #5  
Старый 03.12.2013, 07:50
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Путь до папки майнкрафта полный задается? Вроде бы можно так написать: %APPDATA%\.minecraft
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 03.12.2013, 07:55
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Не уверен, могу попробовать позже
Ответить с цитированием
  #7  
Старый 03.12.2013, 09:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вроде наблюдается лишнее преобразование типов, например
Код:
lpParameters := PWideChar(...);
эта переменная и так уже заявлена как указатель, попробуйте убрать общее приведение, а если это всё же необходимо относительно других переменных, то тогда лучше так
Код:
lpParameters := '-Xms' + PWideChar(Xms) + 'm '+ PWideChar(LogonInfo);
есть подозрение что косяк в этом

Добавлено позже

Плохой совет, не проверив ляпнул, извнт. Всё вроде сложнее - это одна из хреновостей делфи при работе с UNICODE. Получилось так, принимается что Xms и LogonInfo типа string
Код:
lpParameters := PWideChar('-Xms' + WideString(Xms) + 'm ' + WideString(LogonInfo));
а иначе "Suspicious typecast String to PWideChar" вылазит с обрезкой строки

Последний раз редактировалось Alegun, 03.12.2013 в 10:30. Причина: LMD
Ответить с цитированием
  #8  
Старый 03.12.2013, 10:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от serega6531
Нет, в файл нельзя. Код:
Код:
.....
  ShellExecuteW(0,nil,lpFile,lpParameters,lpDirectory,SW_SHOWNORMAL);
  //CreateProcessW(PWideChar('"' + MinecraftData.Java + '\javaw.exe"'),lpParameters, nil, nil, false, NORMAL_PRIORITY_CLASS,nil, nil, si, pi);
.....
Как раз lpParameters и обрезается.
Похоже что такое ограничение действительно есть у ShellExecute - об этом пишет у себя в блоге Реймонд Чен.
Я только что проверил - действительно так и есть.
А вот у CreateProcess ограничение в районе 32768 (тоже проверил) - так что для обхода этого ограничения испльзуй CreateProcess вместо ShellExecute.

UPD.
А вот здесь перевод той статьи из блога Реймонда Чена.

Последний раз редактировалось poli-smen, 03.12.2013 в 12:04.
Ответить с цитированием
  #9  
Старый 03.12.2013, 16:07
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Получилось так, принимается что Xms и LogonInfo типа string
Код:
lpParameters := PWideChar('-Xms' + WideString(Xms) + 'm ' + WideString(LogonInfo));
а иначе "Suspicious typecast String to PWideChar" вылазит с обрезкой строки
Код:
...commons\commons-lang3\3.1\commons-lanᤀᓉᥔᓉᖚ
при
Код:
lpParameters := PWideChar(
                               //'-Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true ' +
                               '-Xms' + WideString(Xms) + 'm ' +
                               '-Xmx' + WideString(Xmx) + 'm ' +
                               '-Djava.library.path="' + WideString(NativesPath) + '" ' +
                               '-cp "' + WideString(CP) + '" ' +
                               'net.minecraft.client.main.Main ' + WideString(LogonInfo)
                              {
                               'net.minecraft.launchwrapper.Launch' + LogonInfo +
                               ' --tweakClass cpw.mods.fml.common.launcher.FMLTweaker'
                              }
                              );
Ответить с цитированием
  #10  
Старый 03.12.2013, 17:30
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Путь до папки майнкрафта полный задается? Вроде бы можно так написать: %APPDATA%\.minecraft
Не знаю, с этим строка все равно не помещается в 2048 символов.
Забыл сказать, у меня delphi XE5.
Ответить с цитированием
  #11  
Старый 03.12.2013, 17:32
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Путь до папки майнкрафта полный задается? Вроде бы можно так написать: %APPDATA%\.minecraft
Не знаю, с этим строка все равно не помещается в 2048 символов.
Забыл сказать, у меня delphi XE5.
Ответить с цитированием
  #12  
Старый 03.12.2013, 17:33
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Путь до папки майнкрафта полный задается? Вроде бы можно так написать: %APPDATA%\.minecraft
Не знаю, с этим строка все равно не помещается в 2048 символов.
Забыл сказать, у меня delphi XE5.
Ответить с цитированием
  #13  
Старый 03.12.2013, 17:34
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Путь до папки майнкрафта полный задается? Вроде бы можно так написать: %APPDATA%\.minecraft
Не знаю, с этим строка все равно не помещается в 2048 символов.
Забыл сказать, у меня delphi XE5.
Ответить с цитированием
  #14  
Старый 03.12.2013, 17:34
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от serega6531
Не знаю, с этим строка все равно не помещается в 2048 символов.
Забыл сказать, у меня delphi XE5.
Моё сообщение читал? Через CreateProcess пробовал?
Ответить с цитированием
  #15  
Старый 03.12.2013, 17:36
serega6531 serega6531 вне форума
Начинающий
 
Регистрация: 03.03.2013
Сообщения: 106
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Ой, зависло и много собщений отправилось.
Цитата:
Сообщение от poli-smen
Моё сообщение читал? Через CreateProcess пробовал?
Функция тут не при чем. Переменная такая ещё до вызова ShellExecute.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025