Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Pipes and Delphi 7 - Delphi 10.1 / 12 сообщений из 12, страница 1 из 1
30.08.2018, 22:05
    #39695865
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
Привет всем. Столкнулся с непонятным моментом, есть вот такой код (можно сказать шаблонный):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
var
  OutPipeRead, OutPipeWrite: THandle;
  InPipeRead, InPipeWrite: THandle;

  PI: TProcessInformation;

implementation

{$R *.dfm}

function CreateCmd: Boolean;
var SA: TSecurityAttributes;
    SI: TStartupInfo;
begin
  SA.nLength := SizeOf(SA);
  SA.bInheritHandle := True;
  SA.lpSecurityDescriptor := nil;

  CreatePipe(OutPipeRead, OutPipeWrite, @SA, 0);
  CreatePipe(InPipeRead, InPipeWrite, @SA, 0);

  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  SI.wShowWindow := SW_HIDE;
  SI.hStdInput := InPipeRead;
  SI.hStdOutput := OutPipeWrite;

  Result := CreateProcess(nil, PChar(GetEnvironmentVariable('ComSpec')), nil, nil, True, 0, nil, nil, SI, PI);
end;

procedure WriteToPipe(Str: string; Ent: Boolean = True);
var dwWritten, BufSize: DWORD;
    chBuf: PChar;
begin
  if Ent then Str := Str + #13#10;
  chBuf := PChar(Str);
  BufSize := Length(chBuf);
  WriteFile(InPipeWrite, chBuf^, BufSize, dwWritten, nil);
end;

function ReadFromPipe: string;
var DataSize, dwRead: DWORD;
    Buffer: PAnsiChar;
begin
  if PeekNamedPipe(OutPipeRead, nil, 0, nil, @DataSize, nil) and (DataSize > 0) then
  begin
    Buffer := AllocMem(DataSize +1);
    if ReadFile(OutPipeRead, Buffer^, DataSize, dwRead, Nil) then
    begin
      OemToAnsi(Buffer, Buffer);
      Result := string(Buffer);
    end;
  end;
end;



На Delphi 7 работает, а вот на Delphi 10.2 не совсем адекватно, процесс создается, вывод из выходной трубы считывается типа:
Microsoft Windows [Version 10.0.17134.228]
(c) Корпорация Майкрософт (Microsoft Corporation), 2018. Все права защищены.

C:\Users\sysadmin\Documents\Embarcadero\Studio\Projects\cmd_Server>

А вот при отправке во входную трубу, в сторону дочернего окна (cmd.exe), данные просто исчезают, не попадая в консоль. На D7 они попадают в консоль и я получаю результат выполненой команды. С чем бы это могло быть связано?
...
Рейтинг: 0 / 0
30.08.2018, 22:13
    #39695871
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
String Delphi 7 и String Delphi 10 это два совсем разных типа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.08.2018, 22:20
    #39695873
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
Dimitry Sibiryakov,

Пробовал писать всё напрямую, без String'ов, вот так, чтоб минимизировать ошибки (безрезультатно):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure WriteToPipe;
var dwWritten, BufSize: DWORD;
    chBuf: PChar;
begin
  chBuf := PChar('dir'+#13#10);
  BufSize := Length(chBuf);
  WriteFile(InPipeWrite, chBuf^, BufSize, dwWritten, nil);
end;
...
Рейтинг: 0 / 0
30.08.2018, 23:09
    #39695896
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
kokon_01,

Читай про WriteFile и третий параметр и заодно про SizeOf(Char)
...
Рейтинг: 0 / 0
31.08.2018, 00:17
    #39695905
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
kokon_01chBuf: PChar

Ты не поверишь, но Char там тоже разные. Вызываемая программа готова принимать UTF-16,
который ты ей пихаешь в глотку?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2018, 10:57
    #39696035
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
Как говорится "Слона то я и не заметил"... Забыл про то что тут Char - это WideChar и совсем не один байт на символ...
Пока сделал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure WriteToPipe(Str: AnsiString; Ent: Boolean = True);
var dwWritten, BufSize: DWORD;
    chBuf: PansiChar;
begin
  if Ent then Str := Str + #13#10;
  chBuf := PAnsiChar(Str);
  BufSize := (Length(Str) * SizeOf(chBuf[0])) +1;
  WriteFile(InPipeWrite, chBuf^, BufSize, dwWritten, nil);
end;
...
Рейтинг: 0 / 0
31.08.2018, 11:18
    #39696060
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
Попутный вопрос, интересный.
В данном случае вызывается "cmd.exe", в него отсылаются какие-то команды, и получаем результаты.
К примеру если я отправлю "ping 192.168.1.1 -t", то получу вечный пинг.
В терминале Windows, процесс останавливается нажатием Ctrl+C, символьный код данной комбинации #3, но отправка его в трубу не останавливает выполнение Пинга.
Как его можно остановить, не прибивая процесс?
...
Рейтинг: 0 / 0
31.08.2018, 11:36
    #39696080
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
kokon_01Попутный вопрос, интересный.
В данном случае вызывается "cmd.exe", в него отсылаются какие-то команды, и получаем результаты.
К примеру если я отправлю "ping 192.168.1.1 -t", то получу вечный пинг.
В терминале Windows, процесс останавливается нажатием Ctrl+C, символьный код данной комбинации #3, но отправка его в трубу не останавливает выполнение Пинга.
Как его можно остановить, не прибивая процесс?

Никак
...
Рейтинг: 0 / 0
31.08.2018, 13:03
    #39696199
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
schiНикак
Лаконично, ожидаемо)
Всем Спасибо!
скорее всего нужно было просто пойти поспать и всё бы пришло, ну или дошло.
...
Рейтинг: 0 / 0
31.08.2018, 13:28
    #39696225
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
kokon_01Лаконично, ожидаемо)

Теперь надо поспать ещё подольше, чтобы суметь для пинга воспользоваться API вместо вызова
утилит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2018, 13:50
    #39696237
kokon_01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
Dimitry Sibiryakov,

Мне не пинг нужен, а командная строка, для поддержки удаленного управления на уровне командной строки. Для майнеров написана утилита, которая обращается по сети к API майнеров, собирая информацию о состоянии и производительности каждого, на данный момент приложение работает в одну сторону (+ отсылка уведомлений при возникновении проблем, пользователю Windows или СМС через Email), в дальнейшем будет реализован сервис для установки на каждом риге, который в свою очередь будет связан с сервером, к которому будет возможность подключится "снаружи", через мобильное приложение, просмотреть информацию о ригах и если надо, управлять ими по средством командной строки.

Тут есть приложение (то которое одностороннее) и мануал, если интересно.
...
Рейтинг: 0 / 0
31.08.2018, 16:40
    #39696346
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipes and Delphi 7 - Delphi 10.1
kokon_01Мне не пинг нужен, а командная строка, для поддержки удаленного управления на уровне
командной строки.

Тогда RTFM GenerateConsoleCtrlEvent().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Pipes and Delphi 7 - Delphi 10.1 / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]