WinEvent Logs和QFileSystemWatcher

时间:2015-04-12 20:07:26

标签: windows qt logging qt5 qfilesystemwatcher

我尝试将WinEvent Logs Windows7添加到QFileSystemWatcher。但是,addPath()方法返回false值。

qDebug() << m_watcher->addPath("C:/Windows/System32/winevt/Logs/Application.evtx"); // false

尝试添加winevt文件夹后我得到了同样的结果:

qDebug() << m_watcher->addPath("C:/Windows/System32/winevt"); // false

Winevt文件夹具有只读属性,我无法对其进行修改(更改后,应用,关闭和重新打开属性具有旧保留)。 我在QFileSystemWatcher文档中读到了:

  

手表失败的原因通常与系统有关,但如果平台有一个,则可能包括资源不存在,访问失败或总计数限制。

但我不知道如何找到失败的根源以及如何修复它。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

我相信你在64位操作系统上有文件系统重定向。

有两种方法可以解决这个问题:

1)将您的应用程序构建为64位。 2)通过调用Wow64DisableWow64FsRedirection显式禁用系统重定向。

如果你转到第二个解决方案并需要在Windows XP 32位上运行你的应用程序,我建议你动态调用WinAPI,如下例所示:

#include <qt_windows.h>

#if defined(_WIN32) //Check if program is compiled in 32 bits (64 bits does not have redirection)
    SYSTEM_INFO SystemInfo = {0};
    GetNativeSystemInfo(&SystemInfo);

    if (SystemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //Check if processor is 64 bits
    {
        //Call the Wow64DisableWow64FsRedirection api dynamically
        typedef BOOL(STDAPICALLTYPE *tWow64DisableWow64FsRedirection)(PVOID);
        tWow64DisableWow64FsRedirection pWow64DisableWow64FsRedirection = (tWow64DisableWow64FsRedirection)QLibrary::resolve("Kernel32", "Wow64DisableWow64FsRedirection");
        if (pWow64DisableWow64FsRedirection)
            pWow64DisableWow64FsRedirection(NULL);
    }
#endif

答案 1 :(得分:0)

在另一个论坛上找到解决方案,用户可以在其中提供link

Sysnative文件夹可以访问。

谢谢大家。