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

Вниз

Запуска файла ДОС под Win9x   Найти похожие ветки 

 
Terech   (2005-05-30 20:51) [0]

Помогите, пожалуйста!
Есть некая программа(написана на Delphi) создающая текстовый файл с данными, далее она запускает прогу написанную под DOS(на QBasik), эта прога обрабатывает текстовый файл и выдает другой файл(тоже txt) и завершаеться, а программа под Windows далее работает - принимает этот файл, создает новый, запускает программу DOS, та создает файл ответа и завершается - и так далее, словом цикл. Но вот какая проблема - работу ДОС-программы пользователь не должен видеть, он должен работать только с Win-прогой. Я запускаю ДОС-программу командой WinExec("modul.exe",0) в Хрюше все работает замечательно, а вот в Win98 возникает проблема - там почему-то когда DOS-прога становиться свернутой или скрытой(в общем - теряет фокус), тогда ее работа приостанавливаеться. В итоге работа Win-проги тоже. Подскажите, пожалуйста, как мне сделать так, чтобы работа ДОС-программы никогда не приостанавливалась? Срочно! Мне проект надо сдать через 2 дня!!!


 
Чапаев ©   (2005-05-30 21:08) [1]

> Я запускаю ДОС-программу командой WinExec("modul.exe",0)
Аллах с тобой... На дворе 2005 год. Давно уже изобрели и ShellExecute(), и CreateProcess(), и ещё много гнусностей...


 
vertal ©   (2005-05-31 00:16) [2]

Может эта процедура подойдет. Она к тому же позволяет сэкономить целый поток.

 TCallbackInvokeReason = (
   trBeforeInvokeCreateProcess,
   trStartToWait,
   trMsgDetected,
   trBeforeInvokeTerminateProcess,
   trProcessWeekworked);

 TMsgCallBackFunction = function(
   const AData: Pointer;
   const InvokeReason: TCallbackInvokeReason): Boolean;

function GetDosErrorOutput(
 const CommandLine, WorkDir, TempDir: String;
 var ResultCode: Cardinal;var DosOutput:String;
 const dwTimeout: Cardinal;
 const CallbackFunction:TMsgCallBackFunction=nil;
 const AData:Pointer=nil):Boolean;
const
 comspecStr = "COMSPEC";
var
 COMSPEC:array[0..MAX_PATH] of Char;
 StartupInfo: TStartupInfo;
 ProcInfo: TProcessInformation;
 TempFileName, cmdLine:String;
 hSnapShot: THandle;
 hChildProcess: THandle;
 PE: PROCESSENTRY32;
begin
 FillChar(StartupInfo, SizeOf(StartupInfo), #0);
 StartupInfo.cb := SizeOf(StartupInfo);
 StartupInfo.wShowWindow := SW_HIDE;
 StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 Win32Check(GetEnvironmentVariable(comspecStr, COMSPEC, SizeOf(COMSPEC) - 1) <> 0);
 SetLength(TempFileName, MAX_PATH);
 GetTempFileName(PChar(TempDir), "ATP", 0, PChar(TempFileName));
 SetLength(TempFileName, strlen(PChar(TempFileName)));
 cmdLine := COMSPEC + " /c " +  CommandLine + " 2>" + TempFileName;
 if Assigned(CallbackFunction) then
   CallbackFunction(AData, trBeforeInvokeCreateProcess);
 Win32Check(CreateProcess(
   nil,
   PChar(cmdLine),
   nil,
   nil,
   FALSE,
   0,
   nil,
   PChar(WorkDir),
   StartupInfo,
   ProcInfo));
 if Assigned(CallbackFunction) then
   CallbackFunction(AData, trStartToWait);
 try
   if Assigned(CallbackFunction) then
     while True do
       case MsgWaitForMultipleObjects(1, ProcInfo.hProcess, FALSE, dwTimeout, QS_ALLINPUT) of
         WAIT_OBJECT_0, WAIT_TIMEOUT: break;
         WAIT_OBJECT_0 + 1: if not CallbackFunction(AData, trMsgDetected) then break;
       end//case
   else
     WaitForSingleObject(ProcInfo.hProcess, dwTimeout);
   Result := True;
 finally
   Win32Check(GetExitCodeProcess(ProcInfo.hProcess, ResultCode));
   if ResultCode = STILL_ACTIVE then
     try
       if Assigned(CallbackFunction) then
         CallbackFunction(AData, trBeforeInvokeTerminateProcess);
       hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       Win32Check(hSnapShot <> INVALID_HANDLE_VALUE);
       try
         PE.dwSize := SizeOf(PE);
         if Process32First(hSnapShot, PE) then
           repeat
             if PE.th32ParentProcessID = ProcInfo.dwProcessId then
             begin
               hChildProcess := OpenProcess(PROCESS_TERMINATE, FALSE, PE.th32ProcessID);
               Win32Check(hChildProcess <> 0);
               try
                 Win32Check(TerminateProcess(hChildProcess, 0));
               finally
                 CloseHandle(hChildProcess);
               end;
             end;
           until Process32Next(hSnapShot, PE) = FALSE;
       finally
         CloseHandle(hSnapShot);
       end;
     finally
       Win32Check(GetExitCodeProcess(ProcInfo.hProcess, ResultCode));
       if ResultCode = STILL_ACTIVE then
         Win32Check(TerminateProcess(ProcInfo.hProcess, 0));// єьЁш, чрЁрчр
     end;
   if ProcInfo.hThread <> 0 then
   begin
     Win32Check(CloseHandle(ProcInfo.hThread));
   end;
   Win32Check(CloseHandle(ProcInfo.hProcess));
 end;
 if FileExists(TempFileName) then
 begin
   DosOutput := GetFileText(TempFileName);
   UniqueString(DosOutput);
   if Length(DosOutput) <> 0 then
     OEMToChar(PChar(DosOutput), PChar(DosOutput));
   Win32Check(DeleteFile(TempFileName));
 end else
   DosOutput := "";
 if Assigned(CallbackFunction) then
   CallbackFunction(AData, trProcessWeekworked);
end;


 
Гость2   (2005-06-26 10:17) [3]

Все намного проще :-). Лезешь в свойства modul.exe, закладка Разное и в разделе Фоновый режим убираешь галочку с Полная остановка



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

Форум: "WinAPI";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.034 c
14-1122486854
VEG
2005-07-27 21:54
2005.08.21
Бесплатныле программы


1-1122764140
Flood_control
2005-07-31 02:55
2005.08.21
Быстрое приложение, как сделать "легкий код"


1-1122705542
Igit
2005-07-30 10:39
2005.08.21
Неправильно читается файл


14-1122718012
Ajax
2005-07-30 14:06
2005.08.21
Экспоненциальное усреднение


6-1115883513
aleshap
2005-05-12 11:38
2005.08.21
IP адрес удаленной машины?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский