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

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

Проблема с RasEnumConnections [D6, D7, Win2k, WinXP]


Lik ©   (2006-03-30 18:44:00) 

Имеем сервис:

type
 HRasConn = DWORD;
 PRasConn = ^TRasConn;            
 TRasConn = record
   dwSize: DWORD;
   rasConn: HRasConn;
   szEntryName: Array[0..256] Of Char;
   szDeviceType: Array[0..16] Of Char;
   szDeviceName: Array [0..128] Of char;
 end;

var
 RasEnumConnections:
       Function (RASConn: PrasConn; var BufSize: DWord; var Connections: DWord ): DWORD; stdcall;

procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
 case Opcode of
   SERVICE_CONTROL_STOP:ServiceStatus.dwCurrentState := SERVICE_STOPPED;
   SERVICE_CONTROL_INTERROGATE :SetServiceStatus (ServiceStatusHandle, ServiceStatus)
 end;
 SetServiceStatus (ServiceStatusHandle, ServiceStatus)
end;

Procedure ServiceProc(dwArgc: DWORD;lpszArgv: Pointer); StdCall;
var
 RConn:array[0..10] of TRasConn;
 a,f:DWord;
 Err:integer;
 l:THandle;
begin
 ServiceStatusHandle:=RegisterServiceCtrlHandler(ServiceName,@ServiceCtrlHandler) ;
 if ServiceStatusHandle=0 then exit;
 ServiceStatus.dwServiceType      := SERVICE_WIN32;
 ServiceStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP;
 ServiceStatus.dwWin32ExitCode           := 0;
 ServiceStatus.dwServiceSpecificExitCode := 0;
 ServiceStatus.dwCheckPoint              := 0;
 ServiceStatus.dwWaitHint                := 0;
 ServiceStatus.dwCurrentState :=SERVICE_RUNNING;
 SetServiceStatus(ServiceStatusHandle,ServiceStatus);

 l:=LoadLibrary('RASAPI32.DLL');
 RasEnumConnections := GetProcAddress(l, 'RasEnumConnectionsA');

 a:=SizeOF(RConn);
 f:=0;
 RConn[0].dwSize:=sizeof(TRasConn);
 Err:=RasEnumConnections(@RConn[0],a,f);

 ServiceStatus.dwCurrentState :=SERVICE_Stopped;
 ServiceStatus.dwWin32ExitCode           := 0;
 ServiceStatus.dwServiceSpecificExitCode := 0;
 ServiceStatus.dwCheckPoint              := 0;
 ServiceStatus.dwWaitHint                := 0;
 SetServiceStatus (ServiceStatusHandle,ServiceStatus);
end;

var
 DispatchTable : array [0..1] of TServiceTableEntryA;
begin
   DispatchTable[0].lpServiceName:=ServiceName;
   DispatchTable[0].lpServiceProc:=@ServiceProc;
   DispatchTable[1].lpServiceName:=nil;
   DispatchTable[1].lpServiceProc:=nil;
   StartServiceCtrlDispatcher(DispatchTable[0]);
end.

Здесь RasEnumConnections возвращает чудесное число "-2147467259" . Хотя в обычном exe-шнике функция выдаёт то, что от неё и требуется. Где тут косяк?


Lik   (2006-03-31 16:44:00) [1]


> С какого перепугу Int64-то ?

ну или Cardinal, число на выходе то же.


Сергей М.   (2006-03-31 16:40:00) [2]


> если тип Err:int64


С какого перепугу Int64-то ?


fellix   (2006-03-31 16:07:00) [3]

Ответ в Вашем же вопросе: "в Делфовском сервисе ... функция ... работает исправно".
Сравните реализацию сервисов у Вас и в Делфи.
Кстати, попробуйте установить SERVICE_START_PENDING. а уж потом SERVICE_RUNNING.
----------------
P.S. $80004005 - это Active Directory Service Interfaces error.
80004005 == Unspecified error. The cause of the COM object failure is indeterminate by ADSI.


Lik   (2006-03-31 15:39:00) [4]

если тип Err:int64 то функция возвращает число 2147500037 (80004005h). Ошибки с таким кодом не значится.
Пробовал использовать данный код (с RasEnumConnections) в Делфовском сервисе (File > New >  Service Application), функция так же работает исправно. Может что-то инициализировать ещё нужно?... Прошу подсказок, мастера!


Сергей М.   (2006-03-31 09:10:00) [5]

Используй RasGetErrorString() для получения текстового описания RAS-ошибки с указанным кодом.


Наверх

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