![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис на API [Win2k]
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