Problem med system service
Hej eksperter.Jeg sidder her og bliver godt skaldet efterhånden da jeg har revet en god potion hår ud af hovedet.
Jeg er ved at lave et program som skal kigge ud på com-porten og se om der er forbindelse, er der det skal der gøres nogle ting, har forbindelsen været åben før og den så bliver lukket igen skal der gøres noget andet.
Mit problem er at jeg i den klasse/tråd som kigger ud på com-porten ikke kan sætte den variabel som fortæller hoved programmet at forbindelsen er lukket/åben.
Programmet compiler fint men når jeg forsøger at debugge den får jeg følgende fejl:
SurfCenter.SurfCenter.open
'SurfCenter.SurfCenter' does not contain a definition for 'SurfCenter'
Kode:
Service.cs
using System;
using System.Diagnostics;
using System.ServiceProcess;
using System.IO.Ports;
using System.Threading;
using System.IO;
using Microsoft.Win32;
using System.Timers;
namespace SurfCenter
{
public partial class SurfCenter : ServiceBase
{
//variabel som globalt holder styr på om forbindelsen er åben eller lukket
public static int open;
//variabel der fortæller om det er første gang at programmet modtager et disconnect fra com-porten
public static int firstdisconnect;
//variabel der fortæller om det er første gang at progammet modtager et connect fra com-porten
public static int firstconnect = 1;
//thread til at lytte på comporten efter connect/disconnect
Thread traad;
//thread til at fortælle databasen at maskinen stadigvæk er online.
Thread otraad;
public static int lopen = 0;
public SurfCenter()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//disable mus og keyboard ved opstart.
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "C:\\sc\\Devcon.exe";
proc.StartInfo.Arguments = "remove HID* >null";
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
//sæt timers op - uendelig løkke fejler i system services
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 1000;
aTimer.Enabled = true;
GC.KeepAlive(aTimer);
otraad = new Thread(new ThreadStart(this.onlinefunction));
otraad.Start();
}
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
}
public void OnTimedEvent(object source, EventArgs e)
{
traad = new Thread(new ThreadStart(this.treadfunction));
traad.Start();
Thread.Sleep(2000);
if (open == 1)
{
//Hvis forbindelsen var lukket før.
if (lopen == 0)
{
//logonting udføres
lopen = 1;
this.connect();
}
}
else
{
//hvis forbindelsen var åben før
if (lopen == 1)
{
this.disconnect();
//lav logofting
//fortæl programmet at forbindelsen er lukket
lopen = 0;
}
}
}
public void connect()
{
if (firstconnect == 1)
{
//keyboard og mus enables.
ProcessStartInfo startInfo = new ProcessStartInfo("C:\\sc\\Devcon.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "rescan >null";
Process.Start(startInfo);
//vi logger af så vi kan vælge sprog.
ProcessStartInfo startInfo1 = new ProcessStartInfo("c:\\sc\\logout.bat");
startInfo1.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo1);
//enable usbstorage
RegistryKey OurKey = Registry.LocalMachine;
OurKey = OurKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\UsbStor", true);
OurKey.SetValue("Start", 3);
OurKey.Close();
//fortæl programmet at næste connect er det første der er modtaget.
firstconnect = 0;
}
}
public void disconnect()
{
//hvis det er første gang vi modtager et disconnect fra møntindkastet skal vi ikke gøre noget
if (firstdisconnect == 0)
{
firstdisconnect = 1;
}
else
{
//keyboard og mus disables
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "C:\\sc\\Devcon.exe";
proc.StartInfo.Arguments = "remove HID* >null";
proc.Start();
proc.WaitForExit();
//Vi logger brugeren af skype, msn messenger og lukker alle internet explore ned
System.Diagnostics.Process proc1 = new System.Diagnostics.Process();
proc1.EnableRaisingEvents = false;
proc1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc1.StartInfo.FileName = "C:\\sc\\killall.exe";
proc1.StartInfo.Arguments = "iexplore";
proc1.Start();
proc1.WaitForExit();
System.Diagnostics.Process proc2 = new System.Diagnostics.Process();
proc2.EnableRaisingEvents = false;
proc2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc2.StartInfo.FileName = "C:\\sc\\killall.exe";
proc2.StartInfo.Arguments = "skype";
proc2.Start();
proc2.WaitForExit();
System.Diagnostics.Process proc3 = new System.Diagnostics.Process();
proc3.EnableRaisingEvents = false;
proc3.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc3.StartInfo.FileName = "C:\\sc\\killall.exe";
proc3.StartInfo.Arguments = "msnmsgr";
proc3.Start();
proc3.WaitForExit();
System.Diagnostics.Process proc4 = new System.Diagnostics.Process();
proc4.EnableRaisingEvents = false;
proc4.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc4.StartInfo.FileName = "C:\\sc\\killall.exe";
proc4.StartInfo.Arguments = "explorer";
proc4.Start();
proc4.WaitForExit();
System.Diagnostics.Process proc5 = new System.Diagnostics.Process();
proc5.EnableRaisingEvents = false;
proc5.StartInfo.FileName = "c:\\program files\\Internet Explorer\\IEXPLORE.EXE";
proc5.StartInfo.Arguments = "http://www.surf-center.dk/" + getMac();
proc5.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
proc5.Start();
//disable usb-storage
RegistryKey OurKey = Registry.LocalMachine;
OurKey = OurKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\UsbStor", true);
OurKey.SetValue("Start", 4);
OurKey.Close();
//vi nustiller tælleren der holder øje med antalet af disconnect og fortæller programmet at når den modtager et connect skal der åbnes/startes
firstdisconnect = 0;
firstconnect = 1;
}
}
//funktion til at retunere mac-adressen med.
public string getMac()
{
FileStream file = new FileStream("d:\\sc\\mac.txt", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(file);
string mac = sr.ReadLine();
sr.Close();
sr.Dispose();
file.Dispose();
return mac;
}
//start lytte tråden
public void treadfunction()
{
tread Tread;
Tread = new tread();
Tread.run();
}
//starter tråden der fortæller databasen at maskinen stadigvæk er online
public void onlinefunction()
{
onlinetjek oline;
oline = new onlinetjek();
oline.run();
}
}
class tread
{
public void run()
{
SerialPort sp = new SerialPort();
try
{
//åben en forbindelse til com-porten så vi kan læse/skrive til den.
sp.Open();
}
catch (UnauthorizedAccessException)
{
//sikre at programmet ikke dør hvis en tråd ikke har sluppet taget i com-porten
}
try
{
//prøv at skrive til com-porten
sp.ReadTimeout = 100;
sp.WriteLine("test");
//prøv at modtage fra com-porten
string r = sp.ReadLine();
//vi ryder op og lukker forbindelsen til com-porten
sp.Close();
sp.Dispose();
//fortæller hovedprogrammet at der er penge i maskinen
SurfCenter.open = 1;
SurfCenter.open = 1;
//open = 1;
}
catch
{
//ryd op efter os selv og fortæl hovedprogrammet at der ikke er forbindelse til com-porten. dvs. ingen penge indkastet
sp.Close();
sp.Dispose();
SurfCenter.open = 0;
}
}
}
public class onlinetjek
{
public void run()
{
while (true)
{
//sov 2 minuter.
Thread.Sleep(120000);
//hvis der er penge i maskinen
if (SurfCenter.open == 1)
{
//fortæl databasen at vi stadigvæk er online
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "C:\\sc\\stillhere.bat";
proc.Start();
//ProcessStartInfo startInfo = new ProcessStartInfo("C:\\sc\\stillhere.bat");
//startInfo.WindowStyle = ProcessWindowStyle.Hidden;
//Process.Start(startInfo);
}
}
}
}
}
Program.cs
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
using System;
using System.ComponentModel;
using System.Data;
using System.IO.Ports;
using System.Threading;
using System.IO;
using System.Net;
using Microsoft.Win32;
using System.Diagnostics;
namespace SurfCenter
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
// More than one user Service may run within the same process. To add
// another service to this process, change the following line to
// create a second service object. For example,
//
// ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
//
ServicesToRun = new ServiceBase[] { new SurfCenter() };
ServiceBase.Run(ServicesToRun);
}
}
}
Derudover kan det godt passe at jeg ikke kan starte Internet Explorer fra en system service uden at den er minimeret ? - den bliver ikke engang vist på taskbaren
Håber der er nogen der kan hjælpe mig
