Avatar billede macpain Nybegynder
17. januar 2007 - 15:00 Der er 5 kommentarer og
1 løsning

oprettelse af (NT) Service

Jeg vil gerne oprette en service og det har jeg fundet ud af men...

Man kan få forskellige programmer der laver ens program om fra almindelige programmer(Applikation) til Services, så som XYNTService( http://www.codeproject.com/system/xyntservice.asp ) samt andre(Evt. http://www.firedaemon.com/ ).

Men jeg vil gerne lave det heeeelt fra bunden med de rigtige informationer.

Dette kan gøres ved at bruge informationerne fra nedenstående link:
http://www.codeproject.com/system/windows_nt_service.asp

Denne beskriver at man kan lave en Main eller en WinMain altså cmd styrrede services, men jeg vil gerne lave en opstart med en Applikation!!!

Hvordan gør jeg dette, hvis jeg ikke vil bruge hjælpe programmer til dette(XYNTService)
Avatar billede bertelbrander Novice
17. januar 2007 - 19:46 #1
Jeg er ikke sikker på at jeg forstår.
Du skriver at du vil lave det som en "Applikation", og ikke som en konsol, men med WinMain er det (som regel) en GUI.

Hvad mener du med "Applikation"?
Avatar billede macpain Nybegynder
18. januar 2007 - 19:07 #2
Beklager det meget langsomme svar!!
Men jeg er kommet ud over overstående problem....forkert forklaring af mig beklager WinMain bruges også til Applikationer.

Men..hvordan kan man skrive til og fra en service, jeg kan ikke få det til at fungere med fopen?

Er der et trik til at få det til at fungere? Hvis jeg feks. sætter Beep(200, 200) så fungere det ganske fint

Nedenstående i ServiceMain - selvfølgelig

  FILE *stream;
  bRunning=true;
  int count = 1;
  while(bRunning)
  {
    if( (stream  = fopen( "c:\text.txt", "a" )) == NULL )
      printf( "The file 'data' was not to be appended\n" );
  else
      printf( "This was the %d time the file was appended.\n",count++ );

  }

  /* Close stream */
  if( fclose( stream ) )
    printf( "The file 'data' was not closed\n" );
Avatar billede bertelbrander Novice
18. januar 2007 - 19:55 #3
Det er fopen( "c:\\text.txt", "a" )) == NULL )

DVS to \\
Avatar billede macpain Nybegynder
18. januar 2007 - 21:59 #4
Damm, jeg håber ikke det er det der er problemet da jeg har rettet det til en gang tidligere, hrmmm....

Der kan ikke være nogle security issues der gør man ikke kan skrive til en disken.
Jeg tænker her på at når man læser de sporatiske inlæg der er rundt omkring så bliver der skrevet lidt om security.
Ikke for på nogen måde at tvivle på at det "bare" er \\ der er problemet. Ved du så om der er nogle ting man ikke kan i forhold til almindelige cmd og windows programmer ud over f.eks. MessageBox og andre popup vinduer, eller er der måske også måde hvorpå man kan det også (dog er Debugging lidt vanskeligt i services).
Avatar billede macpain Nybegynder
18. januar 2007 - 23:46 #5
Nå fandt ud af at fopen("xx","a") med a kan drille samt fflush() er en god ide da File buffer der bliver samtlet så det blev sådan her!!
Hvor svært kan det være!!!
Men hvis du ved om der er begrænsninger så sig det gerne!!

  static FILE *log = 0;
  log = fopen("log.txt", "a+");
  if (!log) log = fopen("log.txt", "wt");
 
  char str[64];
  int count = 1;

  bRunning=true;
  while(bRunning)
  {
    Sleep(3000);

    sprintf(str, "This was the %d time the file was appended.\n", count++);
    if(log  != NULL)
      fputs (str,log);
    fflush(log);
  }

  /* Close stream */
  if( fclose( log ) )
      printf( "The file 'data' was not closed\n" );
Avatar billede macpain Nybegynder
05. februar 2007 - 00:17 #6
Lukker lige denne:
Endte med at bruge denne hjemmelavede service der installeres med -i og slet med -d, meget let og ligetil.

Der er ikke nogen restriktioner, af hvad jeg ved af udover selvfølgelig ingen messagepopups - af hvad jeg ved af!

De links jeg refere til tidligere fungere men desværre lagtfra som jeg gerne vil have dem til så de er modificeret en hel del. Så nu virker de!!

#include "stdafx.h"
#include "Windows.h"
#include "Winsvc.h"
#include "time.h"

const char* m_szServiceName = "MyService";

SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService();
BOOL DeleteService();
int main(int argc, char* argv[])
{
  if(argc>1)
  {
    if(strcmp(argv[1],"-i")==0)
      InstallService();

    else if(strcmp(argv[1],"-d")==0)
      DeleteService();
    else
    {
      char strMsg[256];
      sprintf(strMsg, "\n\nUnknown Switch Usage\n\nTo Install use %s -i\n\nTo UnInstall use %s -d\n",
              m_szServiceName,m_szServiceName);
      MessageBox(NULL, _T(strMsg), m_szServiceName, MB_OK);
    }
  }
  else
  {
    SERVICE_TABLE_ENTRY DispatchTable[]=
                {{"m_szServiceName",ServiceMain},{NULL,NULL}};
    StartServiceCtrlDispatcher(DispatchTable);
  }
  return 0;
}

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
  //DWORD status;
  //DWORD specificError;
  m_ServiceStatus.dwServiceType = SERVICE_WIN32;
  m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
  m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  m_ServiceStatus.dwWin32ExitCode = 0;
  m_ServiceStatus.dwServiceSpecificExitCode = 0;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;

  m_ServiceStatusHandle = RegisterServiceCtrlHandler("m_szServiceName",
                                            ServiceCtrlHandler);
  if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
  {
    return;
  }
  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;
  if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
  {
    //It is not possible to start service therefor return
    return;
  }

  CServiceIni iniReceiver;
  if(!iniReceiver.readFromIni())
  {
    return;
  }
 
  CJMS *receiver = CJMS::create();
  CServiceLog *log = new CServiceLog();
 
  if(log)
  {
    return;
  }

  bRunning=true;
  while(bRunning)
  {
    //Put your code in here
  }

 
  return;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
  switch(Opcode)
  {
    case SERVICE_CONTROL_PAUSE:
      m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
      break;
    case SERVICE_CONTROL_CONTINUE:
      m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      break;
    case SERVICE_CONTROL_STOP:
      m_ServiceStatus.dwWin32ExitCode = 0;
      m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
      m_ServiceStatus.dwCheckPoint = 0;
      m_ServiceStatus.dwWaitHint = 0;

      SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
      bRunning=false;
      break;
    case SERVICE_CONTROL_INTERROGATE:
      break;
  }
  return;
}

BOOL InstallService()
{

  SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), m_szServiceName, MB_OK);
        return FALSE;
    }

    // Get the executable file path
    TCHAR szFilePath[_MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, _MAX_PATH);

    SC_HANDLE hService = ::CreateService(
                  hSCM,
                  m_szServiceName,            //Servicename
                  m_szServiceName,            //Displayname
                  SERVICE_ALL_ACCESS,        //Desired access
                  SERVICE_WIN32_OWN_PROCESS,  //Servicetype
                  SERVICE_DEMAND_START,      //Starttype
                  SERVICE_ERROR_NORMAL,      //Errorcontrol
                  szFilePath,                //Path to file
                  NULL,                      //No loading ordering group
                  NULL,                      //No tag identifier
                  _T("RPCSS\0"),              //No dependencies
                  NULL,                      //LocalSystem account
                  NULL);                      //No password

    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't create service"), m_szServiceName, MB_OK);
        return FALSE;
    }
    else
      MessageBox(NULL, _T("Service created"), m_szServiceName, MB_OK);

    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

BOOL DeleteService()
{
  SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

  if (hSCM == NULL)
  {
      MessageBox(NULL, _T("Couldn't open service manager"), m_szServiceName, MB_OK);
      return FALSE;
  }

  SC_HANDLE hService = ::OpenService(hSCM, m_szServiceName, SERVICE_STOP | DELETE);

  if (hService == NULL)
  {
      ::CloseServiceHandle(hSCM);
      MessageBox(NULL, _T("Couldn't open service"), m_szServiceName, MB_OK);
      return FALSE;
  }
  SERVICE_STATUS status;
  ::ControlService(hService, SERVICE_CONTROL_STOP, &status);

  BOOL bDelete = ::DeleteService(hService);
  ::CloseServiceHandle(hService);
  ::CloseServiceHandle(hSCM);

  if (bDelete)
  {
    MessageBox(NULL, _T("Service deleted"), m_szServiceName, MB_OK);
    return TRUE;
  }
 
  MessageBox(NULL, _T("Service could not be deleted"), m_szServiceName, MB_OK);
  return FALSE;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester