На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Я пишу программу А на Delphi
она должна:
1) запустить прогр. В
2) потом проверить не завершилась ли прогр. В
3) если нет то завершить её
4) если в В - ошибка, то снять её с выполнения, но не допустить появления
окошка ("Отправить сообщение Microsoft" и "Не отправлять")
Программа В может быть под DOS и Windows
помогите написать эти фрагменты кода на Delphi
Если не знаете, то подскажите, где форумят умные люди по Delphi
И ещё: можно ли на олимпиаде писать программы на delphi или free pascal?
Відредаговано ROBOT (2005-10-29 11:43:26)
Поза форумом
CreateProcess (даже лучше CreateProcessWithLogonW из соображений безопасности) с параметром dwCreationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, OpenProcess для проверки запущенности по полученному хандлу. Ошибки обрабатывать через WaitForDebugEvent.
Поза форумом
Так я ничего не пойму. Мне надо куски текста программы, а то на Delphi я не сильно шарю. Я даже не знаю, что такое хэндл.
Відредаговано ROBOT (2005-10-31 09:10:13)
Поза форумом
Тогда следует использовать учебник по Делфи и MSDN. У меня не только нет такого кода на Делфи, я еще и ненавижу его.
Поза форумом
http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!
Поза форумом
Fokysnik написав:
http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!
посмотрел, написал сейчас жду от туда ответа
P.S. - как ты сделал ссылку?
Поза форумом
Кстати, еще один неплохой форум - forum.vingrad.ru
Для начинающих программистов с подобными проблемами - самое оно.
Відредаговано Fedor (2005-11-01 20:49:19)
Поза форумом
ROBOT написав:
Fokysnik написав:
http://www.bib.com.ua/
Рульний сайт подивись, ROBOT!!!посмотрел, написал сейчас жду от туда ответа
P.S. - как ты сделал ссылку?
Просто пишеш як звичайний текст. Те шо починається на "http://" і тому подібне автоматично стає
ссилкою.
Короче просто пиши а ссилки самі появляться
Відредаговано Fokysnik (2005-11-03 08:57:02)
Поза форумом
Если ты на Delphi не сильно шаришь, сделать такое будет не просто.
- Если тебе надо засечь время выполнения проги, используй GetSystemTime или Now, потом WinExecAndWait32 (процедура описана на многих форумах, запускает прогу и ждет завершения)
Потом снова GetSystemTime и от последнего значения времени отнять первое.
- Если надо принудительно замочить процесс, используй Killtask по таймеру, найти также можно в FAQ'ах на многих форумах. НО: при запуске досовских прог надо мочить не саму прогу, а эмулятор, который в разных версиях форточек называется по-разному (см. в списке процессов)
что плохо - WinExecAndWait32 "вешает" прогу до завершения вызываемой. Поэтому надо выбирать.
- Узнать о завершении проги можно и косвенно. Например, запустить прогу с перенаправлением вывода в файл (aka "prog.exe > 1.txt").
При запуске программы создается 1.txt и он заблокирован до завершения проги. Как только ты можешь туда что-нибудь записать - прога завершилась. Проверять это можно путем многочисленных попыток сделать rewrite(f) или erase(f) внутри try..except..end или {$I-} ... if ioresult<>0 then goto_повтор {$I+}(чтоб не вылетало). Это универсальный способ для любых программ.
PS: А ты не систему проверки решений лепить собрался :-)
Поза форумом
може лучше книжку по делфи купить?
Поза форумом
1.Запуск:
preverrs=SetErrorMode(SEM_NOGPFAULTERRORBOX);
Затем делаешь CreateProcess с влагом CREATE_NEW_CONSOLE в параметрах создания.
А потом SetErrorMode(preverrs);
И сообщения об ошибках не появятся.
2.Ждешь завершения с помощью WaitForSingleObject.
3.Точное время работы получаешь с помощью GetProcessTimes.
4.Если надо забить программу, то для этого служит TerminateProcess.
5.Проверяешь код возврата с помошью GetExitCodeProcess. Если он не ноль, то была ошибка.
Детальнее что куда передавать смотри в МСДН.
Поза форумом
reiten написав:
1.Запуск:
preverrs=SetErrorMode(SEM_NOGPFAULTERRORBOX);
Затем делаешь CreateProcess с влагом CREATE_NEW_CONSOLE в параметрах создания.
А потом SetErrorMode(preverrs);
И сообщения об ошибках не появятся.
2.Ждешь завершения с помощью WaitForSingleObject.
3.Точное время работы получаешь с помощью GetProcessTimes.
4.Если надо забить программу, то для этого служит TerminateProcess.
5.Проверяешь код возврата с помошью GetExitCodeProcess. Если он не ноль, то была ошибка.
Детальнее что куда передавать смотри в МСДН.
что такое МСДН, на которую все ссылаются?
Поза форумом
Vitaly написав:
А ты не систему проверки решений лепить собрался :-)
вообще-тогь да...
Поза форумом
MSDN - база знаний для разработчиков под Microsoft продукты, т.е. Windows. Содержит хелпы по WinAPI, .NET, Visual Studio, Visual Basic, SQL Server и прочим творениям Майкрософта. Есть он-лайн версия http://msdn.microsoft.com, кроме того с Visual Studio ставится вся msdn по WinAPI, .NET и С++.
Поза форумом
Кстати, если ты, ROBOT большой любитель Delphi, могу порекомендовать проект JEDI Win32 API Library. Это куча заголовочных файлов Microsoft портированых под Delphi: http://homepages.borland.com/jedi/. Там есть и другие их проекты, например, JVCL - неплохая библиотека компонентов для Delphi на все случаи жизни.
Поза форумом
Как я понял ROBOT пишет свою проверялку. Я тоже ее начинал писать но бросил (не было времени). Вот кусок кода который запускает прогу (тестировал на проге из TP7):
...
ProcessInformation: TProcessInformation;
StartupInfo: TStartupInfo;
ProcessH: Cardinal;
InpH: Cardinal;
OutH: Cardinal;
ErrH: Cardinal;
...
{Запуск проги}
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.lpReserved:=nil;
StartupInfo.lpDesktop:=nil;
StartupInfo.lpTitle:=nil;
StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
StartupInfo.cbReserved2:=0;
StartupInfo.lpReserved2:=nil;
InpH:=CreateFile('Input.dat', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
StartupInfo.hStdInput:=InpH;
StartupInfo.hStdOutput:=OutH;
StartupInfo.hStdError:=ErrH;
StartupInfo.wShowWindow:=SW_NORMAL;
if CreateProcess('PEREST.EXE', '', nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)=False then
RaiseLastOSError;
ProcessH:=OpenProcess(PROCESS_ALL_ACCESS, True, ProcessInformation.dwProcessId);
{Проверка на завершение}
var
EC: Cardinal;
begin
if GetExitCodeProcess(ProcessH, EC)=False then
RaiseLastOSError;
if EC=STILL_ACTIVE then
ShowMessage('STILL_ACTIVE')
else begin
CloseHandle(InpH);
CloseHandle(OutH);
CloseHandle(ErrH);
CloseHandle(ProcessH);
ShowMessageFmt('Exit Code: %d', [EC]);
end;
end;
Единственная проблема, хоть я и назначаю StdHANDLES, прога не хочет читать и писать в заданые файлы (в ней написано запись/чтение из определенных по default-у файлов Input, Output). Запуск и ожидание завешения можно поместить в TThread.
Но если надо только запустить прогу и дождаться завершения лучше использовать WinExec и ему подобные.
PS Код писал метотом тыка. Может я чего-то не сделал?
Поза форумом
F этото код А жет проверят Delphi-проги?
Поза форумом
Этот код тупо запускает нужную прогу, и пытается переназначить I/O с консоли на файлы. Можно запускать таким способом любой exe-шник. Я решил писать проги которые надо проверить так чтобы они читали и писали в файлы, а потом считывать резельтат проверялкой. Но в таком случае не нужно переназначать файлы Input/Output и следующие строчки можно выкинуть:
InpH:=CreateFile('Input.dat', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
StartupInfo.hStdInput:=InpH;
StartupInfo.hStdOutput:=OutH;
StartupInfo.hStdError:=ErrH;
А строчку:
StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
Заменить на:
StartupInfo.dwFlags:=0;
Я скоро снова возьмусь писать проверялку и могу сообщить результат.
Поза форумом
Vova написав:
Как я понял ROBOT пишет свою проверялку. Я тоже ее начинал писать но бросил (не было времени). Вот кусок кода который запускает прогу (тестировал на проге из TP7):
...
ProcessInformation: TProcessInformation;
StartupInfo: TStartupInfo;
ProcessH: Cardinal;
InpH: Cardinal;
OutH: Cardinal;
ErrH: Cardinal;
...
{Запуск проги}
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.lpReserved:=nil;
StartupInfo.lpDesktop:=nil;
StartupInfo.lpTitle:=nil;
StartupInfo.dwFlags:=STARTF_USESTDHANDLES;
StartupInfo.cbReserved2:=0;
StartupInfo.lpReserved2:=nil;
InpH:=CreateFile('Input.dat', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
OutH:=CreateFile('Output.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
ErrH:=CreateFile('Errors.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
StartupInfo.hStdInput:=InpH;
StartupInfo.hStdOutput:=OutH;
StartupInfo.hStdError:=ErrH;
StartupInfo.wShowWindow:=SW_NORMAL;
if CreateProcess('PEREST.EXE', '', nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation)=False then
RaiseLastOSError;
ProcessH:=OpenProcess(PROCESS_ALL_ACCESS, True, ProcessInformation.dwProcessId);
{Проверка на завершение}
var
EC: Cardinal;
begin
if GetExitCodeProcess(ProcessH, EC)=False then
RaiseLastOSError;
if EC=STILL_ACTIVE then
ShowMessage('STILL_ACTIVE')
else begin
CloseHandle(InpH);
CloseHandle(OutH);
CloseHandle(ErrH);
CloseHandle(ProcessH);
ShowMessageFmt('Exit Code: %d', [EC]);
end;
end;
Единственная проблема, хоть я и назначаю StdHANDLES, прога не хочет читать и писать в заданые файлы (в ней написано запись/чтение из определенных по default-у файлов Input, Output). Запуск и ожидание завешения можно поместить в TThread.
Но если надо только запустить прогу и дождаться завершения лучше использовать WinExec и ему подобные.
PS Код писал метотом тыка. Может я чего-то не сделал?
У меня таже проблема ввода/вывода...
Я пытался использовать перенаправление (в CREATEPROCESS писал '"c:\proga.exe" < "c:\in.txt" > "c:\out.txt"') нничего не получилось
Решил использолвуать input.txt и output.txt
Результат: http://www.proveryalka.narod.ru
Відредаговано ROBOT (2005-12-08 13:15:02)
Поза форумом
Писал бы ты лучше под Unix-Linux. Там все просто - fork, перенаправление ввода/вывода в файлы, exec и дочерний процесс готов. Далее считаешь время и посылаешь процессу SIGTERM или SIGKILL. Плюс проблемы с глюками в программе отваливаются сами собой - перехватом соответствующих сигналов.
Поза форумом
А если у меня Windows?
Поза форумом
Поставь Cygwin
Поза форумом
Очень полезная тут тема получилась.
Я пишу работу на МАН (системы тестиирования) и здесь много полезного нашёл.
Ну,раз зашёл вопрос:
Кто нибудь работал с сокетами в Delphi2005.Если можно расскажите где найти учебник (или может кто-нибудь посоветует)
Заранее благадарю!!!
Поза форумом
Лучше пиши на API. Размер проги будет офигенно малый.
Функция отсылает на хост и порт данные data по TCP, возвращает ответ сервера.
function SendSocketTCP(host:string; port:integer; var Data:String):String; var WSData:WSADATA; adiv:sockaddr_in; mysock:TSocket; recvstr:string; begin result:=''; wsastartup(makeword(1,1),wsdata); mysock:=socket(af_inet,sock_stream,ipproto_ip); if mysock=-1 then begin silent:=true; //Showmessage('Can`t create socket!'); SetWindowText(wnd,'Can`t create socket!'); exit; end; if (host[1]>='0') and (host[1]<='9') then adiv.sin_addr.S_addr:=inet_addr(pchar(host)) else adiv.sin_addr.S_addr:=inet_addr(pchar(HostToIP(host))); adiv.sin_family:=af_inet; adiv.sin_port:=htons(port); if connect(mysock,adiv,sizeof(adiv))=invalid_socket then begin silent:=true; //Showmessage('Can`t connect to server'); SetWindowText(wnd,'Can`t connect to server'); Exit; end; wssendstring(mysock,data); recvstr:=wsrecvstring(mysock); result:=recvstr; closesocket(mysock); wsacleanup; end;
О писании на апи есть куча инфы в сети.
PS: И зачем ты полез в D2005? Чего там хорошего? :-)
Поза форумом
Большое спасибо!Ничего не понимаю в этих сокетах.Думаю это мне поможет!
По-поводу Дельфи2005.
Ничего хорошего там нет...
Во-первых МАН я начал писать на 2005-ом
Ну и во-вторых всё-таки там отладка сделана лучше чем в 5-ом Дельфи.
И вообще Си рулит.
Відредаговано jack_spektor (2005-12-10 20:38:04)
Поза форумом