Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 10.08.2013
Сообщений: 9

Ошибка Access Violation в CreateProcess

08.12.2016, 23:41. Показов 3434. Ответов 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  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2016, 23:41
Ответы с готовыми решениями:

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

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

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

4
Джоуи
 Аватар для Joey
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
11.01.2017, 00:10
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
Заблокирован
05.02.2017, 15:16
Функция 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
1083 / 645 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
05.02.2017, 17:03
BadBoyBlue, пользователь спросил, как сделать X, я ему ответил, как сделать X. Можно так делать, или нельзя, обсуждайте с самим пользователем.
0
 Аватар для vavun
10592 / 5555 / 864
Регистрация: 07.04.2013
Сообщений: 15,660
05.02.2017, 17:10
BadBoyBlue, жаловаться на оскорбления и понижение репутации после того, как сами начали с оскорблений по меньшей мере глупо.
 Комментарий модератора 
Призыв ко всем - держите себя в руках, пожалуйста.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2017, 17:10
Помогаю со студенческими работами здесь

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

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

Virtual Dub, ошибка во время рендеринга: An out-of-bounds memory access (access violation)
Virtual Dub ошибка во время рендинга, осталось совесем чуть чуть и тут ошыбка. Но так не со всеми видео,а с некоторыми.

Ошибка при Parent - нестабильная ошибка Access Violation
Добрый день. У меня возникает странная ошибка, раньше с такой не сталкивался. У меня есть свой класс визуального компонента, при его...

Ошибка Access violation...
Доброго времени суток! Выполняю запрос на изменение данных. Первый раз запрос выполняется нормально! Когда выполняю следующий запрос, меняю...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru