C a C++ > Obecné
Služba - logování vyjímek
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(<);
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