[ Aleksandrov @ 15.05.2009. 11:27 ] @
Code:

using System.Diagnostics;
...
  Process prDate = new Process();
  try
     {
      prDate.StartInfo.FileName = "Cmd.exe";
      prDate.StartInfo.Arguments = "/C \"DATE " + NoviDatumVreme.Day + "-" + NoviDatumVreme.Month + "-" + NoviDatumVreme.Year;
      //prDate.StartInfo.CreateNoWindow = true;
      //prDate.StartInfo.UseShellExecute = false;
      prDate.Start();
      .....


Imam ovaj deo koda koji dobro radi kad se ubaci u Windows Console Application medjutim u windows service okruzenju se ne ponasa kako sam zamislio.

Kod je dosta jednostavan i treba da promeni sistemski datum.

Moze li neko da mi objasni gde gresim... :(

2.
Ima li neko iskustva sa debagovanjem windows service aplikacija??? Na koji nacin vi to radite?
[ mmix @ 15.05.2009. 12:30 ] @
Servise bi trebalo da pises tako da su autonomni i da ne zahtevaju nikakve kontakte sa korisnikom, sto u tehnickom smislu znaci zaboravi na GUI i na keybaord/mouse input i sve komponente koje od njega zavise. Konzola je jedna od njih a sa cmd.exe otvaras sistemsku konzolu koja ne moze da funkcionise jer nema gde da ispise izlaz i i nema odakle da uzme ulaz bez obzira na to sto tebi taj ulaz i izlaz ne trebaju. Da promenis sistemsko vreme koristi ovaj code (rasporedi sta gde ide):

Code:

using System.Runtime.InteropServices;

...

// deklaracije
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME 
{
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}

// interop poziv u kernel32
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool SetSystemTime([In] ref SYSTEMTIME myTime );


...

// promena vremena
SYSTEMTIME myTime = new SYSTEMTIME();
myTime.wYear = 2009; 
myTime.wMonth = 5; 
myTime.wDay = 15;
myTime.wHour = 13;
myTime.wMinute = 26;
myTime.wSecond = 00;

SetSystemTime(ref myTime);
[ mmix @ 15.05.2009. 12:36 ] @
E da, za debug


Imas dva nacina

1. Enkapsuliras servis u poseban DLL i posebnu klasu koja ima start/stop metode, sta vec nema i onda napravis konzulnu aplikaciju koja ce da imitira SCM i poziva start/stop itd. Sam servis onda sluzi samo da ucita DLL i da na onstart pozove start, na onstop pozove stop itd. Debugining je onda lak jer debsagujes iz konzolne aplikacije. Naravno u ovom tvom slucaju ne bi pomoglo jer bi tokom debagovanja imao korisnicki kontekst, ovo je vise za debagovanje bugova u tvom kodu.

2. Unutar onStart metoda ubacis Thread.Sleep(15000), to ce ti dati 15 sekundi zadrske nakon pokretanja servisa iz SCMa. U tih 15 sekundi moras da attachujes debuger iz visual studia na proces servisa (posle par puta uspevaces da to uradis za par sekundi). Ne zaboravi da stavis breakpoint na prvu komandu iza sleep i program ce stati posle sleep prosto


[ Aleksandrov @ 15.05.2009. 13:12 ] @
Kako da attachujem debuger na servis proces?

Ovaj kod sto predlazes sam probao ranije i takodje nije radio kao windows service. Medjutim radio je na console application ali se ponasao dosta cudno. Kad mu podesim datum i vreme i debagerom vidim da je za MyTime sve dobro podeseno, nakon izvrsavanja SetSystemTime, dobijem dobro podeseno sve osim broja sati. E sad da bi podesio sistemsko vreme koje zelim, morao sam da dodam:

Code:

NovoVreme.addHours(2);

...
wHour = NovoVreme.hour();
...
SetSystemTime(ref MyTime)


tj. Kad zelim da za Sistemsko vreme postavim NovoVreme, moram da NovoVreme povecam za 2 sata...
Ima li neko objasnjenje za ovo? (vremenska zona mi je podesena na +1 mada verujem da to nema veze...)

Problem sa pozivanjem eksterne aplikacije sam resio tako sto sam za servis podesio Logon na : Logon as local System account i ispod toga sam odabrao Allow service to interract with desktop, a na ovaj nacin sam uspesno promenio i sistemsko vreme :)