Текущий архив: 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.48 MB
Время: 0.039 c