Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2020, 19:31   #1
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию проблемы после перехода на 10.4.1

Доброго дня, в 10.4.1 при компиляции ругается на строку
Код:
        EnumServicesStatus(sch,ServiceMode,ServiceStatus,lpServices[0],0,pcbBytesNeeded,lpServicesReturned,lpResumeHandle);
Цитата:
[dcc32 Error] GetSvс.pas(114): E2010 Incompatible types: 'LPENUM_SERVICE_STATUSW' and '_ENUM_SERVICE_STATUSW'
[dcc32 Error] GetSvс.pas(118): E2010 Incompatible types: 'LPENUM_SERVICE_STATUSW' and '_ENUM_SERVICE_STATUSW'
В 10.3 компилируется нормально, подскажите, что там поменялось, как поправить ?
вся функция
Цитата:
//Вовзращает полный список служб или только запущенные (OnlyActive=OnlyActive) в JSON
Function GetSvcListJSON(OnlyActive: String ): String;
var
sch: SC_HANDLE;
ServiceMode, ServiceStatus : integer;
pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
lpServices : array of TEnumServiceStatus;
i : integer;

JSObject: TJSONObject;
JSArry: TJSONArray;

Pocket: TStringlist;

function GetSpecialPath(CSIDL: word): string;
var s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, true)
then s := '';
result :=LowerCase( PChar(s))+'\';
end;


//Конвертация переменной окружения в путь
function ExpandEnvironmentString(const Source : string): string;
var
ln: Cardinal;
temp: String;
begin
ln := ExpandEnvironmentStrings(PChar(Sour ce),nil,0);
SetLength(temp,ln);
ExpandEnvironmentStrings(PChar(Sour ce),PChar(temp),ln);
temp:= StringReplace(LowerCase( temp), LowerCase('\SystemRoot\'),GetSpecia lPath(CSIDL_WINDOWS), [rfReplaceAll, rfIgnoreCase]);
temp:= StringReplace(temp, '"','', [rfReplaceAll, rfIgnoreCase]);


if ExtractFileName(Source)<>'' then
begin
if ExtractFileDrive(temp)='' then
temp:=GetSpecialPath(CSIDL_WINDOWS) +temp;
end;



result:=temp;
end;

//Путь к ЕХЕ службы
Function GetFilePath(SvcName: String): String;
var
reg: Tregistry;
begin
TRY
REG:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlS et\Services\'+SvcName,false);
result:=reg.ReadString('ImagePath') ;

FINALLY
FreeAndNil(reg);
END;
end;

//Состояние слубы из числа в текст
Function GetStat(card: Cardinal): String;
var
str: String;
begin
str := 'N\A';
case card of
SERVICE_STOPPED: str := 'STOPPED'; // не запущен
SERVICE_START_PENDING: str := 'START_PENDING'; //Сервис в процессе запуска
SERVICE_STOP_PENDING: str := 'STOP_PENDING'; //Сервис в процессе завершения
SERVICE_RUNNING: str := 'RUNNING'; //Сервис запущен
SERVICE_CONTINUE_PENDING: str := 'CONTINUE_PENDING'; //Сервис в процессе запуска после временной оснановки
SERVICE_PAUSE_PENDING: str := 'PAUSE_PENDING'; //Сервис в процессе временной оснановки
SERVICE_PAUSED: str := 'PAUSED'; //Сервис временно оснановлен
end;
result:=EncodeString(str);
end;
begin
sch := WinSvc.OpenSCManager(Nil, Nil, GENERIC_READ);
ServiceMode:= SERVICE_WIN32 or SERVICE_DRIVER;

if OnlyActive='OnlyActive' then
ServiceStatus:= SERVICE_ACTIVE else
ServiceStatus:= SERVICE_ACTIVE or SERVICE_INACTIVE ;

lpResumeHandle := 0;

EnumServicesStatus(sch,ServiceMode, ServiceStatus,lpServices[0],0,pcbBytesNeeded,lpServicesReturne d,lpResumeHandle);
SetLength(lpServices, pcbBytesNeeded div SizeOf(TEnumServiceStatus));
lpResumeHandle := 0;

EnumServicesStatus(sch,ServiceMode, ServiceStatus,lpServices[0],Length(lpServices) * SizeOf(TEnumServiceStatus),pcbBytes Needed,lpServicesReturned,lpResumeH andle);

TRY
JSArry:=TJSONArray.Create;


for i := 0 to Pred(lpServicesReturned) do
begin
JSObject:=TJSONObject.Create;
JSObject.AddPair('lpServiceName',TJ SONString.Create(EncodeString( lpServices[i].lpServiceName)));
JSObject.AddPair('lpDisplayName',TJ SONString.Create(EncodeString( lpServices[i].lpDisplayName)));
JSObject.AddPair('lpDisplayStat',TJ SONString.Create(GetStat( lpServices[i].ServiceStatus.dwCurrentState )));
JSObject.AddPair('ImagePath',TJSONS tring.Create( EncodeString( ExpandEnvironmentString( GetFilePath(lpServices[i].lpServiceName) ) ) ));


JSArry.AddElement(JSObject);
end;


result:= JSArry.ToJSON;


FINALLY
FreeAndNil(JSArry);
END;

CloseServiceHandle(sch);
end;
remus-xe2 вне форума Ответить с цитированием
Старый 07.11.2020, 14:36   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
Incompatible types: 'LPENUM_SERVICE_STATUSW' and '_ENUM_SERVICE_STATUSW'
Это он на какую переменную ругается?
какая из ваших переменных имеет такой тип?
вы ее как указатель передаёте?
BLACK_RAIN вне форума Ответить с цитированием
Старый 07.11.2020, 23:56   #3
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Это он на какую переменную ругается?
какая из ваших переменных имеет такой тип?
вы ее как указатель передаёте?
ругается судя по всему на 4й параметр (lpServices[0]).
Я если честно плаваю в указателях... Обычная переменная вроде...

Поискал другие варианты получения списка сервисов в интернете....
Все они конечно сводятся к использованию EnumServicesStatus но в целом иначе выполнены, и не один из них не компилируется и все с этой ошибкой... Такое чувство что это проблема в WinSvc...
remus-xe2 вне форума Ответить с цитированием
Старый 08.11.2020, 00:02   #4
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Код:
procedure TfmMain.GetServiceList(AList: TStrings);
var
 hSC: THandle;
 pcbBytesNeeded, lpServicesReturned, lpResumeHandle,
 cbBufSize: DWORD;
 pStatus, pWork: PEnumServiceStatus;
 i: integer;
 s1: string;
 sl1: TStringList;
begin
 hSC := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
 if hSC = 0 then
   exit;
 try
   AList.Clear;
   cbBufSize := 0;
   lpResumeHandle := 0;
   EnumServicesStatus(hSC,
     SERVICE_WIN32,
     SERVICE_STATE_ALL,
     pStatus^,
     cbBufSize,
     pcbBytesNeeded,
     lpServicesReturned,
     lpResumeHandle);
   pStatus := AllocMem(pcbBytesNeeded);
   sl1 := TStringList.Create;
   try
     sl1.Delimiter := ";";
     cbBufSize := pcbBytesNeeded;
     EnumServicesStatus(hSC,
       SERVICE_WIN32,
       SERVICE_STATE_ALL,
       pStatus^,
       cbBufSize,
       pcbBytesNeeded,
       lpServicesReturned,
       lpResumeHandle);
     pWork := pStatus;
     for i := 1 to lpServicesReturned do
     begin
       case pWork^.ServiceStatus.dwCurrentState of
         SERVICE_CONTINUE_PENDING: s1 := "Wait...";
         SERVICE_PAUSE_PENDING: s1 := "Pausing";
         SERVICE_PAUSED: s1 := "Paused";
         SERVICE_RUNNING: s1 := "Working";
         SERVICE_START_PENDING: s1 := "Starting";
         SERVICE_STOP_PENDING: s1 := "Stoping";
         SERVICE_STOPPED: s1 := "Stoped";
       end;
       sl1.Clear;
       sl1.Add(pWork^.lpDisplayName +
         " (" + pWork^.lpServiceName + ")");
       sl1.Add(s1);
       AList.Add(sl1.DelimitedText);
       inc(pWork);
     end;
   finally
     if Assigned(pStatus) then
     begin
       FreeMem(pStatus,pcbBytesNeeded);
     end;
     sl1.Free;
   end;
 finally
   CloseServiceHandle(hSC);
 end;
end;
вот вариант, тут уже указатель передается...
та же самая проблема.
remus-xe2 вне форума Ответить с цитированием
Старый 08.11.2020, 07:53   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
ругается судя по всему на 4й параметр (lpServices[0]).
попробуйте написать так
Код:
EnumServicesStatus(sch, ServiceMode, ServiceStatus,
                              @lpServices[0],
                               0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);
или так
Код:
EnumServicesStatus(sch, ServiceMode, ServiceStatus,
                              @lpServices,
                               0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);
Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
вот вариант, тут уже указатель передается...
Я не вижу, что и куда передаётся.
напишите строчку с ошибкой отдельно.

Последний раз редактировалось BLACK_RAIN; 08.11.2020 в 08:04.
BLACK_RAIN вне форума Ответить с цитированием
Старый 08.11.2020, 11:26   #6
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
попробуйте написать так
Код:
EnumServicesStatus(sch, ServiceMode, ServiceStatus,
@lpServices[0],
0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);
завелось) спасибо....
remus-xe2 вне форума Ответить с цитированием
Старый 08.11.2020, 14:27   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от remus-xe2 Посмотреть сообщение
завелось) спасибо...
Это не совсем правильно. Странно, что работает. Надо как-то так:
Код:
var
  Services, enum_ : PEnumServiceStatus;
  sch: SC_HANDLE;
  pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
  i, cbBufSize : DWORD;
begin
  sch := OpenSCManager(Nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ENUMERATE_SERVICE);
  if (sch <> 0) and (sch <> ERROR_ACCESS_DENIED) then
  begin
    Services := nil;
    lpResumeHandle := 0;
    pcbBytesNeeded := 0;
    EnumServicesStatus(sch, SERVICE_WIN32, SERVICE_STATE_ALL,
      Services^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle);
    if pcbBytesNeeded > 0 then
    begin
      cbBufSize := pcbBytesNeeded;
      GetMem(Services, cbBufSize);
      if EnumServicesStatus(sch, SERVICE_WIN32, SERVICE_STATE_ALL,
                            Services^, cbBufSize, pcbBytesNeeded,
                            lpServicesReturned, lpResumeHandle) then
      begin
        enum_ := Services;
        for I := 0 to lpServicesReturned - 1 do
        begin
          ListBox1.Items.Add(enum_^.lpDisplayName);
          inc(enum_);
        end;
      end;
      FreeMem(Services, cbBufSize);
    end;
    CloseServiceHandle(sch);
  end;
end;
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с Timezone после перехода на AppServ 8.1.0 Shouldercannon PHP 3 16.03.2016 16:21
IdHttps проблемы после переустановки Fahman Общие вопросы Delphi 3 25.05.2014 15:11
Смена картинки после перехода на другую ссылку MarihuanaP JavaScript, Ajax 2 03.03.2012 22:29
Проблемы после оптимизации PNG slips HTML и CSS 0 22.05.2010 00:56
как сделать вверрху меню с ссылками, после перехода по которым подгружались бы сайты. Chaos-Delta HTML и CSS 30 12.01.2008 11:21