【发布时间】:2016-01-08 18:20:12
【问题描述】:
如果我这样写一个简单的代码:
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) 在初始化时会导致错误。
【问题讨论】:
-
返回值记录在here,但998不在其中(998是ERROR_NOACCESS)。尽管仅仅因为
bool x = true而使函数的行为有所不同,这听起来更像是 2002 年的编译器的问题 en.wikipedia.org/wiki/C%2B%2BBuilder -
@herohuyongtao 我渴望知道这与使用硬 Unicode 名称直接调用
CreateEvent的 Unicode 版本有什么关系。请告诉PLZ。 -
GetLastError 返回 998,从这里 msdn.microsoft.com/en-us/library/windows/desktop/… 你可以看到它说:对内存位置的访问无效。
-
您应该将
GetLastError()的值放入一个局部变量中,然后输出:DWORD e = GetLastError(); cout << "Error " << e << endl;。如果您不这样做,可能会在调用GetLastError()之前运行代码,从而覆盖您的实际错误代码。 -
@user2808671 - 很抱歉看到您遇到问题。我知道您提供的代码片段没有任何内容可能导致 CreateEvent 像那样失败。我怀疑是 Borland 工具,但我不能肯定。 Visual C++ 和 Visual Studio 可免费下载。