C a C++ > Obecné

Služba - logování vyjímek

(1/3) > >>

hlucheucho:
Ahoj,

chtěl jsem si logovat vyjímky které vznikají při běhu služby kvůli diagnostice.

--- Kód: ---void __fastcall TJadro308::ServiceCreate(TObject *Sender)
{
Forms::Application->OnException = LogVyjimky;
}

void __fastcall TJadro308::LogVyjimky(TObject *Sender, Exception *E)
{
FILE *fw;
SYSTEMTIME lt;

fw = _wfopen(ChangeFileExt(Forms::Application->ExeName, ".log").w_str(), L"a");
if (fw != NULL) {
   GetLocalTime(&lt);
   fwprintf(fw, L"%d-%02d-%02d %d:%d:%d %s\r\n", lt.wYear, lt.wMonth, lt.wDay,
lt.wHour, lt.wMinute, lt.wSecond, E->Message.w_str());
   fclose(fw);
}
Forms::Application->Terminate();
}

--- Konec kódu ---

Když dojde k vyjímce, žádný soubor se nevytvoří. zkoušel jsem vytvoření a zápis do souboru při obsluze událostí OnCreate a OnStart, zde práce se souborem fungovala. Stejně tak je výše uvedený kód funkční v běžné "oknové" aplikaci.  Metoda LogVyjímky je private.  C++ Builder XE5, Win 7.

hu

Radek Červinka:
Zkus misto Forms::Application->ExeName pouzit ParamStr(0)

hlucheucho:
Nepomohlo. Dále jsem vyzkoušel metodu LogVyjimky mít Public a instalovat službu z adresáře Program files také bez výsledku  :( Nechápu, proč se v tomto služba chová jinak než aplikace.

hu

pf1957:

--- Citace: hlucheucho  03-09-2014, 10:55:12 ---Nepomohlo. Dále jsem vyzkoušel metodu LogVyjimky mít Public a instalovat službu z adresáře Program files také bez výsledku  :( Nechápu, proč se v tomto služba chová jinak než aplikace.

--- Konce citace ---
1) K pochopeni rozdilu si vytvor nekde na piskovisti prazdnovou novou sluzbu a prazdnou VCL aplikaci: uvidis, ze sluzba zadne Forms a tim i Forms.TApplication nepouziva a ani by nemela - vizualni prvky ve sluzbe nemaji co delat... Sluzba pouziva SvcMgr.TServiceApplication s instanci tamtez a dopln si znalosti

2) Dalsi rozdil je, pod jakym uctem ma byt sluzba spoustena a z toho plynouci prava treba do adresare

3) Na Windows se do Program Files nepise, takze si to logovani nejdriv odlad treba v C:\Temp\muj.log a az ti to bude fungovat, tak res, jak prebrat jmeno sluzby (GetModuleName) apod.



Radek Červinka:

--- Citace: hlucheucho  03-09-2014, 10:55:12 ---Nepomohlo. Dále jsem vyzkoušel metodu LogVyjimky mít Public a instalovat službu z adresáře Program files také bez výsledku  :( Nechápu, proč se v tomto služba chová jinak než aplikace.

hu

--- Konce citace ---

a jen tak pro zajimavost co ti vrati ParamStr(0)?

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi