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


Автор: Ромео 27.8.2011, 21:34
помогите перевести пожалуйста на Делфи, я уже MSDN прошарил по этому вопросу, на др форумах есть коечто подобное но написан исхожник неверно, вот я собрал по кусочкам с коекаких книжек и вышло типа такого, но могут быть ошибки, помогите разобраться, СУть проги: отключение служб, если имеются зависимые службы, то закртыть сначала их , а потом уже и её саму
//-----------------------------------------------------------------------
// DemoServiceStopWithDependents
//
//  Останавливает указанную службу и все зависимые от нее службы.
//
//  Параметры:
//      hSCM           - handle SCM
//      pszServiceName - имя службы
//
//  Возвращает:
//      ноль - при успешном завершении, отличное от нуля значение - в
//      противном случае.
//
int DemoServiceStopWithDependents(
    IN SC_HANDLE hSCM, 
    IN PCTSTR pszServiceName
    )
{
    _ASSERTE(hSCM != NULL);
    _ASSERTE(pszServiceName != NULL);

    SC_HANDLE hService;
    LPENUM_SERVICE_STATUS pStatus;
    DWORD cbNeeded, i;
    DWORD cServices = 0;

    // открываем handle службы с правом доступа 
    // SERVICE_ENUMERATE_DEPENDENTS
    hService = OpenService(hSCM, pszServiceName, 
                           SERVICE_ENUMERATE_DEPENDENTS);
    if (hService == NULL)
        return PrintError(_T("OpenService failed"), GetLastError());

    // определяем требуемый размер выходного буфера
    if (!EnumDependentServices(hService, SERVICE_ACTIVE, NULL, 0,
                               &cbNeeded, &cServices))
    {
        if (GetLastError() != ERROR_MORE_DATA)
        {
            PrintError(_T("EnumDependentServices failed"),
                       GetLastError());
            CloseServiceHandle(hService);
            return 1;
        }
    }

    if (cbNeeded > 0)
    {
        // выделяем память для выходного буфера
        pStatus = (LPENUM_SERVICE_STATUS)LocalAlloc(LMEM_FIXED, cbNeeded);
        if (pStatus == NULL)
        {
            _tprintf(_T("Not enough memory\n"));
            CloseServiceHandle(hService);
            return 1;
        }

        // получаем список зависимых служб
        if (!EnumDependentServices(hService, SERVICE_ACTIVE, pStatus,
                                   cbNeeded, &cbNeeded, &cServices))
        {
            PrintError(_T("EnumDependentServices failed"), 
                       GetLastError());

            LocalFree((HLOCAL)pStatus);
            CloseServiceHandle(hService);
            return 1;
        }
    }

    // останавливаем все зависимые службы
    for (i = 0; i < cServices; i++)
    {
        _tprintf(_T("Stopping %s...\n"), pStatus[i].lpDisplayName);

        if (DemoServiceStop(hSCM, pStatus[i].lpServiceName))
            break;
    }

    LocalFree((HLOCAL)pStatus);
    CloseServiceHandle(hService);

    if (i < cServices)
        return 1;
    
    // наконец, останавливаем указанную службу
    _tprintf(_T("Stopping %s...\n"), pszServiceName);
    return DemoServiceStop(hSCM, pszServiceName);
}

Автор: Earnest 29.8.2011, 08:52
Ты хочешь, чтобы кто-то проверил твой код? А сам посмотреть не можешь, компилируется или нет, работает или нет. Если есть конкретные проблемы, то так и пиши. А если хочешь, чтобы кто-то за тебя это сделал - то создавай соответствующую тему в разделе "Работа". 

Автор: xvr 29.8.2011, 12:31
Вызови через system (или что там вместо нее у Delphi) net stop <имя службы> и не морочь голову ни себе ни людям  smile 

Автор: spyswamp 29.8.2011, 15:01
xvr, просто ShellExec(), ничего особенного - WinAPI едино для всех. smile

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