Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение ошибки доступа к памяти при запуске MS-DOS батч-скрипта из Delphi 2010

Delphi , Интернет и Сети , Браузер

При работе с Delphi 2010 разработчики могут столкнуться с ошибкой доступа к памяти при попытке запуска MS-DOS батч-скриптов из своего приложения. Это может быть вызвано различными причинами, в том числе и несовместимостью кода с новыми версиями Windows API. В данной статье мы рассмотрим, как можно устранить такую ошибку, основываясь на пересказе материала из контекста, который уже содержит решение проблемы.

Описание проблемы

Разработчик столкнулся с ошибкой доступа к памяти при использовании старого кода, который работал в Delphi 6, в приложении Delphi 2010. Ошибка возникает при вызове функции CreateProcess и выглядит следующим образом:

"Project1.exe raised exception class EAccessViolation with message 'Access violation at address 7C82F29C in module 'kernel32.dll'. Write of address 004A3B82".

Пример кода, вызывающего ошибку

procedure TForm1.BatchProgramCall;
var
    StartInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    createOK: Boolean;
begin
    FillChar(StartInfo, SizeOf(TStartupInfo), #0);
    FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
    StartInfo.cb := SizeOf(TStartupInfo);
    StartInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartInfo.wShowWindow := SW_SHOWMINIMIZED;

    createOK := CreateProcess(
        Nil, PChar('SOMEBATCHPROGRAM.BAT'), Nil, Nil, false,
        CREATE_NEW_PROCESS_GROUP + HIGH_PRIORITY_CLASS,
        NIL, NIL, STARTINFO, PROCINFO);

    if createOK then
        WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;

Подтвержденное решение

Ошибка возникает из-за того, что функция CreateProcessW не должна вызываться с параметром lpCommandLine, который является неизменяемой строкой. В Delphi 2010 это становится проблемой, так как в отличие от Delphi 6, где Windows автоматически создавал изменяемый буфер, теперь это не происходит.

Чтобы решить проблему, необходимо использовать функцию UniqueString, которая создаст изменяемую копию строки:

procedure TForm1.BatchProgramCall;
var
    StartInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    createOK: Boolean;
    sMyBat: string;
begin
    FillChar(StartInfo, SizeOf(TStartupInfo), #0);
    FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
    StartInfo.cb := SizeOf(TStartupInfo);
    StartInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartInfo.wShowWindow := SW_SHOWMINIMIZED;

    sMyBat := 'SOMEBATCHPROGRAM.BAT';
    UniqueString(sMyBat); // Создаем изменяемую копию строки

    createOK := CreateProcess(
        Nil, PChar(sMyBat), Nil, Nil, false,
        CREATE_NEW_PROCESS_GROUP + HIGH_PRIORITY_CLASS,
        NIL, NIL, STARTINFO, PROCINFO);

    if createOK then
        WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;

Альтернативный ответ и дополнительные рекомендации

Также стоит отметить, что для запуска батч-скрипта необходимо указать интерпретатор командной строки (cmd.exe) и передать ему имя скрипта как аргумент. Например:

createOK := CreateProcess(
    'cmd.exe', PChar('/c SOMEBATCHPROGRAM.BAT'), Nil, Nil, false,
    CREATE_NEW_PROCESS_GROUP + HIGH_PRIORITY_CLASS,
    NIL, NIL, STARTINFO, PROCINFO);

Заключение

При работе с функциями Windows API важно учитывать их требования к параметрам и возможные изменения в поведении функций между версиями Delphi. Использование функции UniqueString позволяет решить проблему с изменяемостью строки, а правильное указание интерпретатора командной строки позволяет корректно запустить MS-DOS батч-скрипт из приложения Delphi 2010.

Создано по материалам из источника по ссылке.

Устранение ошибки доступа к памяти при попытке запуска MS-DOS батч-скриптов из приложения Delphi 2010 связано с необходимостью использования функции `UniqueString` для создания изменяемой копии строки в параметре `lpCommandLine` функции `CreateProcess`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-29 10:10:51/0.0052320957183838/1