Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

Как понять что произошла ошибка DOS приложения ?   Найти похожие ветки 

 
$Инъектор   (2006-01-16 13:25) [0]

Здравствуйте !

Мне необходимо получить код ошибки DOS приложения. То есть понять что ошибка была.

Я выполняю unrar.exe c параметрами и хочу знать, что разархивирование прошло успешно. Как можно сделать ?


 
tesseract ©   (2006-01-16 13:32) [1]

Получи вывод консольного приложения на себя и читай лог - он скажет. А почему бы не использовать unrar.dll?


 
$Инъектор   (2006-01-16 13:39) [2]

Получи вывод консольного приложения на себя и читай лог - он скажет.
У меня много файлов обрабатывается и я не могу читать кучу логов об успешности выполнения комманд (нужно в конечном итоге знать - какие файлы не обработаны).

А почему бы не использовать unrar.dll?

Пользователю проще будет найти новый exe чем dll (старым rar- om не распакуешь новый). Если можешь кинь ссылку на пример использования с unrar.dll.


 
$Инъектор   (2006-01-16 13:42) [3]

А в чём преимущество unrar.dll - не нужно писать процедуру, которая будет ждать завершения работы архиватора ?


 
TUser ©   (2006-01-16 13:44) [4]


> и я не могу читать кучу логов

Почему?


 
$Инъектор   (2006-01-16 13:46) [5]

Вот нарыл:

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;



 
$Инъектор   (2006-01-16 13:48) [6]

TUser ©   (16.01.06 13:44) [4]

Почему?

Просто не хочу ! Я лучше гору кода напишу чем делать чтото вручную.


 
Гаврила ©   (2006-01-16 14:16) [7]

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


 
$Инъектор   (2006-01-16 17:10) [8]

Уже понял !


 
tesseract ©   (2006-01-16 17:12) [9]


> Пользователю проще будет найти новый exe чем dll (старым
> rar- om не распакуешь новый). Если можешь кинь ссылку на
> пример использования с unrar.dll.

Млин Ты что пишешь-то ?


 
$Инъектор   (2006-01-16 17:14) [10]

Кто нить юзал TDFunrar - компонент для работы с rar архивами ? Хелп по нему можно гдето слить ?


 
$Инъектор   (2006-01-16 17:19) [11]

Млин Ты что пишешь-то ?

Да блин нормальную работу с архивами RAR нужно обеспечить средствами  моей программы. Мои вопросы могут показаться глупы так как я web-программист и с delphi не часто имею дело.

Сейчас передо мной проблема - мне надо понять каков рузультат разархивирования положительный или нет (тое сть была ли ошибка).


 
Гаврила ©   (2006-01-16 17:54) [12]

$Инъектор  

Запускай внешнюю команду с помошью CreateProcess
и жди окончания выполнения (WaitForSingleObject)
затем смотри ExitCode
все просто.


 
Гаврила ©   (2006-01-16 17:59) [13]

что-то типа
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 18:30) [14]

Спасибо Гаврилыч ! Работает !!!

Я вот доку нарыл по процессам - надо разобраться, а то с ними не возился ещё.



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
2-1142567121
alex111
2006-03-17 06:45
2006.04.02
Function из edit


2-1142839231
Naganov
2006-03-20 10:20
2006.04.02
Про ComboBox


2-1142493856
serg111111
2006-03-16 10:24
2006.04.02
Помогите с сервисом


15-1142229826
Некто
2006-03-13 09:03
2006.04.02
Полезные физические упражнения


2-1142862337
Alex7
2006-03-20 16:45
2006.04.02
Операция :=