[ statquos @ 29.05.2008. 17:53 ] @
kako da napravim program koji radi kao servis (NT servis). program radi kao alarm, ima txt datoteko, gdje napisemo datum,sat i poruko, ki se kasnije javi na ekranu. |
[ statquos @ 29.05.2008. 17:53 ] @
[ X Files @ 29.05.2008. 17:58 ] @
Koje razvojno okruženje ćeš koristiti za razvoj?
[ statquos @ 29.05.2008. 18:57 ] @
Program bi trebao biti napisan u Visual C++
našao sam jedan primer NT servisa, sam ne znam kako da u ovaj servis napravim ovaj program http://www.codersource.net/win32_nt_service.html [ deerbeer @ 30.05.2008. 09:04 ] @
Pa na tom linku imas kompletan kod i postupak kako da ga napravis
i servis tj., program je napravljen kao konzolna aplikacija .... Ne znam sad sta ti nije jasno ? [ statquos @ 30.05.2008. 12:15 ] @
znam da je to kompletan postupak...
nisam neki stručnjak C++, ne znam dje naj upišem kod u ovaj program da radi kao "alarm" da prečita txt file in javi poruko... bere txt file: dje je napisan datum, sat i poruka i na ovaj sat i datum javi poruko... program mora pa radit kao servis. [ statquos @ 02.06.2008. 09:11 ] @
mi može ko dati pomoč da se napravi ovaj program...
[ BinaryRuler @ 02.06.2008. 21:28 ] @
Evo ti kod procesa koji upisuje text u log file.
Nadam se da ce ti pomoci. uprostiosam ti maksimalno. Code: // Service.cpp : Defines the entry point for the console application. // #include "stdafx.h" #define MAX_NUM_OF_PROCESS 4 /** Window Service **/ VOID ServiceMainProc(); VOID Install(char* pPath, char* pName); VOID UnInstall(char* pName); VOID WriteLog(char* pFile, char* pMsg); BOOL KillService(char* pName); BOOL RunService(char* pName); VOID ExecuteSubProcess(); VOID ProcMonitorThread(VOID *); VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv); VOID WINAPI ServiceHandler(DWORD fdwControl); /** Window Service **/ const int nBufferSize = 500; CHAR pServiceName[nBufferSize+1]; CHAR pExeFile[nBufferSize+1]; CHAR lpCmdLineData[nBufferSize+1]; CHAR pLogFile[nBufferSize+1]; BOOL ProcessStarted = TRUE; CRITICAL_SECTION myCS; SERVICE_TABLE_ENTRY lpServiceStartTable[] = { {pServiceName, ServiceMain}, {NULL, NULL} }; LPTSTR ProcessNames[MAX_NUM_OF_PROCESS]; SERVICE_STATUS_HANDLE hServiceStatusHandle; SERVICE_STATUS ServiceStatus; PROCESS_INFORMATION pProcInfo[MAX_NUM_OF_PROCESS]; int _tmain(int argc, _TCHAR* argv[]) { if(argc >= 2) strcpy(lpCmdLineData, argv[1]); ServiceMainProc(); return 0; } VOID ServiceMainProc() { ::InitializeCriticalSection(&myCS); // initialize variables for .exe and .log file names char pModuleFile[nBufferSize+1]; DWORD dwSize = GetModuleFileName(NULL, pModuleFile, nBufferSize); pModuleFile[dwSize] = 0; if(dwSize>4 && pModuleFile[dwSize-4] == '.') { sprintf(pExeFile,"%s",pModuleFile); pModuleFile[dwSize-4] = 0; sprintf(pLogFile,"%s.log",pModuleFile); } //Ovde Dodeljujes ime procesu strcpy(pServiceName,"SkyDiver"); if(_stricmp("-i",lpCmdLineData) == 0 || _stricmp("-I",lpCmdLineData) == 0) Install(pExeFile, pServiceName); else if(_stricmp("-k",lpCmdLineData) == 0 || _stricmp("-K",lpCmdLineData) == 0) KillService(pServiceName); else if(_stricmp("-u",lpCmdLineData) == 0 || _stricmp("-U",lpCmdLineData) == 0) UnInstall(pServiceName); else if(_stricmp("-s",lpCmdLineData) == 0 || _stricmp("-S",lpCmdLineData) == 0) RunService(pServiceName); else ExecuteSubProcess(); } VOID Install(char* pPath, char* pName) { SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (schSCManager==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { SC_HANDLE schService = CreateService ( schSCManager, /* SCManager database */ pName, /* name of service */ pName, /* service name to display */ SERVICE_ALL_ACCESS, /* desired access */ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /* service type */ SERVICE_AUTO_START, /* start type */ SERVICE_ERROR_NORMAL, /* error control type */ pPath, /* service's binary */ NULL, /* no load ordering group */ NULL, /* no tag identifier */ NULL, /* no dependencies */ NULL, /* LocalSystem account */ NULL ); /* no password */ if (schService==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "Failed to create service %s, error code = %d\n", pName, nError); WriteLog(pLogFile, pTemp); } else { char pTemp[121]; sprintf(pTemp, "Service %s installed\n", pName); WriteLog(pLogFile, pTemp); CloseServiceHandle(schService); } CloseServiceHandle(schSCManager); } } VOID UnInstall(char* pName) { SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); if (schSCManager==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS); if (schService==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { if(!DeleteService(schService)) { char pTemp[121]; sprintf(pTemp, "Failed to delete service %s\n", pName); WriteLog(pLogFile, pTemp); } else { char pTemp[121]; sprintf(pTemp, "Service %s removed\n",pName); WriteLog(pLogFile, pTemp); } CloseServiceHandle(schService); } CloseServiceHandle(schSCManager); } DeleteFile(pLogFile); } VOID WriteLog(char* pFile, char* pMsg) { // write error or other information into log file ::EnterCriticalSection(&myCS); try { SYSTEMTIME oT; ::GetLocalTime(&oT); FILE* pLog = fopen(pFile,"a"); fprintf(pLog,"%02d/%02d/%04d, %02d:%02d:%02d\n %s",oT.wMonth,oT.wDay,oT.wYear,oT.wHour,oT.wMinute,oT.wSecond,pMsg); fclose(pLog); } catch(...) {} ::LeaveCriticalSection(&myCS); } BOOL KillService(char* pName) { // kill service with given name SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); if (schSCManager==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { // open the service SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS); if (schService==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { // call ControlService to kill the given service SERVICE_STATUS status; if(ControlService(schService,SERVICE_CONTROL_STOP,&status)) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return TRUE; } else { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "ControlService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } CloseServiceHandle(schService); } CloseServiceHandle(schSCManager); } return FALSE; } BOOL RunService(char* pName) { // run service with given name SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); if (schSCManager==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenSCManager failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { // open the service SC_HANDLE schService = OpenService( schSCManager, pName, SERVICE_ALL_ACCESS); if (schService==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "OpenService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } else { // call StartService to run the service if(StartService(schService, 0, (const char**)NULL)) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return TRUE; } else { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "StartService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } CloseServiceHandle(schService); } CloseServiceHandle(schSCManager); } return FALSE; } VOID ExecuteSubProcess() { if(_beginthread(ProcMonitorThread, 0, NULL) == -1) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "StartService failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } if(!StartServiceCtrlDispatcher(lpServiceStartTable)) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "StartServiceCtrlDispatcher failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } ::DeleteCriticalSection(&myCS); } VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { DWORD status = 0; DWORD specificError = 0xfffffff; ServiceStatus.dwServiceType = SERVICE_WIN32; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; hServiceStatusHandle = RegisterServiceCtrlHandler(pServiceName, ServiceHandler); if (hServiceStatusHandle==0) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "RegisterServiceCtrlHandler failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); return; } // Initialization complete - report running status ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "SetServiceStatus failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } } VOID WINAPI ServiceHandler(DWORD fdwControl) { switch(fdwControl) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ProcessStarted = FALSE; ServiceStatus.dwWin32ExitCode = 0; ServiceStatus.dwCurrentState = SERVICE_STOPPED; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 0; break; case SERVICE_CONTROL_PAUSE: ServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: ServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_INTERROGATE: break; }; if (!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)) { long nError = GetLastError(); char pTemp[121]; sprintf(pTemp, "SetServiceStatus failed, error code = %d\n", nError); WriteLog(pLogFile, pTemp); } } VOID ProcMonitorThread(VOID *) { while(ProcessStarted == TRUE) { //Ovde programiras funkcionalnost procesa WriteLog(pLogFile, "Radim nesto u servisu!!!"); } } [ BinaryRuler @ 02.06.2008. 21:57 ] @
Ups, zaboravio sam da ti napisem kako da koristis
![]() Kada kompajliras projekat i dobijes imePrograma.exe koristis ga na sledeci nacin: Startujes cmd, dodjes u folder gde ti se nalazi imePrograma.exe. za instaliranje otkucas imePrograma.exe -i za Startovanje imePrograma.exe -s za stopiranje imePrograma.exe -k i za uninstall-iranje imePrograma.exe -u Takodje mozes posle instaliranja da ga stopiras i startujes iz windows-ovog service manager-a.\ pozdrav [ statquos @ 03.06.2008. 14:57 ] @
pokušao sam compile-at pa mi javi: fali datoteka stdafx.h
[ BinaryRuler @ 03.06.2008. 18:05 ] @
Ako radis sa Visual Studio-m, kada napravis novi projekat on automatski doda #include "stdafx.h",
to je standardno sa VS-om. Ako radis sa nekim drugim IDE- okruzenjem obrisi slobodnno. Zaboravio sam da ti navedem biblioteke koje trebas da koristis. Code: #include <process.h> #include <iostream> #include <tchar.h> #include <stdio.h> #include <windows.h> #include <winbase.h> #include <winsvc.h> Ovo ubacis ispred svega. u ovom slucaju umesto #include "stdafx.h". pozdrav [ statquos @ 04.06.2008. 17:53 ] @
u funkciji sem napisao da mi bere file pa mi svaki put bere in izpisuje ono što je u file-u
VOID ProcMonitorThread(VOID *) { while(ProcessStarted == TRUE) { //Ovde programiras funkcionalnost procesa //WriteLog(pLogFile, "Vpsujem servis!!!"); char date [9]; char time [9]; char time_dat [9]; char date_dat [9]; using namespace std; string line; ifstream myfile ("Scheduler.txt"); if (myfile.is_open()) { while (!myfile.eof()) { getline (myfile,line); cout << line << endl; } myfile.close(); } else cout << "Unable to open file"; } } [ BinaryRuler @ 05.06.2008. 07:57 ] @
Nisam te bas razumeo u cemu je problem.
Nabrzinu sa pogledao kod mislim da je ok. Jedina zamerka je sto si stavljao cout << "Unable to open file"; tj. ispis u klnzoli, jer ti je to nepotrebno nemozes da vidis sta je ispisao jer je to servis. Ako imas neki problem pitaj. [ statquos @ 05.06.2008. 09:48 ] @
da to razumijem da ne možeš vidjet sta je ispisao.
kako da bi sad napravio da mi uvijek čita datoteku i na sat (datum) javi poruku ("Napravi ručak!") datoteka (Scheduler.txt): 06/05/08 14:30:00 Napravi ručak! VOID ProcMonitorThread(VOID *) { while(ProcessStarted == TRUE) { //Ovde programiras funkcionalnost procesa //WriteLog(pLogFile, "Vpsujem servis!!!"); char date [9]; char time [9]; char time_dat [9]; char date_dat [9]; //cout << "Sistemski datum : " << _strdate(date) <<endl; //cout << "Sistemski sat : " << _strtime(time) <<endl; using namespace std; string line; ifstream myfile ("Scheduler.txt"); if (myfile.is_open()) { while (!myfile.eof()) { getline (myfile,line); cout << line << endl; } /*do { if ( !strcmp(time_dat,time) && !strcmp(date_dat,date) ) //javi poruko ono šta je u datoteki if(MessageBox(NULL, time, "Poruka!", MB_ICONINFORMATION) ==IDOK) exit(0); } while(time_dat != _strdate(time) && date_dat != _strdate(date));*/ myfile.close(); } } } [Ovu poruku je menjao statquos dana 05.06.2008. u 11:00 GMT+1] [Ovu poruku je menjao statquos dana 05.06.2008. u 14:18 GMT+1] [Ovu poruku je menjao statquos dana 05.06.2008. u 14:18 GMT+1] [ BinaryRuler @ 08.06.2008. 21:42 ] @
To bi moglo da ti prodje sa ovim.
f ( !strcmp(time_dat,time) && !strcmp(date_dat,date) ) //javi poruko ono šta je u datoteki if(MessageBox(NULL, time, "Poruka!", MB_ICONINFORMATION) ==IDOK) exit(0); [ statquos @ 12.06.2008. 15:26 ] @
program bi trebao ucitavat datum i sat u datoteki i pogledat sistemski sat i datum
onda bi na ovaj sat i datum ubacil poruko Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|