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

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)在初始化时会导致错误。

最佳答案

Windows程序中出现错误998表示一个非常严重的问题。当内核本身可以告诉进程堆已损坏时,您将获得此信息。当程序处于无法安全生成AV异常的状态时,通常会生成它,而不是堆损坏时会遇到的正常访问冲突。当Windows加载程序正忙于加载DLL并运行DllMain()入口点时,这种情况首先发生。调试器显示优先机会异常通知的一些可能性。希望无论如何。

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

关于c++ - CreateEventW意外失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21361275/

10-11 15:56