如果我写这样一个简单的代码:
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/