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" );
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" );
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;
}