今天在使用RegCreateKey这个函数的时候遇到一个问题,RegCreateKey函数运行失败,但是GetLastError的返回值为0
代码如下:
HKEY hKey =NULL;
CString strError ;
LONG errorNum = RegCreateKey(HKEY_LOCAL_MACHINE,
_T("Software\\http://www.helloworld.com\\newCreate"),
&hKey) ;
if (errorNum != ERROR_SUCCESS)
{
DWORD dwErrorNum = ::GetLastError() ;
strError.Format(_T("GetLastError()获取的错误码为:%d\nRegCreateKey调用失败,错误码为:%d"),
dwErrorNum, errorNum) ;
MessageBox(strError, _T("提示"), MB_OK) ;
return ;
}
结果如下:
经过向猪头三老师请教,才慢慢有所开悟,呵呵...
函数返回值用来判断函数成功或者失败,根据RegCreateKey函数msdn文档可知根据它的返回值来判断它的成败。返回值为ERROR_SUCCESS就成功,返回其它非零值就失败,失败的话,返回值就是相应错误码。到这里根据msdn的解释可以写代码为:
if (errorNum != ERROR_SUCCESS)
{
FormatMessage(...);
}
关于GetLastError为什么返回0,推测是和相应函数的内部代码有关。看了GetLastError的msdn文档,并没有说如果返回0就代表函数成功。我觉得GetLastError是用来获得相应函数的扩展错误信息的,如果为0,只是表示它没有其它错误信息。之前我总是有这样的概念,使用GetLastError来判断函数是否成功。但是判断函数是否成功还是应该以msdn文档为准。很多函数的说明中,都有这样一句:If the function fails, the return value is zero. To get extended error information, call GetLastError.而RegCreateKey中不是这样写的。
if (errorNum != ERROR_SUCCESS)
{
FormatMessage(...);
}
关于GetLastError为什么返回0,推测是和相应函数的内部代码有关。看了GetLastError的msdn文档,并没有说如果返回0就代表函数成功。我觉得GetLastError是用来获得相应函数的扩展错误信息的,如果为0,只是表示它没有其它错误信息。之前我总是有这样的概念,使用GetLastError来判断函数是否成功。但是判断函数是否成功还是应该以msdn文档为准。很多函数的说明中,都有这样一句:If the function fails, the return value is zero. To get extended error information, call GetLastError.而RegCreateKey中不是这样写的。