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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2019, 11:35   #1
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию Не передается определенный текст по 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 в 11:48.
niockasd вне форума Ответить с цитированием
Старый 13.06.2019, 11:41   #2
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Если просто возвращаю 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 в 17:20.
niockasd вне форума Ответить с цитированием
Старый 13.06.2019, 12:02   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

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

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

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

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

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

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

Изменил функцию так(методом тыка):
Код:
//Отправка списка планировщика на панельку
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 в 16:53.
niockasd вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен макрос для удаления листов из книги, в названиях которых содержится определенный текст. АННА-ЕАО Microsoft Office Excel 16 22.09.2015 08: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 16:22