Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Список сервисов не выводится читабельно


Автор: Ksen 28.4.2011, 14:57
Подскажите пожалуйста....почему у меня не выводятся на консоль нормальные читаемые названия сервисов?   lpservice[i].lpServiceName выводит только одни цифры непонятные(((( что надо ещё добавить?
Код

#include "windows.h"
#include "iostream"    
#include <stdio.h>
using namespace std;

int wmain(int argc, wchar_t* argv[], wchar_t* envp[])
{
     SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
    
    //ENUM_SERVICE_STATUS_PROCESS Services[100] = { 0 };
    ENUM_SERVICE_STATUS *lpservice;
    DWORD dwBytesNeeded = 0;
    DWORD dwServicesReturned = 0;
    DWORD dwResumeHandle = 0;
    BOOL bSuccess = FALSE;
        bSuccess = EnumServicesStatusEx(hSCManager, 
                                SC_ENUM_PROCESS_INFO,
                                SERVICE_WIN32, 
                                SERVICE_STATE_ALL, 
                                NULL,
                                0,
                                &dwBytesNeeded, 
                                &dwServicesReturned,
                                &dwResumeHandle, 
                                NULL);
        
    DWORD err = GetLastError();
        
        if (!bSuccess || err == ERROR_MORE_DATA)
              {
                     DWORD dwBytes = dwBytesNeeded + sizeof(ENUM_SERVICE_STATUS);
                     lpservice = new ENUM_SERVICE_STATUS [dwBytes];
                     EnumServicesStatusEx(hSCManager, 
                              SC_ENUM_PROCESS_INFO,
                              SERVICE_WIN32, 
                              SERVICE_STATE_ALL, 
                              LPBYTE(lpservice),
                              dwBytes,
                              &dwBytesNeeded, 
                              &dwServicesReturned,
                              &dwResumeHandle, 
                              NULL);
              }


    for(int i=0; i<dwServicesReturned; i++)
    cout << lpservice[i].lpServiceName << endl;

    CloseServiceHandle(hSCManager);
}

Автор: jimbo 28.4.2011, 18:07
Код

wcout << lpservice[i].lpServiceName << endl;

?

Автор: Ksen 28.4.2011, 18:20
(((сделала как msdn велит...но Display Name русским языком не выводится? что нужно сделать чтобы выводил?

Код

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
 SC_HANDLE hSCM    = NULL;
 PUCHAR  pBuf    = NULL;
 ULONG  dwBufSize   = 0x00;
 ULONG  dwBufNeed   = 0x00;
 ULONG  dwNumberOfService = 0x00;

 LPENUM_SERVICE_STATUS_PROCESS pInfo = NULL;

 hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);

 if (hSCM == NULL)
 {
  printf_s("OpenSCManager fail \n");
  return 0xffff0001;
 }

 EnumServicesStatusEx(
  hSCM,
  SC_ENUM_PROCESS_INFO,
  SERVICE_WIN32, // SERVICE_DRIVER
  SERVICE_STATE_ALL,
  NULL,
  dwBufSize,
  &dwBufNeed,
  &dwNumberOfService,
  NULL,
  NULL);

 if (dwBufNeed < 0x01)
 {
  printf_s("EnumServicesStatusEx fail ?? \n");
  return 0xffff0002;
 }

 dwBufSize = dwBufNeed + 0x10;
 pBuf  = (PUCHAR) malloc(dwBufSize);

 EnumServicesStatusEx(
  hSCM,
  SC_ENUM_PROCESS_INFO,
  SERVICE_WIN32,  // SERVICE_DRIVER,
  SERVICE_ACTIVE,  //SERVICE_STATE_ALL,
  pBuf,
  dwBufSize,
  &dwBufNeed,
  &dwNumberOfService,
  NULL,
  NULL);

 pInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
 for (ULONG i=0;i<dwNumberOfService;i++)
 {
  wprintf_s(L"Display Name \t : %s \n", pInfo[i].lpDisplayName);
  wprintf_s(L"Service Name \t : %s \n", pInfo[i].lpServiceName);
  //wprintf_s(L"Process Id \t : %04x (%d) \n", pInfo[i].ServiceStatusProcess.dwProcessId, pInfo[i].ServiceStatusProcess.dwProcessId);
 }

 free(pBuf);

 CloseServiceHandle(hSCM);

 return 0;
}


Добавлено через 14 минут и 31 секунду
wcout << lpservice[i].lpServiceName << endl;

а что вам здесь не нравится?...не понимаю...

Автор: jimbo 28.4.2011, 19:11

Код

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <locale.h>

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"russian");
 SC_HANDLE hSCM    = NULL;
 PUCHAR  pBuf    = NULL;
 ULONG  dwBufSize   = 0x00;
 ULONG  dwBufNeed   = 0x00;
 ULONG  dwNumberOfService = 0x00;
 LPENUM_SERVICE_STATUS_PROCESS pInfo = NULL;
 hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);
 if (hSCM == NULL)
 {
  printf_s("OpenSCManager fail \n");
  return 0xffff0001;
 }
 EnumServicesStatusEx(
  hSCM,
  SC_ENUM_PROCESS_INFO,
  SERVICE_WIN32, // SERVICE_DRIVER
  SERVICE_STATE_ALL,
  NULL,
  dwBufSize,
  &dwBufNeed,
  &dwNumberOfService,
  NULL,
  NULL);
 if (dwBufNeed < 0x01)
 {
  printf_s("EnumServicesStatusEx fail ?? \n");
  return 0xffff0002;
 }
 dwBufSize = dwBufNeed + 0x10;
 pBuf  = (PUCHAR) malloc(dwBufSize);
 EnumServicesStatusEx(
  hSCM,
  SC_ENUM_PROCESS_INFO,
  SERVICE_WIN32,  // SERVICE_DRIVER,
  SERVICE_ACTIVE,  //SERVICE_STATE_ALL,
  pBuf,
  dwBufSize,
  &dwBufNeed,
  &dwNumberOfService,
  NULL,
  NULL);
 pInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
 for (ULONG i=0;i<dwNumberOfService;i++)
 {
  wprintf_s(L"Display Name \t : %s \n", pInfo[i].lpDisplayName);
  wprintf_s(L"Service Name \t : %s \n", pInfo[i].lpServiceName);
  //wprintf_s(L"Process Id \t : %04x (%d) \n", pInfo[i].ServiceStatusProcess.dwProcessId, pInfo[i].ServiceStatusProcess.dwProcessId);
 }
 free(pBuf);
 CloseServiceHandle(hSCM);
 return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)