2013-09-04 2 views
-5

컴파일러 오류 _T 식별자를 찾을 수 없습니다. 친절하게도이 오류를 해결하는 데 도움이 ?? 또한 나는 C 에서이 프로그램을 만들고 싶어 ?? 하지만 먼저 디버그하고 흐름을 볼 수 있도록 오류를 해결 ??evtx 파일을 읽는 중 컴파일러 오류가 발생 했습니까?

VS 2008에 _T 매크로 Tchar.h에 정의되어
#include <iostream> 
#include <fstream> 
using namespace std; 

typedef unsigned long ULONG; 

typedef struct _EVENTLOGHEADER { 
ULONG HeaderSize; 
ULONG Signature; 
ULONG MajorVersion; 
ULONG MinorVersion; 
ULONG StartOffset; 
ULONG EndOffset; 
ULONG CurrentRecordNumber; 
ULONG OldestRecordNumber; 
ULONG MaxSize; 
ULONG Flags; 
ULONG Retention; 
ULONG EndHeaderSize; 
} EVENTLOGHEADER, *PEVENTLOGHEADER; 

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef struct _EVENTLOGRECORD { 
    DWORD Length; 
    DWORD Reserved; 
    DWORD RecordNumber; 
    DWORD TimeGenerated; 
    DWORD TimeWritten; 
    DWORD EventID; 
    WORD EventType; 
    WORD NumStrings; 
    WORD EventCategory; 
    WORD ReservedFlags; 
    DWORD ClosingRecordNumber; 
    DWORD StringOffset; 
    DWORD UserSidLength; 
    DWORD UserSidOffset; 
    DWORD DataLength; 
    DWORD DataOffset; 
} EVENTLOGRECORD, *PEVENTLOGRECORD; 

void main() 
{ 
    ifstream file; 
    file.open("C:\Windows\System32\winevt\Logs\\Application.evtx",ios::in|ios::binary); 

    if(file.is_open()){ 
     _EVENTLOGHEADER logheader; 
     _EVENTLOGRECORD logRecord; 

     //Reading the header 
     file.read((char*)&logheader,sizeof(_EVENTLOGHEADER)); 

     int startOfLog; 
     //Loop on every record 
     for(unsigned int numberFile=0;numberFile < logheader.CurrentRecordNumber -1;numberFile++){ 
      //Save the position 
      startOfLog = file.tellg(); 
      //Read log record 
      file.read((char*)&logRecord,sizeof(_EVENTLOGRECORD)); 

      /******************************************************* 
      Here are the other information (section 'Remarks' on the 'EVENTLOGRECORD structure' link 
      ********************************************************/ 

      //Reading sourcename 
      wchar_t buffData; 
      wstring SourceName; 
      file.read((char*)&buffData,sizeof(wchar_t)); 
      while(buffData!=_T('\0')){ 
       SourceName.push_back(buffData); 
       file.read((char*)&buffData,sizeof(wchar_t)); 
      } 

      //Reading computer name 
      wstring ComputerName; 
      file.read((char*)&buffData,sizeof(wchar_t)); 
      while(buffData!=_T('\0')){ 
       ComputerName.push_back(buffData); 
       file.read((char*)&buffData,sizeof(wchar_t)); 
      } 

      //Sets the position to the SID offset 
      int readCursor = startOfLog + logRecord.UserSidOffset; 
      file.seekg(readCursor); 

      char * userSid = NULL; 
      if(logRecord.UserSidLength != 0) 
      { 
       userSid = (PCHAR)malloc(logRecord.UserSidLength); 
       file.read(userSid,logRecord.UserSidLength); //Reading the sid 
       //Here you can work on the SiD (but you need win32 API).If you need it, I could show you how i deal with this sid 
       free(userSid); 
      } 

      //Sets the position to the Strings offset 
      readCursor = startOfLog + logRecord.StringOffset; 
      file.seekg(readCursor); 
      wstring buffString; 
      vector<wstring> allStrings; 
      //Reading all the strings 
      for(int i=0; i< logRecord.NumStrings; i++) { 
       file.read((char*)&buffData,sizeof(wchar_t)); 
       while(buffData!=_T('\0')){ 
        buffString.push_back(buffData); 
        file.read((char*)&buffData,sizeof(wchar_t)); 
       } 
       allStrings.push_back(buffString); 
       buffString.clear(); 
      } 

      //Sets the position to the Data offset 
      readCursor = startOfLog + logRecord.DataOffset; 
      file.seekg(readCursor); 
      unsigned char *Data = (unsigned char *)malloc(logRecord.DataLength*sizeof(unsigned char)); 
      file.read((char*)Data,logRecord.DataLength); //Lecture des données 

      //Sets the position to the end of log offset 
      readCursor = startOfLog + logRecord.Length - sizeof(DWORD) ; 
      file.seekg(readCursor); 
      DWORD length; 
      file.read((char*)&length,sizeof(DWORD)); 

      //Do what you want with the log record 

      //Clean before reading next log 
      ComputerName.clear(); 
      SourceName.clear(); 
      allStrings.clear(); 
      free(Data); 
    } 
} 
} 
+0

C에서 완전히 다시 작성하지 않고서는 불가능합니다. –

+0

사용중인 컴파일러와 환경을 지정해야합니다. –

+0

C @ g-makulik에서 쓰는 방법. 실제로는 C 만 사용하여 evtx 파일을 읽으려고합니다. – user2746446

답변

1

그것을 컴파일 그래서 당신은 단지 그 헤더를 포함해야 할 것으로 보인다.

즉, ANSI와 유니 코드 모두에 대해 컴파일러가 될 수있는 코드를 작성하는 것 같지 않으므로 TCHAR을 사용하지 않고 넓은 문자 앞에 L을 붙이는 것이 더 합리적입니다. 따라서 _T('\0')을 작성하는 대신 L'\0'이라고 쓰거나 심지어는 이전 버전 인 0으로 작성하십시오.

+0

쓰기 만 했는데도 컴파일되지 않았다. – user2746446

+0

전체 프로그램을 디버그 하시겠습니까? 나는 당신이 물어 본 질문에 대답했다고 생각합니다. –

+0

True..thanks..i 실제로 벡터 헤더 파일이 누락되었습니다. Davisd ... C로 변환하고 싶습니다. 의사 코드/단계를 수행 할 수 있습니까? – user2746446

4

_T는 넓은 문자 상수/문자열 리터럴 중 하나 문자 좁은 문자 상수/문자열, 또는를 지정 프로젝트 설정에 따라의 Windows 특정 수단이다. 코드에 존재하지 않는 적절한 #include 지시문이 필요합니다. 컴파일러 정의 매크로가 아닙니다.

그러나 필요하지 않습니다. while(buffData!=_T('\0'))에서 사용 중이지만 buffData 유형이 wchar_t이며 프로젝트 설정과 무관합니다. 이 경우 넓은 문자 상수 인 L'\0' 만 사용하십시오.

+0

잘 말씀해 주셔서 감사하지만이 코드는 실수로 오밍 된 후 오히려 혼란 스럽습니다. 헤더 파일 windows.h도 포함되어 있지만 더 많은 오류가 있습니다. – user2746446

관련 문제