Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104

Служба Windows и Controls.pas

05.11.2013, 18:40. Показов 2696. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый!

Столкнулся с проблемой: программа написанная для тестирования считывания содержимого флешки работает отлично, НО как только перенес все в службу - ошибка: Undeclared identifier: 'Handle' на строкаих:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TSvcus.ServiceCreate(Sender: TObject);
var
  NF:TDEV_BROADCAST_DEVICEINTERFACE;
begin
  NF.dbcc_size:=sizeof(TDEV_BROADCAST_DEVICEINTERFACE);
  NF.dbcc_devicetype:=DBT_DEVTYP_DEVICEINTERFACE;
 
 [COLOR="Red"] RegisterDeviceNotification(Handle,@NF,DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);[/COLOR]
 
   allfiles_start:=TStringList.Create;
   allfiles_now:=TStringList.Create;
   newfiles:=TStringList.Create;
 
end;
Подключены следующие библиотеки:

Pascal
1
2
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, StdCtrls,clipbrd,XPMan,shellapi,FileCtrl, DB, ADODB, DBTables, ExtCtrls, Buttons, setupapi,SvcMgr;
хендл в программе - описан в библиотеке Controls.pas;
Служба же категорически отказывается компилиться(

если строку закоментить - компилиться, только не реагирует на событие вставленния флешки.

Кто сталкивался с подобным? Какие могут быть варианты решения?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2013, 18:40
Ответы с готовыми решениями:

Служба Windows и запись в БД
Снова к вам с вопросами. Служба должна заносить определенные данные в базу данных, размещенную в сети. Использую аксесовскую .mdb,...

Стили в ActiveX (Common-Controls)
Столкнулся с проблемой отображения, точнее отсутствием, стилей (XP-manifest) в ActiveX, написанном на Delphi7. Написанный мной манифест...

Методы Controls.Clear и Controls.Remove активируют форму. Можно ли это запретить?
При вызове методов Control.ControlCollection.Clear() и Control.ControlCollection.Remove(Control control) при динамическом обновлении...

18
 Аватар для Valenth
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
05.11.2013, 19:50
Я в конкретно службах не разбираюсь, но очень кажется, что у используемого Вами класса, скорее всего, нет атрибута Handle. И переменной такой тоже нет.
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
05.11.2013, 23:45  [ТС]
Цитата Сообщение от Valenth Посмотреть сообщение
Я в конкретно службах не разбираюсь, но очень кажется, что у используемого Вами класса, скорее всего, нет атрибута Handle. И переменной такой тоже нет.
Не, в программе все работает, а вот в службе - нет такой переменной, хотя библиотеку контролс видит, а в ней как раз и описана эта переменная.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.11.2013, 23:58
Библиотека Controls никакого отношения к службе не имеет. А тот Handle, который использовался в приложении - на самом деле TForm.Handle. В службе у тебя формы нет, следовательно, и Handle - отсутствует...

Как вариант - см. в сторону AllocateHWnd / DeallocateHWnd
1
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
06.11.2013, 10:19  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Библиотека Controls никакого отношения к службе не имеет. А тот Handle, который использовался в приложении - на самом деле TForm.Handle. В службе у тебя формы нет, следовательно, и Handle - отсутствует...

Как вариант - см. в сторону AllocateHWnd / DeallocateHWnd
Скорее всего вы правы, так как уже несколько раз попадал на решение когда использовали AllocateHWnd. Буду пробовать.

Спасибо!
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
11.11.2013, 12:19  [ТС]
Прошу помощи!

Так и не смог разобраться что и к чему в примере:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
The following code is from the implementation of TTimer. It shows how the timer component’s constructor creates a hidden window to respond to Timer messages and how the destructor frees that window.
 
{TTimer implements a WndProc method that becomes the window procedure for the hidden window. }
procedure TTimer.WndProc(var Msg: TMessage);
 
begin
  with Msg do
    if Msg = WM_TIMER then { check for timer messages }
      try
        Timer; { this calls the OnTimer event handler }
      except
        Application.HandleException(Self);
      end
    else 
 { Any other messages are passed to DefWindowProc, which tells Windows to handle the message. Note that the first parameter, FWindowHandle, is the handle of the window receiving this message. It is obtained from the call to AllocateHWnd in the constructor. }
 
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
 
end;
 
{ The TTimer constructor uses AllocateHWnd to create the window and save its handle. } 
constructor TTimer.Create(AOwner: TComponent);
 
begin
  inherited Create(AOwner);
  FEnabled := True;
  FInterval := 1000;
  FWindowHandle := AllocateHWnd(WndProc);
 
end;
 
{ The TTimer destructor calls DeallocateHWnd to free the hidden window. } 
destructor TTimer.Destroy;
 
begin
  FEnabled := False;
  UpdateTimer;
  DeallocateHWnd(FWindowHandle);
  inherited Destroy;
 
end;
Не пойму почему, но этот пример выдает кучу ошибок при компиляции. Неизвестные переменные и точки с запятыми не в тех местах(

Что я делаю не так? Как запустить хотя бы этот пример чтобы понять как работает эта самая Аллокейт?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.11.2013, 13:04
Пример дан не для слепого копипаста, а для анализа
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
11.11.2013, 15:01
Цитата Сообщение от Rydo Посмотреть сообщение
Как запустить хотя бы этот пример чтобы понять как работает эта самая Аллокейт?
Это и не пример вовсе. Это три процедуры из исходников дельфийского TTimer. И они прекрасно компилируются будучи на своем законном месте в модуле ExtCtrls.pas
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
11.11.2013, 18:20  [ТС]
Замучался я с этой службой, буду делать безоконное приложение, а служба будет только следить чтобы оно онйлайн всегда было.

Если кто может - киньте текст службы, которая бы отслеживала подключение флешки, используя инетовский вариант:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
type
  PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;
 
  PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;
//=============================================================
const
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
  DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
  DBT_DEVTYP_DEVICEINTERFACE = $00000005;      // device interface class
  DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = $00000004;
  DEVICE_NOTIFY_SERVICE_HANDLE = $00000001;
 
procedure TTESTSRVC.WMDeviceChange(var Msg: TMessage);
var
  devType: Integer; 
  Datos: PDevBroadcastHdr; 
begin 
  if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then  
  begin
    Datos := PDevBroadcastHdr(Msg.lParam);
    devType := Datos^.dbch_devicetype;
    if devType = DBT_DEVTYP_DEVICEINTERFACE then
    begin // USB Device
      if Msg.wParam = DBT_DEVICEARRIVAL then
      begin
        showmessage('Устройство подключено');       // Усройство подключено
        //.....
      end
      else
      begin
        showmessage('Устройство ОТКЛЮЧЕНО');
        //.....
      end;
    end;
  end;
end;
 
 
procedure TTESTSRVC.ServiceStart(Sender: TService; var Started: Boolean);
var
  dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
  r: Pointer;
begin
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid  := GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name := 0;
 
 
  r := RegisterDeviceNotification(Handle, @dbi, DEVICE_NOTIFY_SERVICE_HANDLE);
  if not Assigned(r) then
   ShowMessage('Error Register Message');
 
 end;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.11.2013, 22:18
Цитата Сообщение от Rydo Посмотреть сообщение
буду делать безоконное приложение, а служба будет только следить чтобы оно онйлайн всегда было
Два костыля - один подпирает другой)
Что ж не две службы ? Тогда вторая будет следить за первой чтобы "оно онйлайн всегда было" - а ну как упадет и не будет следить за упавшим главным костылем))
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
12.11.2013, 01:10  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Два костыля - один подпирает другой)
Что ж не две службы ? Тогда вторая будет следить за первой чтобы "оно онйлайн всегда было" - а ну как упадет и не будет следить за упавшим главным костылем))
Шутки шутками а система проверена) уже одни прога так вертицца.

А на счет консольного приложния буде така я же проблема с отсутствием хендла окна, один плюс - легче дебажить.

вопрос службы все еще актуален. Буду премного благодарен за рабочий пример службы которая бы отслеживала подключение юсб и писала лог или сообщение.
0
 Аватар для Valenth
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
12.11.2013, 08:09
И тут я проснулся и взглянул трезво.

Rydo, а зачем служба сразу? Чем плоха программа, висящая в трее и работающая по автозапуску?
0
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
12.11.2013, 10:25  [ТС]
Программа должна быть скрыта от глаз пользователей. В процессах понятное дело она будет, но в нашей корп сети у большинства юзверей нет прав на снятие процессов. Да и чтобы лишний раз не нервировать народ, будет надежней служба или бесформенное приложение.


Цитата Сообщение от Rydo Посмотреть сообщение
Буду премного благодарен за рабочий пример службы которая бы отслеживала подключение юсб и писала лог или сообщение.
Ну хотя бы рабочий пример службы которая бы в шоумесседж писала свой хендл. Остальная обработка у мну есть. А вот с хендлами хоть убейте не могу разобаться. Уже придумал варианты тупого перебора дисков с проверкой какой сьемный:
+ будет работать везде;
- будет все время нагружать проц изза скажем посекундного (таймер) енума дисков.

Все же очень бы хотелось чтобы программа работала с WM_DEVICECHANGE.
0
 Аватар для Valenth
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
12.11.2013, 10:33
Цитата Сообщение от Rydo Посмотреть сообщение
Программа должна быть скрыта от глаз пользователей. В процессах понятное дело она будет, но в нашей корп сети у большинства юзверей нет прав на снятие процессов. Да и чтобы лишний раз не нервировать народ, будет надежней служба или бесформенное приложение.
У Application есть Handle. Используйте его. Сделайте приложение без формы, создайте поток, который будет проверять состояние usb и пусть работает.
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.11.2013, 11:14
в OnStart:

Delphi
1
2
3
hWnd := AllocateHWnd(..);
hDevNotify := RegisterDeviceNotification(..);
Started := (hWnd <> 0) and (hDevNotify <> 0);
в OnExecute:

Delphi
1
2
while not Terminated do 
  ProcessRequests(True);
в OnStop:

Delphi
1
2
DeAllocateHWnd(hWnd);
UnRegisterDeviceNotification(hDevNotify);
1
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
12.11.2013, 12:05  [ТС]
mss, а что подставлять в

Pascal
1
hWnd := AllocateHWnd(..);
В этом как раз и проблема. Что туда передать такое, чтобы получить хендл?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
12.11.2013, 12:23
The Method parameter specifies the window procedure that the generated window uses to respond to messages.
, что именно здесь непонятно? Пишешь метод класса с сигнатурой:

Delphi
1
TWndMethod = procedure(var Message: TMessage) of object;
, который будет обрабатывать сообщения, и передаешь этот метод в AllocateHWnd...
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.11.2013, 12:30
Delphi
1
2
3
4
5
6
7
TMyService = class(TService)
private
..
   FhWnd : THandle;
   procedure NotifyWndProc(var Msg: TMessage);
...
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TMyService.NotifyWndProc(var Msg: TMessage);
begin
  case Msg.Msg of
         WM_DEVICECHANGE: 
           begin
               ... здесь код обработки сообщения ..
           end;
  else
     Result := DefWindowProc(FhWnd, Msg, Msg.wParam, Msg.lParam);
  end;
end;
...

В OnStart:
Delphi
1
FhWnd := AllocateHWnd(NotifyWndProc);
1
10 / 10 / 0
Регистрация: 13.04.2011
Сообщений: 104
12.11.2013, 14:01  [ТС]
Вот! Огромное спасибо! Теперь картина стала ясной! Я не много не так понимал принцип аллокейт.
Попробую сегодня сделать. О результатах отпишусь!

Добавлено через 1 час 12 минут
РАААБООТАААЕЕТТ!! Спасибо всем огромное!!

Может кому пригодиться. Голый сервис с отслеживанием изменений устройств. Дальше - по своему вкусу.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
unit usbmonsvc;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
 
type
  TSVCUS = class(TService)
    procedure ServiceStart(Sender: TService; var Started: Boolean);
  private
    { Private declarations }
   FhWnd : THandle;
   procedure NotifyWndProc(var Msg: TMessage);
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;
 
var
  SVCUS: TSVCUS;
 
implementation
 
{$R *.DFM}
 
//++++++++++++++++++++++++++СЕРВИСНЫЕ++++++++++++++++++++++++++++++++++++++++
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  SVCUS.Controller(CtrlCode);
end;
 
function TSVCUS.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
//++++++++++++++++++++++++++СЕРВИСНЫЕ КОНЕЦ++++++++++++++++++++++++++++++++++
 
procedure TSVCUS.NotifyWndProc(var Msg: TMessage);
begin
  case Msg.Msg of
         WM_DEVICECHANGE:
           begin
           Showmessage('Что то происходит!');
           end;
  else
     Msg.Result := DefWindowProc(FhWnd, Msg.Msg, Msg.wParam, Msg.lParam);
  end;
end;
 
procedure TSVCUS.ServiceStart(Sender: TService; var Started: Boolean);
begin
FhWnd := AllocateHWnd(NotifyWndProc);
end;
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2013, 14:01
Помогаю со студенческими работами здесь

Ошибка: Window does not contain a definition for 'Controls' and no extension method 'Controls'
Решил заняться c#, но что-то не могу разобраться. имеется некоторое количество textBox'ов (textBox1, textBox2...). Через цикл хотел...

HTML controls или АSP controls на сервер сайд?
Всем Привет. Можно ли HTML controls исползоват на сервер сайд вместо АSP controls?например восползоватся Input type(text) вместо...

Не найден System.Windows.Controls
У меня .NET 4.0, не могу подключть using System.Windows.Controls; Пишет, что Controls отсутствует в пространстве имен System.Windows

Из stirng в System.Windows.Controls.Button
Вообщем написал функцию которая при нажатии на одну клавиши использует еще пару клавиш, и имеется строка, и определение кнопки Button b,...

Не устанавливается ImageList в Windows common controls 6
Здравствуйте! У меня проблема: при установки свойства ImageList в любом элементе из библиотеки Comctl32.ocx, в дизайнере и нажатии кнопки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru