Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
1-132
DenKop
2002-03-21 19:50
2002.04.01
Криптография


1-238
AlexMey
2002-03-19 12:59
2002.04.01
Создание собственных классов?


14-306
Виктор Щербаков
2002-02-19 09:40
2002.04.01
Площадь многоугольника


3-30
Vasilii
2002-03-06 16:00
2002.04.01
Select к двум различным IB БД


3-54
Malder
2002-03-06 16:58
2002.04.01
Ошибка при query1.edit;





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский