Как получить нужное мне описание ошибки EventViewer
От: grebenyk  
Дата: 25.02.09 11:00
Оценка:
Здравствуйте ,
Сталкнулся с проблемой создания EventViewer .
Пользуясь примером из MSDN (http://msdn.microsoft.com/en-us/library/bb427356(VS.85).aspx)
я написал свой, но единственное что стало камнем преткновения -это вывод сообщений ,
которые отвечали той или иной ошибке.
Попробовав
FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_FROM_SYSTEM,
ghResDll, // Handle to the DLL file
pevlr->EventID, // Event message identifier
MAKELANGID(LANG_RUSSIAN, SUBLANG_ENGLISH_US),
(LPTSTR) &lpMsgBuf1, // Buffer that contains message
BUFFER_SIZE, // Size of buffer
NULL);
положительных результатов не принесло , я подключал ( ghResDll) dll из разных мест и els.dll msi.dll и dll относящиеся к объекту ,вызвавшему событие, взятый из реестра (EventMessagFile)
Есть скажем ошибка 6008- "предыдущее завершение работы системы в __ __ было нежиданным"
А выводится либо ничего либо "служба запущена"
Так все таки, может это не тот путь? Надо как-то, что-то другое задействовать?
Как получить нужное мне описание ошибки?
Буду признателен за ответ
--
С уважением, Алексей.
Re: Как получить нужное мне описание ошибки EventViewer
От: SergioR Российская Империя  
Дата: 25.02.09 12:23
Оценка:
Здравствуйте, grebenyk, Вы писали:

G>Так все таки, может это не тот путь? Надо как-то, что-то другое задействовать?

G>Как получить нужное мне описание ошибки?

G>С уважением, Алексей.


Какой код ошибки возвращается ? в msi.dll только коды ошибок для инсталлера, в els.dll — строки для окошка MS EventViewer'а.

Будет лучше грузить именно те длл, в которых и описывается данный код ошибки:
http://www.codeproject.com/KB/trace/messagetextlog.aspx
Re: Как получить нужное мне описание ошибки EventViewer
От: grebenyk  
Дата: 25.02.09 14:40
Оценка:
Обсолютно с Вами согласен я именно их и подключаю,( спасибо это предало уверенности мне в том что я делаю), но результат остается тем же, я думаю, может вместо FormatMessag надо что другое применить или вообще какую другую функцию
Re: Как получить нужное мне описание ошибки EventViewer
От: grebenyk  
Дата: 26.02.09 05:08
Оценка:
вот примерно мой код
stek.clear();

Memo1->Clear();
Memo2->Clear();
if( OpenDialog1->Execute())
{ Form1->Caption=OpenDialog1->FileName;
HANDLE h;

EVENTLOGRECORD *pevlr;
BYTE bBuffer[BUFFER_SIZE];
//char lpMsgBuf1[BUFFER_SIZE];
// LPVOID lpMsgBuf1[BUFFER_SIZE];

DWORD dwRead, dwNeeded, cRecords, dwThisRecord;
char LogName[15]; //els.dll");// SYSTEM32\\

// Application->MessageBoxA("2","ерор");


TDateTime t1,t2,t3;
t1=StrToDateTime("01.01.1970 00:00:00");
double con=3600*24;

strcpy(LogName, (OpenDialog1->FileName). c_str());
try{
h=OpenBackupEventLog(NULL,LogName);
}
catch ( ... )
{
}


if (h == NULL)
{
Application->MessageBoxA("Неудачное подключение файла *.evt","ерор");

}
else
{
pevlr = (EVENTLOGRECORD *) &bBuffer;
GetOldestEventLogRecord(h, &dwThisRecord);
int i=0;
while (
ReadEventLog(h, // event log handle
EVENTLOG_FORWARDS_READ | // reads forward
EVENTLOG_SEQUENTIAL_READ, // sequential read
0, // ignored for sequential reads
pevlr, // pointer to buffer
BUFFER_SIZE, // size of buffer
&dwRead, // number of bytes read
&dwNeeded)) // bytes in next record
{

while (dwRead > 0)
{ i++;
t2=double(pevlr->TimeWritten)/con;
t3=t1+t2;

_Data D;
LPCTSTR lpSourceName;
wchar_t *sourceName=L"MsiInstaller";
D.DT=t3;
// PChar(FCurrentRecord) + PEventLogRecord(FCurrentRecord)^.StringOffset;
D.str=(LPSTR) ((LPBYTE) pevlr + sizeof(EVENTLOGRECORD));
D.type_error=pevlr->EventType;
D.EvID=pevlr->EventID;// & 0xFFFF;
D.str_messag="не найдено";


{

va_list *Arguments;
CHAR lpMsgBuf1[BUFFER_SIZE];
CHAR* Args;

// /*зона повышенного риска

AnsiString aaaa=dll_point(0,D.str);
//Application->MessageBoxA(aaaa.c_str(),"");
HANDLE ghResDll=LoadLibrary(aaaa.c_str());//"C:\\windows\\System32\\netevent.dll");
if(!ghResDll)
{ AnsiString ss="Неудачное подключение файла dll"+aaaa+"\n "+D.str ;
//Application->MessageBoxA(ss.c_str(),"ерор");
}
else
{
FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE
|FORMAT_MESSAGE_FROM_SYSTEM
// |FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_ARGUMENT_ARRAY,

/*
FORMAT_MESSAGE_FROM_HMODULE
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ARGUMENT_ARRAY
,*/
(LPCVOID)ghResDll,
pevlr->EventID,
MAKELANGID(LANG_RUSSIAN,SUBLANG_ENGLISH_US ),
(LPTSTR) &lpMsgBuf1,
sizeof(lpMsgBuf1),
NULL);
D.str_messag= (LPTSTR) lpMsgBuf1;

}


FreeLibrary(ghResDll);

}
stek.push_back(D);

dwRead -= pevlr->Length;
pevlr = (EVENTLOGRECORD *)((LPBYTE) pevlr + pevlr->Length);
}
Label5->Caption="Колличество событий:"+IntToStr(i) ;
pevlr = (EVENTLOGRECORD *) &bBuffer;

}

CloseEventLog(h);


}
}



а это я цепляю dll

AnsiString dll_point(bool flag,AnsiString name_res)

{ TRegistry *reg = new(TRegistry);
AnsiString str_;
try
{

reg->RootKey = HKEY_LOCAL_MACHINE;


str_="System\\CurrentControlSet\\Services\\EventLog\\System\\" + name_res;
char wd[15];
GetWindowsDirectory(wd,15);


reg->OpenKey(str_.c_str(),false);//)


AnsiString str1=wd;


str_=reg->ReadString("EventMessageFile") ;
int kk=str_.Pos(";");
if(str_.Pos(";")!=0)
str_=str_.SubString(0,str_.Pos(";")-1);

str_=wd+str_.SubString(13,str_.Length()-12);
//Application->MessageBoxA(str_.c_str(),"");


}
catch ( ... )
{
Application->MessageBoxA("","");
}
reg->Free();
// delete reg;
return str_;

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.