При работе с проектом в 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