Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сервис на API [Win2k]


Страницы:   1 2

Vadim M ©   (2006-01-10 15:48:00) 

подскажите готовый пример (Работающий!!) в виде pas,
без окон - минимальный набор
можно и линк,
знаменитую статью видел ,но там кусками


Игорь Шевченко   (2006-01-12 18:05:00) [1]

Vadim M   (12.01.06 17:58) [28]

У сервисов по умолчанию свой рабочий стол, если в настройке не указано, что они взаимодействуют с рабочим столом пользователя.


Vadim M   (2006-01-12 17:58:00) [2]

выполнение кода без рабочего стола может
плохо кончиться,а
FindWindows не пашет для окон ,так как я localsystem


Игорь Шевченко   (2006-01-12 16:51:00) [3]


> Для того,чтоб узнать ,что пользователь залогинился
> и начать выполнять другой код


В топку такие сервисы


Vadim M   (2006-01-12 15:57:00) [4]

>всерано это называется косяк :)

на то он косяк,чтоб его курили :)

в МЭИН крутить можно


 while(GetMessage(Msg, Handle, 0, 0)) do
 begin
TranslateMessage(msg);
   DispatchMessage(msg);
 end;


Непонятки с   handle и   hWnd,
формы нет и хэндл нулевой,слышал его получать можно
не имея оного


function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
 { Checks for messages }
 if uMsg = WM_DESTROY then halt;
end;


Rouse_   (2006-01-12 15:41:00) [5]


> очереди нет привычной в виде
> WM_COPYDATA:
> begin
> end;

Руками крути цикл выборки сообщений...


> а вот при  выключении компьютера,сервисы убиваются

Выключаются соответствующим менеджером


> компилер все равно одинаково скомпилит,а
> первый наглянее

всерано это называется косяк :)


Vadim M   (2006-01-12 15:37:00) [6]

>Rouse_

счас буду пробывать,
все сложнее чем я думал ,
очереди нет привычной в виде
WM_COPYDATA:
begin
end;

а вот при  выключении компьютера,сервисы убиваются
(кем ?) или замораживаются?

>if DTLC=false then можно заменить на if not DTLC then.
компилер все равно одинаково скомпилит,а
первый наглянее


Rouse_   (2006-01-12 15:14:00) [7]

Аааа :) Ну да - че под пиво только не накодишь :)


BiN   (2006-01-12 15:08:00) [8]


> Rouse_ ©   (12.01.06 15:04) [21]
>
> :)))))) Я кусками выковыривал, в оригинале она нужна :)


Я имел в виду сравнение булевой переменной с константой.
Т.е. if DTLC=false then можно заменить на if not DTLC then.

Это мелочь, конечно.


Rouse_   (2006-01-12 15:04:00) [9]

:)))))) Я кусками выковыривал, в оригинале она нужна :)


BiN   (2006-01-12 14:50:00) [10]

А можно за другое попинать? ;)
Например, за
if DTLC=false then


Rouse_   (2006-01-12 14:14:00) [11]

Зы за глухие эксепты в демке плз не пинать :)
OutputDebugString не моя :)


Rouse_   (2006-01-12 14:12:00) [12]


> ведь окно в сервисе не охота делать - прибьют

Это почему это? А если внутри сервиса крутиться асинхронный транспорт который без окон ни туды ни сюды?

> Для того,чтоб узнать ,что пользователь залогинился

А для этого пишеться небольшая библиотечка:

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : WinlogonEventDemo
//  * Purpose   : Winlogon event demo
//  * Author    : Alexander (Rouse_) Bagel
//  * Version   : 1.00
//  ****************************************************************************
//

library logoneventdemo;

uses
 Windows;

var DTLC:Boolean=false;

type
 PFNMSGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
 _WLX_NOTIFICATION_INFO = record
   Size: ULONG;
   Flags: ULONG;
   UserName: PWideChar;
   Domain: PWideChar;
   WindowStation: PWideChar;
   hToken: THandle;
   hDesktop: HDESK;
   pStatusCallback: PFNMSGECALLBACK;
 end;

procedure OutputDebugString(Value: String; var pInfo: _WLX_NOTIFICATION_INFO);
const
 Path = 'suser.log';
var
 hFile: THandle;
 BytesWrite, Len: DWORD;
 SystemPath:String;
 FilePath: String;
 ST:_SystemTime;
 fStr,ST_Str:String;
 t:array [0..5] of integer;
begin
try
 GetLocalTime(ST);
 SetLength(ST_Str,21);
 fStr:='%02d:%02d:%04d - %02d:%02d:%02d';
 t[0]:=ST.wDay;
 t[1]:=ST.wMonth;
 t[2]:=ST.wYear;
 t[3]:=ST.wHour;
 t[4]:=ST.wMinute;
 t[5]:=ST.wSecond;
 wvsprintf(PChar(ST_Str),PChar(fStr),PChar(@t));
 Len:=GetSystemDirectory(nil, 0);
 SetLength(SystemPath, Len-1);
 if GetSystemDirectory(PChar(SystemPath),Len)>0 then
 begin
   if SystemPath[Len]='\' then FilePath :=SystemPath+Path else FilePath :=SystemPath+'\'+Path;
   hFile:=CreateFile(PChar(FilePath),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
   if hFile<>INVALID_HANDLE_VALUE then
    begin
     try
     Value :=
       'NOTIFY: User "' + pInfo.UserName +
       '" entering ' + Value +
       ' on WindowStation "' + pInfo.WindowStation +
       '", Domain "' + pInfo.Domain + '" ('+ST_Str+')'+#13+#10;
       SetFilePointer(hFile,0,nil,FILE_END);
       WriteFile(hFile,Value[1],Length(Value),BytesWrite, nil);
     except
     end;
      CloseHandle(hFile);
    end;
 end;
 SetLength(ST_Str,0);
 SetLength(SystemPath,0);
except
end;
end;

// Here is the event handler for the Winlogon Logon event.
procedure WLEventLogon(var pInfo: _WLX_NOTIFICATION_INFO); stdcall;
begin
 if SizeOf(_WLX_NOTIFICATION_INFO) = pInfo.Size then
   // Print the name of the handler to debug output.
   OutputDebugString('WLEventLogon', pInfo);
end;

// Here is the event handler for the Winlogon Logoff event.
procedure WLEventLogoff(var pInfo: _WLX_NOTIFICATION_INFO); stdcall;
begin
 if SizeOf(_WLX_NOTIFICATION_INFO) = pInfo.Size then
   // Print the name of the handler to debug output.
   OutputDebugString('WLEventLogoff', pInfo);
end;

exports
 WLEventLogon,
 WLEventLogoff;

begin
 // library initialization code
 if DTLC=false then
  DisableThreadLibraryCalls(HInstance); //Не беспокоить :)
 DTLC:=true;
end.


и регистрируется вот тут: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

Подробней в MSDN


Vadim M   (2006-01-12 13:22:00) [13]

а как без окон следить за сообщениями ?
ведь окно в сервисе не охота делать - прибьют

Для того,чтоб узнать ,что пользователь залогинился
и начать выполнять другой код

p.S :сообщения типа WM_


Reindeer Moss Eater   (2006-01-11 11:08:00) [14]

net start c:\1.exe

говорит неправельно имя службы (((((


А ты ему поверь. Правильно говорит.


Vadim M   (2006-01-11 10:22:00) [15]

>Fay

спасибо ,запускал через Службы,еле нашел
оно описание подставляет) 'Рыба'

>Rouse_

спасибо ,работает


Rouse_   (2006-01-11 09:02:00) [16]

http://rouse.front.ru/twoservicedemo.zip


Fay   (2006-01-11 03:37:00) [17]

2 Vadim M   (11.01.06 0:12) [9]
> А как правельно запускать сервис?
М.б. погодить пока с API?

> запуск бата с имя.exe /install  вобще не запускается
Выясняется за 1 минуту при чтении исходника.


Fay   (2006-01-11 03:35:00) [18]

2 Vadim M   (11.01.06 1:08) [11]
Помню я очень! Сто лет назад написано...

Запусти с /i


Vadim M   (2006-01-11 01:08:00) [19]

скопировал в с:\
запускаю в сmd так
net start c:\1.exe

говорит неправельно имя службы (((((


Reindeer Moss Eater   (2006-01-11 00:23:00) [20]

я под админом - запускаю кликом на ЕХЕ,

c:\>net start myservice

c:\>net stop myservice


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо