Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 13.06.2019, 12:35   #1
niockasd
Форумчанин
 
Регистрация: 01.12.2015
Сообщений: 78
Репутация: 10
По умолчанию Не передается определенный текст по TCP

Народ, странную ерунду поймал...

Есть функция, возвращает в JSON формате список задач планировщика windows.

Строится пакет для отправки на сервер
Код:
Procedure SendShdlList(Socket: TCustomWinSocket);
var
Pocket: TStringlist;
begin
  TRY
     Pocket:= TStringList.Create;
     Pocket.Add('[shdl_list_json]');
     Pocket.Add(hash);
     Pocket.Add(  JSONShdlList );

     addevent(Pocket.Text);

      TRY
         Socket.SendText('<'+IntToStr(length(Pocket.Text))+'>'+Pocket.Text);
      except
          on E: Exception do
          addevent( 'ERROR: ' + E.Message );
      END;

  FINALLY
      FreeAndNil(Pocket);
  END;

end;
Красным помечена эта функция возвращающая строку.
Без JSON текста пакет нормально отправляется, с этой функцией получаю
Цитата:
Access violation at address 0062994C in module 'HS_Svc.exe'. Read of address 00000441
Самое интересное, что функция JSONShdlList отрабатывает нормально, возвращается строка, даже пишется весь TSTringlist в лог нормально.

Цитата:
[shdl_list_json]
B90CAC648d4FAC481Fd108C
[{"Name":"QWRvYm... вырезал JSON для экономии места....R2FtZVNhdmUgU3RhbmRieSBUYX Nr"}]
почему может не отправляется пакет с текстом, возвращаемым этой функцией?

Последний раз редактировалось niockasd; 13.06.2019 в 12:48.
niockasd вне форума   Ответить с цитированием
Старый 13.06.2019, 12:41   #2
niockasd
Форумчанин
 
Регистрация: 01.12.2015
Сообщений: 78
Репутация: 10
По умолчанию

Если просто возвращаю result:='test'; из функции то опять таки, все работает...

Получается проблема в коде функции:
Код:
Function JSONShdlList: String;
var
taskList : TList<IRegisteredTask>;
ts : ITaskService;
tf : ITaskFolder;
tc : IRegisteredTaskCollection;
task : IRegisteredTask;
td : ITaskDefinition;
regInfo : IRegistrationInfo;
ac : IActionCollection;
execAction : IExecAction;

i:integer;

JSONArry: TJSONArray;
JSObj: TJSONObject;


    function getDate(date:TDate):string; inline;
            begin
                if date = 0 then result := ''
                else result := DateToStr(date);
            end;

    procedure getTasks(folder : ITaskFolder);
            var  i : integer;
                 tfc : ITaskFolderCollection;
            begin
                tc := folder.GetTasks(1);
                for i := 1 to tc.Count do taskList.Add(tc.Item[i]);

                tfc := folder.GetFolders(0);
                for i:=1 to tfc.Count do  getTasks(tfc.Item[i]);
            end;

begin
      TRY
        CoInitialize (NIL);

        taskList := TList<IRegisteredTask>.create();
        ts := CoTaskScheduler.Create();   ///////////
        ts.Connect('', '', '', '');
        tf := ts.GetFolder('\');
        getTasks(tf);


          TRY
          JSONArry:=TJSONArray.Create;

              for task in taskList do
              begin
                JSObj:=TJSONObject.Create as TJSONObject;
                JSObj.AddPair('Name',TJSONString.Create(EncodeString( task.Name)));
                JSObj.AddPair('LastRunTime',TJSONString.Create( EncodeString(getDate(task.LastRunTime))  ));
                JSObj.AddPair('NextRunTime',TJSONString.Create(  EncodeString(getDate(task.NextRunTime)) ));
                JSObj.AddPair('State',TJSONString.Create( EncodeString(TaskStateNames[task.State])  ));

                      td := task.Definition;
                      ac := td.Actions;
                      for i := 1 to ac.Count do
                        if ac.Item[i].ActionType = taExec then
                          begin
                            execAction := ac.item[i] as IExecAction;
                            JSObj.AddPair('Path',TJSONString.Create(EncodeString(execAction.Path )));
                            JSObj.AddPair('Arguments',TJSONString.Create(EncodeString(execAction.Arguments)));
                          end;

                regInfo := td.RegistrationInfo;
                JSObj.AddPair('Author',TJSONString.Create(EncodeString(RegInfo.Author)));
                JSObj.AddPair('Description',TJSONString.Create(EncodeString(RegInfo.Description)));

                JSONArry.AddElement(JSObj);
              end;



              result:= JSONArry.ToString;
          FINALLY
            FreeAndNil(JSONArry);
          END;

      FINALLY
       CoUninitialize;
      FreeAndNil( taskList);
      END;

end;
видит кто нибудь ошибку, из-за которой эта функция возвращает правильный результат, который при этом не передается по сети...

Последний раз редактировалось niockasd; 13.06.2019 в 18:20.
niockasd вне форума   Ответить с цитированием
Старый 13.06.2019, 13:02   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,613
Репутация: 5617
По умолчанию

1) почему не проверяете результат, который возвращает Socket.SendText() (а это ведь функция)

2) пробовали ли заменить SendText на SendBuf() (ну или посмотрите в исходниках, как реализован SendText())

3) пробовали ли Вы загрузить строку с JSON из текстового файла, например
(сделайте один раз сохранение в файл, потом, вместо JSONShdlList просто прочитайте значение из файла.

4) если ошибка и в этом случае произойдёт (а это говорит о том, что действительно JSON не передаётся, попробуйте закодировать строку с JSON (например, в base64).

5) выключите обработку полученной строки (вы же с полученной строкой в точке назначения что-то делаете, верно). Может быть, текст большой и не успевает прийти полностью.
или выведите в лог размер полученной строки и сравните с размером отосланной строки.

6) с потоками не балуетесь?
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 13.06.2019, 17:37   #4
niockasd
Форумчанин
 
Регистрация: 01.12.2015
Сообщений: 78
Репутация: 10
По умолчанию

Изменил функцию так(методом тыка):
Код:
//Отправка списка планировщика на панельку
Procedure SendShdlList(Socket: TCustomWinSocket);
var
Pocket: TStringlist;
begin
  TRY
     Pocket:= TStringList.Create;
     Pocket.Add('[shdl_list_json]');
     Pocket.Add(hash);
     Pocket.Add(  JSONShdlList );

     
   TRY

     EXCEPT

     END;

     Socket.SendText('<'+IntToStr(length(Pocket.Text))+'>'+Pocket.Text);

  FINALLY
      FreeAndNil(Pocket);
  END;

end;
Тоесть, ПУСТОЙ Try...Except...end

Все заработало. если удалить все опять крашится ) как это связано )))) на что может влиять пустая конструкция Try...Except...end ?


Цитата:
с потоками не балуетесь?
все в основном потоке
Цитата:
пробовали ли Вы загрузить строку с JSON из текстового файла, например
(сделайте один раз сохранение в файл, потом, вместо JSONShdlList просто прочитайте значение из файла.
аналогично.

Цитата:
4) если ошибка и в этом случае произойдёт (а это говорит о том, что действительно JSON не передаётся, попробуйте закодировать строку с JSON (например, в base64).
пробовал)

Последний раз редактировалось niockasd; 13.06.2019 в 17:53.
niockasd вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен макрос для удаления листов из книги, в названиях которых содержится определенный текст. АННА-ЕАО Microsoft Office Excel 16 22.09.2015 09:56
Копирование строки содежащей определенный текст ingvar_on Microsoft Office Excel 4 24.03.2013 12:43
определенный текст WebBrowser + ShowMessage beegl Работа с сетью в Delphi 11 10.01.2013 13:01
Определенный текст на форме JDel Общие вопросы Delphi 7 25.12.2011 00:38
Найти файл *.xls содержащий определенный текст EfDim Microsoft Office Excel 5 19.01.2009 17:22


13:07.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru