CreateEventW意外失败

时间:2014-01-26 08:21:41

标签: c++ winapi

如果我写一个这样的简单代码:

int main(int argc, char* argv[])
{
    HANDLE  hEvent = CreateEventW( NULL, FALSE, FALSE, L"EVENTTEST" );
    if (hEvent==NULL){
            cout<<"Error "<<GetLastError();
    }
    else{
            cout<<"Success";
    }

    getch();
    return 0;
}

代码以成功消息运行但如果我在main上面的一般范围中添加一些声明(这里我只通过声明一个bool变量添加一行代码),函数CreateEvenetW失败,错误代码为998。 如果我使用CreateEvent而不是CreateEventW,则不会出现问题。但我想知道当我添加一个简单的变量声明时,CreateEventW会发生什么:

bool x=true;
int main(int argc, char* argv[])
{
    HANDLE  hEvent = CreateEventW( NULL, FALSE, FALSE, L"EVENTTEST" );
    if (hEvent==NULL){
            cout<<"Error "<<GetLastError();
    }
    else{
            cout<<"Success";
    }

    getch();
    return 0;
}

这些奇怪和意外的错误使我担心使用一些winapi函数。

我应该提一下代码是在Borland c ++ 6中编译的

编辑:如果我在没有初始化的情况下声明变量(如:bool x),则不会发生错误。此问题也只发生在一些数据类型。我检查类型(int,double)和程序运行“成功”消息。但是类型(char,bool)在初始化时会导致错误。

2 个答案:

答案 0 :(得分:2)

在Windows程序中获取错误998表示非常严重问题。当内核本身可以判断进程堆已损坏时,您将获得此信息。当程序未处于无法安全生成AV异常的状态时,最常生成,而不是您为堆损坏而获得的正常访问冲突。当Windows加载程序忙于加载DLL并运行DllMain()入口点时,首先会发生这种情况。调试器显示第一次机会异常通知的几率。希望无论如何。

您当然永远不会使用您发布的代码获得此错误的重现,问题是由其他代码引起的。在DLL(最有可能)内部或在输入main()函数之前运行的初始化代码中。破坏堆当然是标准的C ++问题。您可能会从Application Verifier工具中找到帮助。祝你好运。

答案 1 :(得分:1)

免责声明:这是一个黑暗猜测的镜头。

由于您正在创建命名事件(“EVENTTEST”),因此某些其他进程(可能仍在运行)可能先前已使用不同的权限集创建了该事件。也许有一个实例在带有admin privs的命令shell中运行而失败的实例没有?

换句话说,这是某种带有命名内核句柄的安全/ ACL问题。

另一个猜测:“x = true”行只是红色鲱鱼,问题在某种程度上与时间有关。

您可以查看事件日志(控制面板 - &gt;管理工具 - &gt;事件查看器)。然后检查“Windows Logs”文件夹下的“应用程序”,“系统”和“安全性”日志。它可能会揭示出一些东西......

否则,重启并重试。除非你需要Event句柄来处理不同的进程,否则只需用NULL替换“EVENTTEST”,让同一进程中的线程只共享句柄。