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

Вниз

Не могу разобраться ...   Найти похожие ветки 

 
Solod ©   (2002-03-14 03:58) [0]

Функция
WinExec( запуск архиватора ARJ с созданием архива, содержащего 2 файла ),SW_HIDE)
архивирует только один первый файл если далее стоит
if MessageDlg()
помогите позжайлуста.


 
Song ©   (2002-03-14 08:39) [1]

приведи кокнкретную строку стоящую в WinExec только не ту, которую ты приводил раньше с нагромождением всяких функций, а транслируй её в текст при трассировке и напиши здесь. Кстати, может после этого сам найдёшь свою ошибку.


 
Solod ©   (2002-03-14 09:32) [2]

Дело в том, что строка "arj a -e C:\ARJ\arh.arj C:\FILES\file1.DBF C:\FILES\file2\DBF" обрабатывается нормально,
если я убираю далее стоящее if MessageDlg()=mrYes then ...
Иначе - оба файла архивируются в первый раз, после запуска приложения, а далее в архив попадает только первый файл.
Короче происходит что-то не понятное.


 
Song ©   (2002-03-14 10:08) [3]

MessageDlg в твоём случае не будет ждать до тех пор пока WinExec завершит свою работу, поэтому процесс архивации блокируется чем-то, стоящим после MessageDlg. Приведи больший кусок кода.


 
Solod ©   (2002-03-14 10:45) [4]

Интересно, а почему MessageDlg не ждет WinExec.
Объясните поподробнее.
Вод код:
if MessageDlg(текст , [mbYes, mbNo], 0)=mrYes then
begin
if CopyFile(PStr1, PStr2, False) then MessageDlg(
тексттекст , )
else MessageDlg((
текст );
end

Спасибо за отклик.


 
Song ©   (2002-03-14 11:14) [5]

:))
А почему WinExec должен что-то ждать?
У Вас инструкции следуют одна за другой и они все выполняются одна за другой. Когда Вы запускаете WinExec она в свою очередь запускает ShellExecute, которая запускает ваше приложение в отдельном процессе. А выполнение же Вашей основной программы продолжается как прежде (почитайте статью о потоках и процессах на этом сайте).
Вы бы могли убедиться в этом, просто заменив SW_HIDE на SW_SHOWNORMAL и увидите, что процесс архиватора работает, а сообещение, предусмотренное в MessageDlg уже вывелось.
Поэтому проблема в следующем: так процесс arj.exe был для Вас скрыт, то Вы видя сообщение в MessageDlg и решив, что архиватор типа уже закончил работу, преспокойно заершали работу своего приложения, однако arj.exe выполняемый в отдельном потоке не успевал ещё сархивировать второй файл и обрывался. Поэтому второй файл не был добавлен. Однако если MessageDlg не выводилось то выполнение текущей процедуры заканчивалось, и управление основным процессом отдавалось снова главной форме. Вот здесь почему всё работало ok, я не уверен.
Чтобы написать процедуру, которая будет ждать выполнения процесса arj.exe поместите следующий текст:



Procedure TForm5.CrProcess(S:String);
Var SeInfo:TShellExecuteInfo;
ExecuteFile:String;
ExitCode:DWord;
Begin
ExecuteFile:="arj.exe;
FillChar(SEInfo,SizeOf(SEInfo),0);
With SEInfo Do
Begin
cbSize:=SizeOf(TShellExecuteInfo);
fmask:=SEE_MASK_NOCLOSEPROCESS;
Wnd:=Application.Handle;
lpFile:=PChar(ExecuteFile);
lpParameters:=PChar(S);
lpDirectory:=PChar(TempPath);
nShow:=SW_HIDE;
End;
IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess,ExitCode);
Until(ExitCode<>STILL_ACTIVE) or (Application.Terminated) else MessageDlg("Ошибка создания внешнего процесса.",mtError,[mbAbort],0);
End;



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

Всё бы Ok, но недавно писав такую задачу и именно для arj.exe у меня не получилось это сделать. Вот почему: по какой-то причине arj.exe по завершению работы не выходит по коду ExitCode=STILL_ACTIVE и прога висит, думая, что процесс всё ещё выполняется. У меня работало всё, но только не arj.exe. Поэтому, если у Вас будет такая же ситуация замените концовку кода на следующий отрывок:

....


IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess,ExitCode);
IF FindWindow(nil,"(Сеанс завершен) - Arj")<>0 then
Begin
SendMessage(FindWindow(nil,"(Сеанс завершен) - Arj"),WM_CLOSE,0,0);
Application.ProcessMessages;
Break;
End;
Until False else MessageDlg("Ошибка создания внешнего процесса.",mtError,[mbAbort],0);


И тогда всё будет Ok. Уф, наконец-то. :))


 
Solod ©   (2002-03-14 11:44) [6]

Еще не проверил, но ,все равно, большое СПАСИБО за полный и ясный ответ!


 
Solod ©   (2002-03-19 04:37) [7]

Song>
Если можешь, опиши при помощи CreateProcess.
Я пробовал вклеить, что-то не получается.


 
Song ©   (2002-03-19 08:26) [8]

Что описать?
Просто вставьте процедурку и всё будет работать. Ok, если не работает, то что именно?


 
Solod ©   (2002-03-19 11:10) [9]

Ладно, я плюнул на свои эксперименты и пробую полностью вставить Ваш код. Компилятор не знакет TShellExecuteInfo. В чем дело?


 
Song ©   (2002-03-19 13:22) [10]

Uses ShellApi не помогает?


 
Solod ©   (2002-03-19 14:04) [11]

Ура, спосибо!!!


 
Solod ©   (2002-03-19 14:04) [12]

Ура, спасибо!!!



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

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

Наверх




Память: 0.5 MB
Время: 0.008 c
3-34
Mike c
2002-03-04 19:53
2002.04.01
не соединяется с базой IB! :(


1-184
Юрий Федоров
2002-03-19 18:03
2002.04.01
Общее адресное пространство для двух процессов


6-272
vajo
2002-01-22 08:36
2002.04.01
eMail


3-33
solsoft
2002-03-06 13:43
2002.04.01
Нет доступа к Access через BDE


1-185
JibSkeart
2002-03-17 16:28
2002.04.01
Как Узнать программно и можноли что у Файла досовская (Рус) кодировка ??