Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и WinAPI

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

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

08.12.2016, 23:41. Просмотров 871. Ответов 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);
Что я делаю неправильно и как это лечить?
0
Миниатюры
Ошибка Access Violation в CreateProcess  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2016, 23:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка Access Violation в CreateProcess (Delphi WinAPI):

Ошибка: Access Violation при создании MDIChild формы в dll XE7 - Delphi WinAPI
Здравствуйте коллеги. Два дня бьюсь, не могу решить, очень нужна ваша помощь. Суть проблемы: есть приложение написанное на delphi 7,...

Создание COM-сервера.Ошибка Access violation - Delphi
Возникла проблема при создании COM-сервера. Поэтапно: 1.Создаю библиотеку ActiveX Library 2.Создаю COM-объект.В нем создаю два...

TList. Ошибка Access Violation при создании. - Delphi
Имеется такая структура данных: type TMyList = class private FMyList: TList; public property MyList: TList read FMyList...

В программе появляется ошибка(Access violation)б если используется большой файл - Delphi
Уважаемые форумчане. Нужна ваша помощь(срочно) - завтра -крайний срок. Это программа для поискаинформации о книгах в текстовом файле....

ActiveX ошибка: Х Access violation at address xx in module 'xxx.ocx'.Read of adress 0000030. - Delphi
Подскажите, кто знает Не могу обратиться к свойству главной формы (например ActivexForm.Left ) при попытке обратиться выдает ошибку ...

Ошибка Access violation at adress 0046B96C in module 'Project2.exe'. Write of adress 00000020 - Delphi
Создаю почтовый клиент. Когда хочу получить список список писем возникает такая ошибка. Вот код первой формы, на ней я вхожу в саму...

4
Joey
Модератор
822 / 543 / 146
Регистрация: 05.05.2015
Сообщений: 3,143
Записей в блоге: 1
11.01.2017, 00:10 #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);
Но с кириллицей - это уже отдельная история...
0
BadBoyBlue
Заблокирован
05.02.2017, 15:16 #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),
                  ...
0
Joey
Модератор
822 / 543 / 146
Регистрация: 05.05.2015
Сообщений: 3,143
Записей в блоге: 1
05.02.2017, 17:03 #4
BadBoyBlue, пользователь спросил, как сделать X, я ему ответил, как сделать X. Можно так делать, или нельзя, обсуждайте с самим пользователем.
0
vavun
Заблокирован
05.02.2017, 17:10 #5
BadBoyBlue, жаловаться на оскорбления и понижение репутации после того, как сами начали с оскорблений по меньшей мере глупо.
 Комментарий модератора 
Призыв ко всем - держите себя в руках, пожалуйста.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2017, 17:10
Привет! Вот еще темы с ответами:

Воспроизведение mp3-мелодий, ошибка "Access violation at address 00469E29 in module 'MobileCollection.exe'. Read of address 00000484" - Delphi
Всем привет! В программе часто вызываю: WMP_Music.URL:=полный путь к mp3-песне;; WMP_Music.controls.play; WMP_Music -...

AssignFile и access violation - Delphi
Подскажите, в каких случаях может возникать ошибка access violation в строке с AssignFile? // Сохранение ответа procedure...

Access Violation в подпрограмме - Delphi
Доброго вечера, не сильно разбираюсь в Deplhi, почти написал программу, которая по заданным числам массива из 11 элементов, сначала...

Access violation at adress - Delphi
Собственно говоря, вот элемент кода, ошибка при попытке выполнить сроку setlength(masofFD2, fv2); for i:=0 to length(arofd)-1 do ...


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

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

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