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

Выявление ошибок компиляции из командной строки

Delphi , Синтаксис , Синтаксис

При работе с проектом в Delphi можно запускать процесс сборки проекта непосредственно из IDE, но также есть возможность автоматизировать этот процесс, запуская его из командной строки. При этом, если при сборке проекта нет ошибок, все работает исправно и ShellExecute возвращает значение "42". Однако, если во время сборки происходят ошибки, то ShellExecute все равно возвращает это же значение "42", что затрудняет выявление проблем.

Для обнаружения ошибок компиляции из командной строки можно воспользоваться функцией CreateProcess() (или ShellExecuteEx()), которая позволяет получить дескриптор процесса. После этого, с помощью функции WaitForSingleObject() можно дождаться окончания процесса и получить его код завершения с помощью GetExitCodeProcess(). Пример кода на Object Pascal (Delphi) представлен ниже:

var
  cmd: string;
  si: TStartupInfo;
  pi: TProcessInformation;
  exitCode: DWORD;

cmd := '"[PATH-TO-DELPHI]\Bin\DCC32.EXE" -B "[PATH-TO-PROJECT]\MyProject.dpr"';
UniqueString(cmd);

si := Default(TStartupInfo);
si.cb := sizeof(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;

if not CreateProcess(nil, PChar(cmd), nil, nil, False, 0, nil, PChar('[PATH-TO-PROJECT]'), si, pi) then
  RaiseLastOSError;

CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, exitCode);
CloseHandle(pi.hProcess);

// use exit Code as needed...

Если значение exitCode не равно нулю, значит при сборке проекта произошли ошибки.

Также можно использовать функцию RunAndWait(), которая waits for the process to finish and returns the exit code (0 для success, non-zero для failure):

uses
  Winapi.ShellAPI;

function RunAndWait(hWnd: HWND; filename: string; Parameters: string; var ProcExitCode: Cardinal): Boolean;
var
  sei: TShellExecuteInfo;
begin
  ZeroMemory(@sei, SizeOf(sei));
  sei.cbSize := SizeOf(TShellExecuteInfo);
  sei.Wnd := hwnd;
  sei.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC or SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := PChar('open');
  sei.lpFile := PChar(Filename);
  if parameters <> '' then
    sei.lpParameters := PChar(parameters);
  sei.nShow := SW_SHOWNORMAL;

  Result := ShellExecuteEx(@sei);
  try
    WaitForSingleObject(sei.hProcess, INFINITE);

    // If ShellExecuteEx succeeded, then get the exit code of the process we ran
    if Result then
      if not GetExitCodeProcess(sei.hProcess, ProcExitCode) then
        raise Exception.Create('Error ' + IntToStr(GetLastError) + ' during GetExitCodeProcess call');

  finally
    CloseHandle(sei.hProcess);
  end;
end;

Таким образом, можно автоматизировать процесс сборки проекта в Delphi из командной строки и выявлять ошибки компиляции.

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

При работе с проектом в Delphi можно запускать процесс сборки проекта непосредственно из IDE, но также есть возможность автоматизировать этот процесс, запуская его из командной строки. Однако, при сборке проекта ShellExecute возвращает значение


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

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




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


:: Главная :: Синтаксис ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 10:38:18/0.032176971435547/1