Форум: "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.038 c