Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.09.2010, 17:30
lega4 lega4 вне форума
Прохожий
 
Регистрация: 14.09.2010
Сообщения: 15
Репутация: 10
По умолчанию Переписать программу в юнит

Есть образец программки, делающей tracert. Я хочу получить то же самое, но без формы, т.е. чтобы была процедура с входными параметрами - хост, хопы и Tstrings какой-нибудь - и ее можно было запускать из других проектов, просто подключая этот юнит. Подскажите плз, как "превратить" эту программку в юнит.
Вложения
Тип файла: zip tracert.zip (13.3 Кбайт, 8 просмотров)
Ответить с цитированием
  #2  
Старый 15.09.2010, 19:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вся работа собрана здесь: procedure TTraceThread.Execute;
фактически, тебе надо просто запускать этот поток и ждать, пока он закончит работу. Ну и вывод заместо Memo переписать в TStringList (тоже метот того же потока).
Ответить с цитированием
  #3  
Старый 15.09.2010, 20:49
lega4 lega4 вне форума
Прохожий
 
Регистрация: 14.09.2010
Сообщения: 15
Репутация: 10
По умолчанию

Но ведь мне надо к этой процедуре приделать входные параметры. А в проге они объявлены глобально... Мне кажется, что придется к каждой процедуре (Баттонклик наверно, ведь с него все начинается; собсно thread.execute; и TTraceThread.Log). Я пытался для начала только вывод переделать, чтобы передавались строки в произвольный TStrings, его к Логу приписал (Только в нем в мемо выводится), а после этого делфи стала ругаться на Synchronize(Log), пробовал писать типа так Synchronize(Log(Combobox1.items)); - все равно ругается...
Ответить с цитированием
  #4  
Старый 15.09.2010, 21:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, сделай переменную внутри класса и вывод лога будет писать в нее. Для Synchronize нужно, что бы метод был без параметров... сам с этим намучался... приходится делать через переменные (поля) класса потока. Кстати, если это будет переменная класса, и она не будет читаться/писаться во время работы потока, то можно Synchronize и не использовать.
Ответить с цитированием
  #5  
Старый 19.09.2010, 19:13
lega4 lega4 вне форума
Прохожий
 
Регистрация: 14.09.2010
Сообщения: 15
Репутация: 10
По умолчанию

Вроде получилось, за одним исключением - как понять, когда трассировка завершена? Т.е. я сделал некую процедуру, которую буду вызывать из основной программы: ей на вход подаются адрес хоста, число хопов и переменная, куда должен попасть результат трассировки.
Код:
 procedure tracerout(const adr:string;hop:integer; var otvet:string);
begin
otvet:='';
with TTraceThread.Create(False) do
  begin
    FreeOnTerminate := True;
    DestinationAddress := adr;
    IterationCount := hop;
    Resume;
  end;

{res - переменная, в которую Log заталкивает ответ}
{??? otvet:=res; ???}
end;
А конце, по идее, в "ответ" должен передаваться результат трассировки, который в этом самом res'e. Но - к тому моменту, как начинает выполняться присваивание, не всегда успевают пройти даже 2 трассировки, а если хопов 30? Как "задержать" программу (Не подвешивая ее, нужно, чтобы пользователь мог что-то делать, пока идет трассировка)? Пробовал "while pos('завершена',res)=0 do begin end", но этот цикл не дает потоку выполняться => бесконечный цикл...
Ответить с цитированием
  #6  
Старый 21.09.2010, 20:27
lega4 lega4 вне форума
Прохожий
 
Регистрация: 14.09.2010
Сообщения: 15
Репутация: 10
По умолчанию

Забил на это дело, код трасерта скопипастил в прогу, вроде в целом ничего получилось))) Но - почему не посылаются эхо-запросы?
Код:
Error := IcmpSendEcho(TraceHandle,
                          DestAddr.S_addr,
                          nil,
                          0,
                          @IP,
                          ECHO,
                          SizeOf(ICMP_ECHO),
                          5000);
Возвращает 0, мол "отказано в доступе"... Как исправить?
З.Ы. Наверно важно - я пишу не обычное приложение, а дллка-плагин для ИЕ.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter