2 / 2 / 2
Регистрация: 29.07.2012
Сообщений: 176
1

Работа с командной строкой

28.07.2016, 11:34. Показов 521. Ответов 3

Добрый день. Извиняюсь, что заголовок не совсем соответствует вопросу.
Понимаю, что тема заезженная, но у меня ничего не получилось.
Кликните здесь для просмотра всего текста

Кратко, как я к этому пришёл. В организации есть около 10 серверов, на которых по RDP подключены пользователи, которые работают в программе. Периодически (раз в неделю или раз в 2 недели) пользователей надо информировать об обновлении программы (чтобы не было возмущений). Изначально заходил на каждый сервер и отправлял сообщение всем пользователям через диспетчер задач. Это всё надоело, и узнал про программу msg.exe. Осталось только удалённо запускать её с параметрами. Пробовал через psexec, но с ней как-то не заладилось, да и задержка достаточно большая, поэтому остановился на варианте написания службы и клиента. Потом был долгий период написания на c++ с которым были проблемы в кодировках, и затем перепись службы на Delphi, которая как раз и использует программу msg. И вроде всё работает, сообщение отправляются, а на сервере принимаются, но проблемы начинаются при отправке сообщений больше 255 символов. Служба их принимает, и запускает msg, но msg это сообщение переварить не может. Но если ввести msg * /TIME:0 и затем нажать Enter, то можно написать сообщение раз в 5-7 большей длины и оно успешно отобразится.

Посмотрел, что это можно реализовать через так называемые pipes. Вся проблема в том, что примеры из интернета, с которыми я пробовал работать, компилировались с ошибкой (Rad studio 10 seattle на Win10 x64), либо не работали. Основной код, который и вызывает msg, представлен ниже
Delphi
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
function _message(soobsh: string): Integer;
var
  stroka: string;
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
 
begin
  try
    begin
      stroka := 'c:\windows\Sysnative\msg.exe * /TIME:0 "' + soobsh + '"';
      ZeroMemory(Addr(si), sizeof(STARTUPINFO));
      if (CreateProcess(nil, PWideChar(WideString(fw2)), nil, nil, FALSE, CREATE_NO_WINDOW, nil, nil, &si, &pi) = TRUE) then
      begin
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
      end;
      Result := 0;
    end;
  except
    on ex: Exception do
    begin
      Result := 1;
    end;
  end;
end;
Остальная часть-работа с сетью через сокеты. Как можно модифицировать данный код, чтобы можно было работать с сообщениями больше, чем 255 символов?
Есть ли рабочий вариант (или подробная подсказка) как программно написать в командную строку текст (забрать результат, но не обязательно) ?
Или легче будет создать маленькое, изначально не видимое, легковесное приложение, которое будет автоматом запускаться со входом пользователя в систему и ждать от службы информации, в последствии вызывать либо MessageBox, либо форму с сообщением?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2016, 11:34
Ответы с готовыми решениями:

Работа с командной строкой windows
В общем установил себе на ноутбук вин8, возникла проблема раздачи вайфая, привычная для меня...

Работа с командной строкой. WinExec
Доброго времени суток. Появилась проблема с запуском командной строки. Есть код: ...

Калькулятор с командной строкой - помогите исправить ошибки
Дело обстоит так: в программе два поля ввода и кнопка. В поле 1 вводится регулярное арифметическое...

Работа со строкой
Есть строка "№1 - 3000 Конкурсных Задач по Математике .pdf ;Размер: 14,76 МБ" нужно убрать...

3
5010 / 3908 / 1291
Регистрация: 14.04.2014
Сообщений: 17,993
Записей в блоге: 18
28.07.2016, 14:33 2
может, сама программа, куда заходят пользователи, будет спокойно брать файлик по нужному адресу и сравнивать со своими константами?
если есть разница, выдавать сообщение при входе, или по таймеру
0
2 / 2 / 2
Регистрация: 29.07.2012
Сообщений: 176
28.07.2016, 14:52  [ТС] 3
Цитата Сообщение от krapotkin Посмотреть сообщение
может, сама программа, куда заходят пользователи, будет спокойно брать файлик по нужному адресу и сравнивать со своими константами?
я бы рад, но разработчики этой программы находятся в Санкт-Петербурге, и предназначение этой программы другое. Вряд ли разработчики будут туда допиливать систему оповещения, которая опять же при обновлении программы и БД будет недоступна.
Цитата Сообщение от krapotkin Посмотреть сообщение
если есть разница, выдавать сообщение при входе, или по таймеру
Если мне не сообщили о скором обновлении, то и сообщения не будет ни при каких условиях. Сообщили-пишу сообщение о скором обновлении с просьбой сохранить инфу...тут таймеров нет.
Проблема в том, что иногда сообщение большое, и оно не отображается.
0
5010 / 3908 / 1291
Регистрация: 14.04.2014
Сообщений: 17,993
Записей в блоге: 18
28.07.2016, 19:32 4
тогда написать другую програму, которая будет делать то что я сказал
служба сообщений не работает сейчас в Windows насколько я знаю
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2016, 19:32

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Работа со строкой
Здравствуйте! Помогите с такой проблемой, нужно вырывать цифры перед запятой, что-то в этом роде:...

работа со строкой
Result := ''; List := TStringList.Create(); try case GetkeybordReg of 1 :...

Работа со строкой
Здравствуйте, помогите пожалуйста. Имеется строка с адресом к примеру 352331 Россия, г....

Работа со строкой
Есть строка написанная в Edit состоящая из математического уравнения (например: 5+89,4+70-9+5,47)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.