Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

Сервис на API   Найти похожие ветки 

 
Vadim M   (2006-01-10 15:48) [0]

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


 
DVM ©   (2006-01-10 15:54) [1]

сервис с окнами - это наверное круто


 
Fay ©   (2006-01-10 16:04) [2]

Vadim M   (10.01.06 15:48)
могу прислать пример


 
Leonid Troyanovsky ©   (2006-01-10 16:05) [3]


> DVM ©   (10.01.06 15:54) [1]
> сервис с окнами - это наверное круто


Вполне буднично.

--
Regards, LVT.


 
DVM ©   (2006-01-10 16:08) [4]


> Вполне буднично.

но некрасиво имхо.


 
Reindeer Moss Eater ©   (2006-01-10 16:40) [5]

>но некрасиво имхо.

Сервис использует некий класс, который использует скажем AllocateHWnd для обмена сообщениями .
И где именно здесь некрасота ?

(Это сервис с окном)


 
Vadim M   (2006-01-10 17:49) [6]

To Fay

если нетрудно скиньте на marinazolotai@mail.ru

DVM

да действительно - окно прибивается из под юзера
и прибивается сервис


 
Leonid Troyanovsky ©   (2006-01-10 17:54) [7]


> DVM ©   (10.01.06 16:08) [4]

> > Вполне буднично.

> но некрасиво имхо.


В будни ж никто не обещал праздник ;)

Возможно, что немного более ресурсоемко, но,
главное, IMHO, чтобы костюмчик сидел, т.е. работал.
Многим разработчикам GUI родней, чем консоль.
А зачастую - и удобней.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-01-10 17:56) [8]


> Vadim M   (10.01.06 17:49) [6]

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


Нее, это если только разрешить сервису interactive.
Т.е., для камикадзе.

--
Regards, LVT.


 
Vadim M   (2006-01-11 00:12) [9]

To Fay

Спасибо

А как правельно запускать сервис?
я под админом - запускаю кликом на ЕХЕ,
5 сек в процессах висит и сваливает, читал ,что он сам должен
стартовать в автозагрузке, если его добавить

или руками В панеле задач - сервисы его нет,
запуск бата с имя.exe /install  вобще не запускается

Win2000


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

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

c:\>net start myservice

c:\>net stop myservice


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

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

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


 
Fay ©   (2006-01-11 03:35) [12]

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

Запусти с /i


 
Fay ©   (2006-01-11 03:37) [13]

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

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


 
Rouse_ ©   (2006-01-11 09:02) [14]

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


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

>Fay

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

>Rouse_

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


 
Reindeer Moss Eater ©   (2006-01-11 11:08) [16]

net start c:\1.exe

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


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


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

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

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

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


 
Rouse_ ©   (2006-01-12 14:12) [18]


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

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

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

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

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * 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


 
Rouse_ ©   (2006-01-12 14:14) [19]

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


 
BiN ©   (2006-01-12 14:50) [20]

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


 
Rouse_ ©   (2006-01-12 15:04) [21]

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


 
BiN ©   (2006-01-12 15:08) [22]


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


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

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


 
Rouse_ ©   (2006-01-12 15:14) [23]

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


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

>Rouse_

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

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

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


 
Rouse_ ©   (2006-01-12 15:41) [25]


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

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


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

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


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

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


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

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

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

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


 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;



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


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


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


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

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


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

Vadim M   (12.01.06 17:58) [28]

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



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.04 c
9-1127579027
E
2005-09-24 20:23
2006.04.02
OpenGL и текстуры


15-1141833486
grisme
2006-03-08 18:58
2006.04.02
Интеллигенция VS Пролетарий


15-1142009403
Новичоккк
2006-03-10 19:50
2006.04.02
Почему может тормозить копирование и прочее?


1-1141236048
X-Man
2006-03-01 21:00
2006.04.02
Заставить exe на Delphi грузить dll на c++


2-1142679172
Std
2006-03-18 13:52
2006.04.02
HTTPS