![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как понять что произошла ошибка DOS приложения ? [D6, Win2k]
$Инъектор © (2006-01-16 13:25:00)Здравствуйте !
Мне необходимо получить код ошибки DOS приложения. То есть понять что ошибка была.
Я выполняю unrar.exe c параметрами и хочу знать, что разархивирование прошло успешно. Как можно сделать ?
$Инъектор (2006-01-16 18:30:00) [1]Спасибо Гаврилыч ! Работает !!!
Я вот доку нарыл по процессам - надо разобраться, а то с ними не возился ещё.
Гаврила (2006-01-16 17:59:00) [2]что-то типа
procedure CreateProcessWaitExit(const CommandLine: string; Hidden: Boolean);
var
si: TStartupInfo;
siP: TProcessInformation;
saP,saT: TSecurityAttributes;
ExitCode: DWORD;
begin
// подготовка запуска процесса
FillChar(si,sizeof(si),#0);
si.cb:=sizeof(si);
if Hidden then
begin
si.dwFlags:=STARTF_USESHOWWINDOW;
si.wShowWindow:=SW_HIDE;
end;
saP.nLength:=sizeof(saP);
saP.lpSecurityDescriptor:=nil;
saP.bInheritHandle:=false;
saT.nLength:=sizeof(saT);
saT.lpSecurityDescriptor:=nil;
saT.bInheritHandle:=false;
// запуск о ожидание окончания проверок
if not CreateProcess(nil,pChar(CommandLine),@saP,@saT,false,0,nil,nil,si,siP) then
RaiseLastOSError;
CloseHandle(siP.hThread);
WaitForSingleObject(siP.hProcess, INFINITE);
GetExitCodeProcess(siP.hProcess, ExitCode);
CloseHandle(siP.hProcess);
if ExitCode <> 0 then
begin
{ОБРАБОТКА ОШИБКИ}
end;
end;
Гаврила (2006-01-16 17:54:00) [3]$Инъектор
Запускай внешнюю команду с помошью CreateProcess
и жди окончания выполнения (WaitForSingleObject)
затем смотри ExitCode
все просто.
$Инъектор (2006-01-16 17:19:00) [4]
Млин Ты что пишешь-то ?
Да блин нормальную работу с архивами RAR нужно обеспечить средствами моей программы. Мои вопросы могут показаться глупы так как я web-программист и с delphi не часто имею дело.
Сейчас передо мной проблема - мне надо понять каков рузультат разархивирования положительный или нет (тое сть была ли ошибка).
$Инъектор (2006-01-16 17:14:00) [5]Кто нить юзал TDFunrar - компонент для работы с rar архивами ? Хелп по нему можно гдето слить ?
tesseract (2006-01-16 17:12:00) [6]
> Пользователю проще будет найти новый exe чем dll (старым
> rar- om не распакуешь новый). Если можешь кинь ссылку на
> пример использования с unrar.dll.
Млин Ты что пишешь-то ?
$Инъектор (2006-01-16 17:10:00) [7]Уже понял !
Гаврила (2006-01-16 14:16:00) [8]автору.
Указанный тобой способ не годится
потому что он отслеживает только успешный запусквнешнего приложения
а тебе надо отследить успешное завершение
то есть если ошибка произойдет в процессе разархивации, ты обломишься
$Инъектор (2006-01-16 13:48:00) [9]TUser © (16.01.06 13:44) [4]
Почему?
Просто не хочу ! Я лучше гору кода напишу чем делать чтото вручную.
$Инъектор (2006-01-16 13:46:00) [10]Вот нарыл:
function TForm1.StartWithShell(Prog, par, Verz: string;
var hProcess: THandle): DWord;
var
exInfo: TShellExecuteInfo;
begin
hProcess := 0;
FillChar(exInfo, Sizeof(exInfo), 0);
with exInfo do
begin
cbSize:= Sizeof(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := 0;
lpVerb:= 'open';
lpParameters := PChar(par);
lpFile:= Pchar(prog);
nShow := SW_HIDE;
end;
Result := ERROR_SUCCESS;
if ShellExecuteEx(@exInfo) then
hProcess := exinfo.hProcess
else
Result := GetLastError;
end;
function TForm1.StartProgramm : Boolean;
var
r, ExitCode: DWord;
err: string;
hProcess: THandle;
begin
Result := False;
r := StartWithShell('rar.exe', , 'c:\windows\system',
hProcess);
if r = ERROR_SUCCESS then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(hProcess, ExitCode);
until
ExitCode <> STILL_ACTIVE;
result := true;
end
else
begin
case r of
ERROR_FILE_NOT_FOUND : err:='The specified file was not found.';
ERROR_PATH_NOT_FOUND : err:='The specified path was not found.';
ERROR_DDE_FAIL : err:='The DDE transaction failed.';
ERROR_NO_ASSOCIATION : err:='There is no application associated ' +
'with the given filename extension.';
ERROR_ACCESS_DENIED : err:='Access denied';
ERROR_DLL_NOT_FOUND : err:='DLL not found';
ERROR_CANCELLED : err:='The function prompted the user for the ' +
'location of the application, but the user cancelled the request.';
ERROR_NOT_ENOUGH_MEMORY: err:='Not enough memory';
ERROR_SHARING_VIOLATION: err:='A sharing violation occurred.';
else
err := 'Unknown';
end;
MessageDlg('Error: ' + err, mtError, [mbOk], 0);
end;
end;
TUser (2006-01-16 13:44:00) [11]
> и я не могу читать кучу логов
Почему?
$Инъектор (2006-01-16 13:42:00) [12]А в чём преимущество unrar.dll - не нужно писать процедуру, которая будет ждать завершения работы архиватора ?
$Инъектор (2006-01-16 13:39:00) [13]
Получи вывод консольного приложения на себя и читай лог - он скажет.
У меня много файлов обрабатывается и я не могу читать кучу логов об успешности выполнения комманд (нужно в конечном итоге знать - какие файлы не обработаны).
А почему бы не использовать unrar.dll?
Пользователю проще будет найти новый exe чем dll (старым rar- om не распакуешь новый). Если можешь кинь ссылку на пример использования с unrar.dll.
tesseract (2006-01-16 13:32:00) [14]Получи вывод консольного приложения на себя и читай лог - он скажет. А почему бы не использовать unrar.dll?