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

Вниз

Запуска файла ДОС под 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.055 c
1-1122550878
Priest
2005-07-28 15:41
2005.08.21
Как сменить фон для неактивного OLEConteiner


1-1122394424
Logan
2005-07-26 20:13
2005.08.21
Как сделать чтобы при загрузке текста в ричидит, текст не менялся


4-1120111340
Mishenka
2005-06-30 10:02
2005.08.21
Работа с двумя CDRom ами


4-1120126541
BiN
2005-06-30 14:15
2005.08.21
Прототип IoVolumeDeviceToDosName в user-mode.


14-1122543830
Mx
2005-07-28 13:43
2005.08.21
О кроссплатформенности в Delphi 2005