none
How to read the event log files using VC++ RRS feed

  • 问题

  • Hi, I am now working on a project which needs to get specified information in exported windows event log files.

    I want to get all the information from event log, previously I want to use LogParser to convert the event log to .txt files, but I don't know how to transfer the complicated parameters (ShellExecute).

    I install the LogParser 2.2, and its default path is "C:\Program Files(x86)\LogParser", and you should use the following command to convert the EVT files to TXT files:

    LogParser -i:evt -o:nat "select * from c:\sec.evt" > d:sec.txt

    How can I transmit the complicated parameters in the ShellExecute API? I always get errors.

    And I tried to use the Event Log API to realize this target, I failed again...

    Anyone can help me?

    2012年4月13日 19:38

答案

  • 依然不行!已经试过了,窗口一闪而过~

    • 已标记为答案 Helen Zhao 2012年4月23日 2:11
    2012年4月17日 14:36
  • 我的意思是用 system("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe -i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\LogParse.txt");

    这个与把命令写成bat文件执行的效果应该是一样的。

    如果一定要CreateProcess的话,恐怕得重定stdout,那就麻烦多了(不查文档我记不住)。

    • 已建议为答案 Genrge 2012年4月20日 1:36
    • 已标记为答案 Helen Zhao 2012年4月23日 2:11
    2012年4月19日 13:14

全部回复

  • 我想调用外部的一个log分析程序,将EVT分析为TXT文件,其完整的命令是这样的:

    c:\Program Files (x86)\Log Parser 2.2>LogParser.exe -i:evt -o:nat "select * from F:\AppEvtLogBkUp_12_09_2011_09_05_36.evt" > F:\LogParse.txt

    其参数中包括空格,包括路径,包括双引号,我现在要在ShellExecute中调用,该怎么去做?

    #include "stdafx.h"
     #include <Windows.h>
     
    int _tmain(int argc, _TCHAR* argv[])
     {
      LPCSTR exePath = "C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe";
      LPCSTR lpParam = "-i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt";
      ShellExecute(NULL, NULL, exePath, lpParam, NULL, SW_SHOWNORMAL);
      printf("-i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt");
      return 0;
     }
    

    这段程序编译是没有问题的,但LogParser没有成功执行,那个窗口一闪而过,出现了help,也就是说参数传递不正确,在线等解答。

    多谢!


    2012年4月14日 9:25
  • =.= 为什么没人答复啊……我问题太低级了么……
    2012年4月14日 12:23
  • TCHAR szApp[] = _T("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe -i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt");
    STARTUPINFO si = {sizeof(si)};
    PROCESS_INFORMATION pi = {0};
    if(CreateProcess(NULL, szApp, ...,&si, &pi))
    {
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
    }
    else
    {
     DWORD dwRet = GetLastError();
    }
    

    这样试一下。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年4月15日 3:18
    版主
  • 收到,我现在就去试一下:),成功了立刻标记答案,多谢多谢!
    2012年4月15日 8:11
  • 感谢帮助,但还是不成功,命令行提示:

    Error: detected extra argument ">" after query

    #include "stdafx.h"
    #include <Windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TCHAR szApp[] = _T("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe -i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt");
    	STARTUPINFO si = {sizeof(si)};
    	PROCESS_INFORMATION pi = {0};
    	if(CreateProcess(NULL, szApp, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
    	{
    		CloseHandle(pi.hThread);
    		CloseHandle(pi.hProcess);
    	}
    	else
    	{
    		DWORD dwRet = GetLastError();
    	}
    }

    2012年4月15日 8:16
  • 我想调用外部的一个log分析程序,将EVT分析为TXT文件,其完整的命令是这样的:

    c:\Program Files (x86)\Log Parser 2.2>LogParser.exe -i:evt -o:nat "select * from F:\AppEvtLogBkUp_12_09_2011_09_05_36.evt" > F:\LogParse.txt

    1.  这个命令式正确的吗,它的提示似乎在说SQL查询语句有问题哦?

    2.  转译后的字符串的格式确定是这样的吗,要不把\"改成'试一下吧?

    2012年4月16日 2:10
  •  TCHAR szApp[] = _T("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe ");

    TCHAR szParam[] = _T("-i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt");

    STARTUPINFO si
    = {sizeof(si)};

    PROCESS_INFORMATION pi = {0};
    if(CreateProcess(NULL, szApp, szParam, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
    {
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    }

    2012年4月16日 2:19
  • 这个命令的格式是绝对正确的:

    另外,我试了你的建议,即把\"改成',结果还是不对,代码见下:

    // LogParser_Analysis.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TCHAR szApp[] = _T("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe ");
    
    	TCHAR szParam[] = _T("-i:evt -o:nat 'select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt' > F:\\log2.txt");
    
    	STARTUPINFO si = {sizeof(si)};
    
    	PROCESS_INFORMATION pi = {0};
    	if(CreateProcess(szApp, szParam, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
    	{
    		CloseHandle(pi.hThread);
    		CloseHandle(pi.hProcess);
    	}
    }
    
    

    2012年4月16日 17:11
  • 感谢你的回复,但结果还是不对,和前一个代码运行的结果一样:

    代码如下:

    // LogParser_Analysis.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	TCHAR szApp[] = _T("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe ");
    	TCHAR szParam[] = _T("-i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\log2.txt");
    
    	STARTUPINFO si = {sizeof(si)};
    	PROCESS_INFORMATION pi = {0};
    
    	if(CreateProcess(szApp, szParam, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
    	{
    		CloseHandle(pi.hThread);
    		CloseHandle(pi.hProcess);
    	}
    }
    
    

    2012年4月16日 17:13
  •     STARTUPINFO si = {sizeof(si)};
        CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
        SHELLEXECUTEINFO ShExecInfo = {0};
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = exePath;
        ShExecInfo.lpParameters = lpParam;
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_SHOW;
        ShExecInfo.hInstApp = NULL;
        ShellExecuteEx(&ShExecInfo);
        DWORD dw = GetLastError();
        WaitForSingleObject(ShExecInfo.hProcess,INFINITE);

    这个应该好用

    2012年4月17日 3:30
  • 依然不行!已经试过了,窗口一闪而过~

    • 已标记为答案 Helen Zhao 2012年4月23日 2:11
    2012年4月17日 14:36
  • GetLastError返回什么错误
    2012年4月18日 1:18
  • 我的理解是CreateProcess不认得IO重定向符号>,而把它当作参数了。

    不知道用老办法system函数如何呢?

    2012年4月19日 6:25
  • 没有Error,因为命令是成功执行的,只是参数不对~只要调用外部程序出现了帮助之类的信息,那就说明参数传递有问题,没有error的~

    2012年4月19日 11:00
  • 这位仁兄可否给个代码?
    2012年4月19日 11:00
  • 我的意思是用 system("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe -i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\LogParse.txt");

    这个与把命令写成bat文件执行的效果应该是一样的。

    如果一定要CreateProcess的话,恐怕得重定stdout,那就麻烦多了(不查文档我记不住)。

    • 已建议为答案 Genrge 2012年4月20日 1:36
    • 已标记为答案 Helen Zhao 2012年4月23日 2:11
    2012年4月19日 13:14
  • 我的意思是用 system("C:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe -i:evt -o:nat \"select * from F:\\AppEvtLogBkUp_12_09_2011_09_05_36.evt\" > F:\\LogParse.txt");

    这个与把命令写成bat文件执行的效果应该是一样的。

    如果一定要CreateProcess的话,恐怕得重定stdout,那就麻烦多了(不查文档我记不住)。

    空格怎么处理?这个方法我试过。

    2012年4月20日 15:53