如果我写一个这样的简单代码:
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)在初始化时会导致错误。
答案 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”,让同一进程中的线程只共享句柄。