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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2018, 07:34   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
Восклицание CreateProcess и вывод в текстовый файл

Добрый день!
Впервые пробую применить CreateProcess вместо ShellExecute и т.п.
Вроде бы работает, сначала создается текстовый файл, хендл которого будет использоваться и куда будет выводиться результат.
Файл-то создается, но, если я передаю расположение файла в качестве строковой переменной, то обрамляю его в PWideChar().
Также команда запуска приложения с параметрами передается в самой CreateProcess и также обрамляется PWideChar().
Но, в итоге файл-то пустой)))
Обычный ShellExecute пишет норм, файл не пустой, а при CreateProcess пустой.
И я никак не могу понять почему.
Поэтому и прошу помощи с этой функцией.
Код:
Код:
procedure Test;
var
  ProcInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
  SecAtrtrs: TSecurityAttributes;
  hOut,hOutDup: THandle;
  withoutdata :string;
begin
  withoutdata:=ExtractFilePath(Application.ExeName);
  --вот это нормально отрабатывает, выводит в файл текст
  --вместо * код команды, это не имеет значения, т.к. код отрабатывает
//  p:=ExtractFilePath(Application.ExeName);
//  ShellExecute(Handle,
//              'open',
//              'cmd.exe',
//              PWideCHar('/c ' + p + '*.exe -* -* ' + p + 'data\' + ' -f ' + p + 'data\c.cfg ' + p + 'data\2.xlsx > ' + p + 'data\R3.txt'),
//              nil,
//              SW_HIDE);


  with SecAtrtrs do
  begin
    nLength := SizeOf(TSecurityAttributes);
    lpSecurityDescriptor := nil;
    bInheritHandle := true;
  end;
  hOut := CreateFile(PWideChar(tempory_dir + 'R4.txt'), GENERIC_WRITE, 0, @SecAtrtrs, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if (hOut = INVALID_HANDLE_VALUE) then  RaiseLastWin32Error;

  GetStartupInfo(StartupInfo);
  with StartupInfo do
  begin
    wShowWindow := SW_SHOWNORMAL; // не показывать окно
    dwFlags := dwFlags or STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    hStdOutput := hOutDup; // присваиваем рукоятку на свой файл
  end;
  Win32Check(CreateProcess(nil, PWideChar('cmd.exe /c ' + withoutdata + '*.exe -*-*' + withoutdata + 'data\' + ' -f ' + withoutdata + 'data\c.cfg' + withoutdata + 'data\2.xlsx'), nil, nil, TRUE,CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcInfo));
  WaitForSingleObject(ProcInfo.hProcess, INFINITE);
  Win32Check(CloseHandle(ProcInfo.hProcess));
  Win32Check(CloseHandle(hOut));
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.11.2018, 09:00   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
  hOut := CreateFile(PWideChar(tempory_dir + 'R4.txt'), GENERIC_WRITE, 0, @SecAtrtrs, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
....
   hStdOutput := hOutDup; // присваиваем рукоятку на свой файл
И?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось artemavd; 14.11.2018 в 09:08.
evg_m вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание всех файлов в папке и вывод их в текстовый файл Vitoster98 Общие вопросы C/C++ 2 07.10.2017 01:37
Вывод из Word 2003 в текстовый файл DBEER Microsoft Office Word 1 07.03.2017 11:21
Вывод линии в текстовый файл Ilya_L Помощь студентам 1 24.10.2011 11:29
Текстовый файл, вывод 123456789igor Паскаль, Turbo Pascal, PascalABC.NET 6 06.06.2011 10:20
Вывод в текстовый файл Krumyura Общие вопросы C/C++ 0 29.03.2010 22:31