| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 <имя службы> и не морочь голову ни себе ни людям |
| Автор: spyswamp 29.8.2011, 15:01 |
| xvr, просто ShellExec(), ничего особенного - WinAPI едино для всех. |