Добавить программу в службы Windows - VB
Формулировка задачи:
Подскажите пожалуйста куда и что нужно прописать чтобы моя программа загружалась как служба Windows (чтобы она запускалась при загрузке) и если не лень объясните пожалуйста чем обычная автозагрузка отличается от служб Windows.
PS: Мне просто интересно.
Решение задачи: «Добавить программу в службы Windows»
textual
Листинг программы
int main( int argc, char* argv[] )
{
if ( !StartServiceCtrlDispatcher(DispatchTable) )
{
sprintf( g_Msg,"BanxPort StartServiceCtrlDispatcher error = %d", GetLastError() );
}
return 0;
}
// Second function to implement
VOID WINAPI ServiceMain( DWORD argc, LPTSTR *argv )
{
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
ServiceStatusHandle = RegisterServiceCtrlHandler( "Name_Service", ServiceCtrlHandler );
if ( ServiceStatusHandle == (SERVICE_STATUS_HANDLE) 0 )
{
sprintf(g_Msg, "Name_Service! RegisterServiceCtrlHandler() failed %d", GetLastError() );
return;
}
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
if ( !SetServiceStatus( ServiceStatusHandle, &ServiceStatus ) )
{
sprintf( g_Msg,"BanxPort! SetServiceStatus() error %ld", GetLastError() );
WriteInLogFile(g_Msg);
}
g_isRunning = true;
sprintf( g_Msg, "Just before processing Loop..." );
WriteInLogFile(g_Msg);
while (1)
{
// тут находится наш код, для примера просто сигналы через динамик
Beep(1000, 200);
Sleep(1000);
if ( !g_isRunning )
{
break;
}
}
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
// Send current status.
if (!SetServiceStatus(ServiceStatusHandle, &ServiceStatus))
{
sprintf(g_Msg,"BanxPort! SetServiceStatus error %ld", GetLastError() );
WriteInLogFile( g_Msg );
}
return;
}
VOID WINAPI ServiceCtrlHandler(DWORD dwControl)
{
switch(dwControl)
{
case SERVICE_CONTROL_PAUSE:
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
g_isRunning = false;
if ( !SetServiceStatus( ServiceStatusHandle, &ServiceStatus) )
{
sprintf(g_Msg,"Name_Service! SetServiceStatus() error %ld",GetLastError() );
WriteInLogFile(g_Msg);
}
sprintf(g_Msg, "Name_Service! leaving handler ", 0 );
WriteInLogFile(g_Msg);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
sprintf(g_Msg, "Name_Service unrecognized control code %ld", dwControl );
}
// Send current status.
if ( !SetServiceStatus(ServiceStatusHandle, &ServiceStatus) )
{
sprintf(g_Msg,"Name_Service! SetServiceStatus() error %ld", GetLastError() );
WriteInLogFile( g_Msg );
}
return;
}