Форум: "Прочее";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
ВнизКак пользоваться программой DebugView Найти похожие ветки
← →
Kolan © (2009-11-17 14:09) [0]Здравствуйте!
Мне нужно отладить службу. Как я понял для этого удобно использовать программу DebugView и функцию OutputDebugString.
Но как пользоваться DebugView — не могу понять. Я её подключил, но сообщения не ловятся.
Сделал тестовую программу.
procedure TForm3.FormCreate(Sender: TObject);
begin
OutputDebugString("!!!String!!!");
end;
Дельфовый Эвент лог сообщение ловит, а DebugView — нет
---
Страница программы
http://technet.microsoft.com/ru-ru/sysinternals/bb896647%28en-us%29.aspx
← →
Сергей М. © (2009-11-17 14:14) [1]
> нужно отладить службу
Локальную ?
Так а чем встроенный отладчик не угодил ?
← →
Kolan © (2009-11-17 14:16) [2]А как им цепляться — не пойму. Я на плей нажимаю, что-то запускается, но точки не срабатывают.
← →
Сергей М. © (2009-11-17 14:18) [3]Так ты справку-то почитай..
Там же раздел на эту тему имеется - "Debugging service applications"..
← →
Ухарь (2009-11-17 14:43) [4]Attach To Process
← →
Ухарь (2009-11-17 14:43) [5]Attach To Process
← →
Kolan © (2009-11-17 14:55) [6]Благодарю, Сергей, почитал. Только одного не могу понять,
Attach To Process
показывает CPU окно, как теперь на год перейти?
Я знаю, что идиот...
← →
Kolan © (2009-11-17 15:05) [7]* на код
← →
Piter © (2009-11-17 15:24) [8]Любой сервис можно запустить как обычный EXE - и отлаживай на здоровье, в чем проблема? Или есть сильные особенности его функционирования как сервиса?
Что касается изначальной проблемы:
Kolan © (17.11.09 14:09)
Дельфовый Эвент лог сообщение ловит, а DebugView — нет
естественно, у приложения может быть только один отладчик. Если ты запускаешь приложение из под среды Delphi - то она и указывает себя в качестве отладчика, к таким процессам DV не цепляется. Он цепляется к тем, у которых нет отладчика, то есть DV будет работать, если ты запустишь приложение не из под дельфи, а "обычным образом".
DV при этом должен быть запущен с правами администратора.
← →
Kolan © (2009-11-17 15:32) [9]
> Любой сервис можно запустить как обычный EXE - и отлаживай
> на здоровье, в чем проблема?
Проблема в том, что я не врублюсь как это сделать.
Нажимаю F9. Оно компилится и тут же вырубается. Точки никакие не срабатывают. Хотя ServiceExecute такой:procedure TminiCalibratorStartService.ServiceExecute(Sender: TService);
begin
while Status = csRunning do
begin
ReportStatus;
ServiceThread.ProcessRequests(False);
Sleep(100);
end;
end;
← →
Сергей М. © (2009-11-17 16:03) [10]
> Kolan © (17.11.09 15:32) [9]
+ к рекомендации в справке:
поставь вызов sleep(достаточное_время) в отлаживаемый обработчик
достаточное_время - время, достаточное для того чтобы ты успел запустить сервис из меню "Службы", перейти в делфи и приаттачиться к стартовавшему процессу
Точку останова ставь после слипа
← →
Kolan © (2009-11-17 16:16) [11]А, а потом из CPU — View source. Получилось, попал в ServiceExecute.
Мне сервис нужен-то для чего. Мне нужно ловить факт подкл. железки и запускать нужную программу. Для определения подключения я ловлю событие WM_DEVICECHANGEprocedure TminiCalibratorStartService.WMDEVICECHANGE(var Msg: TWMDeviceChange);
var
...
begin
end;
Нэ ловица. Почему?
← →
Rouse_ © (2009-11-17 18:13) [12]
> Для определения подключения я ловлю событие WM_DEVICECHANGE
Это не верно, для сервиса нужно подписаться либо на уведомление SERVICE_CONTROL_DEVICEEVENT при помощи RegisterDeviceNotification, либо на SERVICE_CONTROL_HARDWAREPROFILECHANGE добавив флаг SERVICE_ACCEPT_HARDWAREPROFILECHANGE в параметр dwControlsAccepted при вызове функции SetServiceStatus, ну и отлавливать уже сами уведомления в ServiceCtrlHandler
← →
Rouse_ © (2009-11-17 18:14) [13]А по поводу:
> Дельфовый Эвент лог сообщение ловит, а DebugView — нет
Ловить должен кто-то один. Если ты работаешь под отладчиком - отладчик и будет получать сообщения. Запускай приложение не из под IDE и будет тебе счастье.
← →
clickmaker © (2009-11-17 18:16) [14]> Нэ ловица. Почему?
потому что это оконное сообщение.
← →
Rouse_ © (2009-11-18 00:44) [15]
> clickmaker © (17.11.09 18:16) [14]
>
> > Нэ ловица. Почему?
>
> потому что это оконное сообщение.
Ну это не ограничение для сервиса, по крайней мере до висты.
И даже после висты он тоже может абсолютно без последствий для себя иметь окна. Пошаманить правда нужно с некоторыми мелочами.
В свое время долго бился с сокетным сервисом в режиме WSAAsyncSelect без интерактива.
Отказался ввиду не перспективного направления, но даже на семерке старый вариант нормально запустился.
Но увы и ах - не желательно :)
← →
Kolan © (2009-11-18 12:03) [16]Понятно, благодарю за разъяснения про отладку и события, буду курить по указанным словам.
← →
Kolan © (2009-11-19 14:06) [17]Пара вопросов.
Как получить хендл сервиса для RegisterDeviceNotification?
Как заполнить структуру NotificationFilter? В интернете есть пример с использованием TDevBroadcastDeviceInterface, где взять описание этого типа?
← →
Сергей М. © (2009-11-19 14:45) [18]
> Как получить хендл сервиса для RegisterDeviceNotification?
см. TService.GetServiceController
← →
Kolan © (2009-11-19 15:26) [19]Нашел. А как быть со структурой.
А как быть со структурой? DEV_BROADCAST_HDR описана в модуле DBT, который у меня есть, а где брать DEV_BROADCAST_DEVICEINTERFACE?
var
Info: DEV_BROADCAST_HDR;
begin
Info.dbch_size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
Info.dbch_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
Info.dbch_reserved := ;
FNotifyHandle := RegisterDeviceNotification(GetServiceController,
@Info, DEVICE_NOTIFY_WINDOW_HANDLE);
end;
← →
Сергей М. © (2009-11-19 15:44) [20]Известно где - в MSDN.. если, конечно, ни в Jedi ни где-либо еще не нагуглится ..
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c