在《windows核心编程》或者《windows via C/C++》一书中,提到过查看函数错误的方法,可以在watch窗口中输入"$err,hr",来显示。比如下面一个程序
#include <Windows.h>
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
HANDLE hFile = CreateFile(TEXT("c:\\not_exsit"), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
return 0;
}
当执行完CreateFile时,由于不存在路径"c:\not_exsit",会返回hFile=0,但是有时候需要错误是什么导致的(返回值为0只代表不成功,可能有很多种原因)。要看具体错误是什么,可以调用GetLastError(),该函数返回一个dword数字,代表错误类型。
当在watch窗口中,想查看错误类型数字时,就可以使用 $err这个伪变量。Visual Studio定义了许多伪变量, 比如 $pid表示process id, $clk表示系统时钟等等。有关伪变量的信息可以查看https://learn.microsoft.com/en-us/visualstudio/debugger/pseudovariables?view=vs-2022
那么$err, hr中的hr又表示什么意思呢? hr表示一种格式化显示表示。熟悉使用visual studio的同学在调试查看一个数组时,可以使用“数组指针arr, 10”这样的调试命令,表示查看arr的前10个值。其实visual studio定义了许多种格式化的显示表示方法,具体信息可以查看https://learn.microsoft.com/en-us/visualstudio/debugger/format-specifiers-in-cpp?view=vs-2022。
在这里hr也是一种格式化错误类型的方法,表示用一种易于阅读的方法,来解析错误信息。这样就不会只显示错误2,错误3这样,而是会显示可理解的“找不到指定文件“之类的说明。