Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Agat330
0 / 0 / 0
Регистрация: 10.08.2013
Сообщений: 9
#1

Ошибка Access Violation в CreateProcess - Delphi WinAPI

08.12.2016, 23:41. Просмотров 465. Ответов 4
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
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
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
procedure Tfrm_Main.RunDosInMemo (CmdLine: string; OutputMemo: TMemo);
const
  ReadBuffer = 2400;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PAnsiChar;
  BytesRead: DWord;
  Apprunning: DWord;
begin
  OutputMemo.Clear;
  Screen.Cursor := CrHourGlass;
 
  with Security do
  begin
    nLength := SizeOf(TSecurityAttributes);
    bInheritHandle := true;
    lpSecurityDescriptor := nil;
  end;
 
  if Createpipe(ReadPipe,
                WritePipe,
                @Security,
                0)
  then
    begin
      Buffer := AllocMem(ReadBuffer + 1);
      FillChar(Start, Sizeof(Start), #0);
      start.cb := SizeOf(start);
      start.hStdOutput := WritePipe;
      start.hStdInput := ReadPipe;
      start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
      start.wShowWindow := SW_HIDE;
 
 
      if CreateProcess(nil,
                       PChar(CmdLine),
                       @Security,
                       @Security,
                       true,
                       NORMAL_PRIORITY_CLASS,
                       nil,
                       nil,
                       start,
                       ProcessInfo)
      then
        begin
          repeat
            Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
            ReadFile(ReadPipe,
                     Buffer[0],
                     ReadBuffer,
                     BytesRead,
                     nil);
            Buffer[BytesRead] := #0;
            OemToAnsi(Buffer, Buffer);
            OutputMemo.Text := OutputMemo.text + string(Buffer);
 
            Application.ProcessMessages;
          until (Apprunning <> WAIT_TIMEOUT);
        end;
 
      FreeMem(Buffer);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
      CloseHandle(ReadPipe);
      CloseHandle(WritePipe);
    end;
end;


Эта процедура великолепно работала в D7, но когда перенес код в D2010 CreateProcess начал выдавать AccessViolation (см. скриншот). Вызываю так:
Pascal
1
RunDosInMemo('powercfg -list', Memo);
Что я делаю неправильно и как это лечить?
Миниатюры
Ошибка Access Violation в CreateProcess  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 23:41     Ошибка Access Violation в CreateProcess
Посмотрите здесь:
Access Violation при создании MDIChild формы в .dll XE7 Delphi WinAPI
Delphi WinAPI CreateProcess() и запуск приложения
CreateProcess работает странно в D10 Delphi WinAPI
Delphi WinAPI Запуск приложения через CreateProcess и ожидание его завершения
Как правильно инициировать StartupInfo при запуске внешнего приложения CreateProcess? Delphi WinAPI
Virtual Dub, ошибка во время рендеринга: An out-of-bounds memory access (access violation) Софт
Ошибка при Parent - нестабильная ошибка Access Violation Delphi FireMonkey
Ошибка: Access violation Delphi
Ошибка Access violation C++ Builder
Delphi Ошибка Access violation
Ошибка: Access violation Delphi
Ошибка access violation C++ Builder

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Joey
Джоуи Скалолазер
392 / 306 / 87
Регистрация: 05.05.2015
Сообщений: 1,792
Записей в блоге: 2
11.01.2017, 00:10     Ошибка Access Violation в CreateProcess #2
Agat330, Вы б хотя бы написали, где конкретно возникает ошибка.
Так вот, ради проверки Вашей проблемы установил 2010, и ошибка действительно возникает, как оказалось, на 38 строке:
Delphi
1
2
3
4
5
6
7
8
9
10
if CreateProcess(nil,
                       PChar(CmdLine),
                       @Security,
                       @Security,
                       true,
                       NORMAL_PRIORITY_CLASS,
                       nil,
                       nil,
                       start,
                       ProcessInfo)
Кликните здесь для просмотра всего текста
Включаем логику: один и тот же код работает и не работает в двух довольно близких друг от друга версиях 2007 и 2010, поэтому разбираем CreateProcess по аргументам:
- nil // nil он и в Африке nil
- @Security // всего лишь адрес, вряд ли их обработка поменялась в среде ))
- true // true, true...
- start: TStartupInfo, NORMAL_PRIORITY_CLASS и ProcessInfo - windows-овские, и от Делфей не зависят.

Остается PChar(CmdLine), а, как известно, строки - это ОЧЕНЬ больная тема (нет единого стандарта, все пилят кто на что горазд, одних кодовых страниц столько зафигачено...).


Ладно, перейду сразу к соли:
Difference between PAnsiChar and PChar
В предшествующих 2010 версии дельфях PChar и PAnsiChar - одно и то же. В 2010 уже нет. Поэтому меняем
Delphi
1
procedure Tfrm_Main.RunDosInMemo (CmdLine: string; OutputMemo: TMemo);
на
Delphi
1
procedure Tfrm_Main.RunDosInMemo (CmdLine: widestring; OutputMemo: TMemo);
Но с кириллицей - это уже отдельная история...
BadBoyBlue
Заблокирован
05.02.2017, 15:16     Ошибка Access Violation в CreateProcess #3
Функция CreateProcess написана криво: она неявно выполняет какие-то махинации с параметром lpCommandLine, поэтому его нельзя передавать как константу. Выход только один:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure Tfrm_Main.RunDosInMemo (CmdLine: string; OutputMemo: TMemo);
var
   S:string;
begin
   S:=CmdLine;
   UniqueString(S); // отвязываем указатель от аргумента, а дальше уже
 
if CreateProcess(nil,
                       PChar(S),
                  ...
Joey
Джоуи Скалолазер
392 / 306 / 87
Регистрация: 05.05.2015
Сообщений: 1,792
Записей в блоге: 2
05.02.2017, 17:03     Ошибка Access Violation в CreateProcess #4
BadBoyBlue, пользователь спросил, как сделать X, я ему ответил, как сделать X. Можно так делать, или нельзя, обсуждайте с самим пользователем.
vavun
Эксперт HardwareЭксперт Windows
8593 / 4350 / 658
Регистрация: 07.04.2013
Сообщений: 12,945
Записей в блоге: 2
05.02.2017, 17:10     Ошибка Access Violation в CreateProcess #5
BadBoyBlue, жаловаться на оскорбления и понижение репутации после того, как сами начали с оскорблений по меньшей мере глупо.
 Комментарий модератора 
Призыв ко всем - держите себя в руках, пожалуйста.
Yandex
Объявления
05.02.2017, 17:10     Ошибка Access Violation в CreateProcess
Ответ Создать тему
Опции темы

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