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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 23:05   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию EAccessViolation , проблема с ExtractFilePath > LastDelimiter > @LStrLen

Всем привет, начала возникать ошибка:

Access violation at address 00404CB8 in module 'DSE.exe'. Read of address 7C205D2E.


Вот где:
Код:
      prc := CreateProcess(
        PChar(AppInfo.FileExe),
        PChar(CheckStr(AppInfo.RunParams)),
        nil,
        nil,
        False,
        GetPriority(AppInfo.CPUPriority),
        nil,
        PChar(ExtractFilePath(AppInfo.FileExe)),
        SI,
        PI); //создаём процесс
Вот что выдаёт MadExcept:
Код:
00404cb8 +004 DSE.exe System                @LStrLen
00453f0e +00a DSE.exe SysUtils              LastDelimiter
00453f62 +00e DSE.exe SysUtils              ExtractFilePath
005dc849 +2f5 DSE.exe AppThreadUnit 171 +88 TAppThread.Execute
Как это решить, и почему оно возникает(спонтанно)?
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2011, 00:35   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
BOOL CreateProcess(

LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
Сдается мне, что вы внутри проги пытаетесь создать ее же копию...
asmodey1 вне форума Ответить с цитированием
Старый 31.01.2011, 01:22   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

т.е. вместо
Код:
      prc := CreateProcess(
        PChar(AppInfo.FileExe),
        PChar(CheckStr(AppInfo.RunParams)),
        nil,
        nil,
        False,
        GetPriority(AppInfo.CPUPriority),
        nil,
        PChar(ExtractFilePath(AppInfo.FileExe)),
        SI,
        PI); //создаём процесс
Надо:
Код:
      prc := CreateProcess(
        PChar(AppInfo.FileExe),
        PChar(CheckStr(AppInfo.RunParams)),
        nil,
        nil,
        False,
        GetPriority(AppInfo.CPUPriority),
        nil,
        nil,
        SI,
        PI); //создаём процесс
?
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2011, 08:25   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Кто такой AppInfo и FileExe - мы должны, я так понимаю, угадать?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.01.2011, 16:35   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

AppInfo - record
соответственно AppInfo.FileExe хнанит полный путь до exe файла(включительно).

Собственно вопрос не раскрыт.
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2011, 16:52   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> Собственно вопрос не раскрыт

Из-за тебя же он и не раскрыт)
Из тебя ж клещами нужно вытягивать декларацию и инициализацию структуры AppInfo)
mss вне форума Ответить с цитированием
Старый 31.01.2011, 17:49   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вопрос стоит так:
Запускается сторонняя программа средством CreateProcess
Следуя описанию оного из #2:
Цитата:
BOOL CreateProcess(

LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
для стороннего запускаемого приложения нужно ли указывать LPCTSTR lpCurrentDirectory? Или вместо него ставитьnil?

Вот в чём вопрос.

mss
Я думал это не нуждалось в описании, раз уж упомянута CreateProcess.
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2011, 17:52   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
для стороннего запускаемого приложения нужно ли указывать LPCTSTR lpCurrentDirectory? Или вместо него ставитьnil?
не обязательно.
и то, нужно лишь в том случае когда вы хотите явно указать текущую директорию, а не чтоб она от вашего приложения наследовалась.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.01.2011, 21:32   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Благодарен! Вопрос исчерпан!
Человек_Борща вне форума Ответить с цитированием
Старый 31.01.2011, 21:51   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ничего он не исчерпан.

CreateProcess тут вообще ни при чём.

У тебя AV при работе с FileExe. С учётом того, что это String-вое поле в записи - у тебя 100% баг порчи памяти в программе сидит. С чем я тебя и поздравляю.

Читать.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Extractfilepath ttjke Помощь студентам 1 29.04.2010 19:20
Что за EAccessViolation? Anekdot Общие вопросы Delphi 12 03.08.2009 14:38
Еще раз о EAccessViolation. Andre1723 Общие вопросы Delphi 12 23.02.2009 01:39
ExtractFilePath subsonic Общие вопросы Delphi 6 24.01.2008 20:02
Ошибка EAccessViolation num8er Общие вопросы Delphi 6 10.10.2007 08:00