powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Pipes and Delphi 7 - Delphi 10.1
12 сообщений из 12, страница 1 из 1
Pipes and Delphi 7 - Delphi 10.1
    #39695865
kokon_01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем. Столкнулся с непонятным моментом, есть вот такой код (можно сказать шаблонный):
Код: 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
Pipes and Delphi 7 - Delphi 10.1
    #39695871
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String Delphi 7 и String Delphi 10 это два совсем разных типа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pipes and Delphi 7 - Delphi 10.1
    #39695873
kokon_01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Pipes and Delphi 7 - Delphi 10.1
    #39695896
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokon_01,

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

Ты не поверишь, но Char там тоже разные. Вызываемая программа готова принимать UTF-16,
который ты ей пихаешь в глотку?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pipes and Delphi 7 - Delphi 10.1
    #39696035
kokon_01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как говорится "Слона то я и не заметил"... Забыл про то что тут 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
Pipes and Delphi 7 - Delphi 10.1
    #39696060
kokon_01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попутный вопрос, интересный.
В данном случае вызывается "cmd.exe", в него отсылаются какие-то команды, и получаем результаты.
К примеру если я отправлю "ping 192.168.1.1 -t", то получу вечный пинг.
В терминале Windows, процесс останавливается нажатием Ctrl+C, символьный код данной комбинации #3, но отправка его в трубу не останавливает выполнение Пинга.
Как его можно остановить, не прибивая процесс?
...
Рейтинг: 0 / 0
Pipes and Delphi 7 - Delphi 10.1
    #39696080
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kokon_01Попутный вопрос, интересный.
В данном случае вызывается "cmd.exe", в него отсылаются какие-то команды, и получаем результаты.
К примеру если я отправлю "ping 192.168.1.1 -t", то получу вечный пинг.
В терминале Windows, процесс останавливается нажатием Ctrl+C, символьный код данной комбинации #3, но отправка его в трубу не останавливает выполнение Пинга.
Как его можно остановить, не прибивая процесс?

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

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

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

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

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


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