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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2010, 01:15   #1
Sadowod
 
Регистрация: 20.08.2010
Сообщений: 3
По умолчанию Ошибка при использовании CreateProcess

Пишу оболочку для запуска консольного кодировщика ogg Vorbis. Сначала всё было нормально, всё работало. Но после незначительных изменений в коде (не в этой функции), после завершения работы кодировщика - вылетает ошибка:
Project ogg.exe raised exception class EAccessViolation with message 'Access violation at adress ... in module 'ogg.exe'. Read of adress 00000000'.

Вот функция, запускающая внешнюю программу:
Код:
function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;

var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;

begin
  CmdLines := Filename + ' ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0); 

  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLines ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;
Уже пару часов пытаюсь разобраться из-за чего так стало происходить, но ничего в голову не приходит...
Sadowod вне форума Ответить с цитированием
Старый 20.08.2010, 03:27   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вообще-то это проблема ogg.exe, а не ваша.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.08.2010, 07:32   #3
Sadowod
 
Регистрация: 20.08.2010
Сообщений: 3
По умолчанию

ogg.exe - это и есть моя программа. Кодировщик зовётся oggenc2.exe...
Sadowod вне форума Ответить с цитированием
Старый 20.08.2010, 09:54   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
Дважды зачем?

Выясни на какой строке падает.
at adress ... - к какой строке относится? посмотри в отладчике
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2010, 14:51   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Sadowod Посмотреть сообщение
ogg.exe - это и есть моя программа. Кодировщик зовётся oggenc2.exe...
Тогда в показанном вами коде ошибок нет. Она где-то ещё. Если запускать под отладчиком - на какой строчке встаёт отладчик при ошибке?

Читать.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Дважды зачем?
Затем, что это разные вещи. Всё правильно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 20.08.2010 в 14:53.
GunSmoker вне форума Ответить с цитированием
Старый 20.08.2010, 16:00   #6
Sadowod
 
Регистрация: 20.08.2010
Сообщений: 3
По умолчанию

Простите, это какие-то происки Delphi
Всё-таки ночью надо спать наверное... А то я себе вбил в голову что ошибка в этой процедуре . Сейчас глянул куда дебагер ставит курсор. Выяснилось что на TStringList.Destroy (он в конце цикла стоял) - хотя я уже несколько альбомов своей оболочкой перекодировал - всё было нормально... Заменил на TStringList.Free - перестал вылетать с ошибкой... Вместо этого выдаёт уже забытое на вид showmessage "Кодирование завершено"...

Последний раз редактировалось Sadowod; 20.08.2010 в 16:04.
Sadowod вне форума Ответить с цитированием
Старый 20.08.2010, 16:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Затем, что это разные вещи.
Извиняюсь за оффтоп, разве освобождение процесса не закрывает все его потоки?
Цитата:
Заменил на TStringList.Free
Опа!! Ты чего класс освобождаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2010, 17:43   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Извиняюсь за оффтоп, разве освобождение процесса не закрывает все его потоки?
Рихтера читать. Срочно. Закрытие описателя <> закрытие процесса.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка dcc70.dll при использовании AnsiUpperCase hello88 Общие вопросы Delphi 8 13.07.2010 16:05
ошибка в tFIBDataSet при использовании параметров. Lokos БД в Delphi 30 25.05.2010 10:32
Ошибка при использовании WorksheetFunction.VLookup imagenable@mail.ru Microsoft Office Excel 2 26.02.2010 12:04
Ошибка при использовании copyfile The Best Общие вопросы Delphi 20 22.07.2009 13:26